美文网首页
React Redux DEMO

React Redux DEMO

作者: wuyuan0127 | 来源:发表于2022-01-01 20:28 被阅读0次

Redux Flow pic:

项目结构图: 

安装 Redux:


npm install redux

npm install react-redux

npm install redux-thunk

create-react-app --version = 3.3.0

constant.js

export const Increment="Increment";

export const Decrement="Decrement";

actions:

import {Increment,Decrement} from "../constant"

//export const IncrementAction = (count) => ({type:Increment,count:count})

//export const IncrementAction = (count) => {

    //console.log('IncrementAction...',count);

   // return {type:Increment,count:count};

//}

--------- op 是一个函数 op() 调用就可以获取 store中的 state 对象

参考用法:https://github.com/wuyuan2009123/react-redux-example

 和下图的 mapStateToProps 参数的 state 是一样的输出

export const IncrementAction = count => (dispatch, op) => {

    console.log('IncrementAction...',count,'result',op());

    return {type:Increment,count:count};

  }

export const DecrementAction = (count) => ({type:Decrement,count:count})

reducer:

import {Increment,Decrement} from "../constant"

const initialState= {

    count:0,

};

export default function reducer(state = initialState, action) {

    switch (action.type) {

        case Increment:

            var oldstate = JSON.parse(JSON.stringify(state));

            console.log('old',oldstate);

            var newdata = {...state, count: state.count + action.count*1}

            console.log('newdata',newdata);

            return newdata;

        case Decrement:

            newdata = {...state, count: state.count - action.count*1}

            return newdata;

        default:

            return state;

    }

}

store:

import {createStore,applyMiddleware,combineReducers,compose} from 'redux'

import reducer  from './reducers/count'

import thunk from 'redux-thunk';

const composeEnhancers =

  typeof window === 'object' &&

  window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ ?  

    window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({

      // Specify extension’s options like name, actionsBlacklist, actionsCreators, serialize...

    }) : compose;

    const enhancer = composeEnhancers(

        applyMiddleware(thunk),

        // other store enhancers if any

      );

const storeTree = combineReducers({

    countReduce:reducer,

})

export default createStore(storeTree

    ,

    enhancer

    );

index.js :

import React from 'react';

import ReactDOM from 'react-dom';

import App from './App';

import { Provider } from 'react-redux';

import store from './store/store'

ReactDOM.render(

  <Provider store={store}>

    <App />

  </Provider>,

  document.getElementById('root')

);

App.js:

import React, { Component } from 'react'

import Header from './compoments/Header'

import Count from './compoments/Count'

export default class App extends Component {

  render() {

    return (

      <div>

        ................

        <Header />

        <hr/>

        <Count />

      </div>

    )

  }

}

Count 和 CountUI 组件: 

import React, { Component } from 'react'

import { IncrementAction,DecrementAction } from '../../store/actions/count';

import { connect } from 'react-redux';

class CountUI extends Component {

    inc = () => {

        console.log('CountUI inc',this.props);

        this.props.add(1);

    }

    decr = () => {

        this.props.jian(1);

    }

    render() {

        return (

            <div>

                求和为:{this.props.cc}<br />

                <button onClick={this.inc} >加</button>

                <button onClick={this.decr}>减</button>

            </div>

        )

    }

}

---------------------------------------测试用--------------------

const mapDispatchToProps = (dispatch, ownProps) => {

    return {

        add: (cn) => {

            console.log('mapDispatchToProps[ownProps]:', ownProps);

            dispatch(IncrementAction(cn))},

        jian:(cn) => dispatch(DecrementAction(cn))

    }

}

---------------------------------------测试用--------------------

const Count =  connect(

    state => {

        console.log('connect...',state);

        return {cc:state.countReduce.count}

        },

    {

        add:IncrementAction,

        jian:DecrementAction,

    }

)(CountUI);

export default Count

Header 组件: 

import React, { Component } from 'react'

export default class Header extends Component {

    render() {

        return (

            <div>

                Header

            </div>

        )

    }

}

package.json: 

{

  "name": "redux01",

  "version": "0.1.0",

  "private": true,

  "dependencies": {

    "@testing-library/jest-dom": "^5.14.1",

    "@testing-library/react": "^12.0.0",

    "@testing-library/user-event": "^13.2.1",

    "react": "^17.0.2",

    "react-dom": "^17.0.2",

    "react-redux": "^7.2.6",

    "react-scripts": "5.0.0",

    "redux-thunk": "^2.4.1",

    "web-vitals": "^2.1.0"

  },

  "scripts": {

    "start": "react-scripts start",

    "build": "react-scripts build",

    "test": "react-scripts test",

    "eject": "react-scripts eject"

  },

  "eslintConfig": {

    "extends": [

      "react-app",

      "react-app/jest"

    ]

  },

  "browserslist": {

    "production": [

      ">0.2%",

      "not dead",

      "not op_mini all"

    ],

    "development": [

      "last 1 chrome version",

      "last 1 firefox version",

      "last 1 safari version"

    ]

  }

}

相关文章

网友评论

      本文标题:React Redux DEMO

      本文链接:https://www.haomeiwen.com/subject/mmkaqrtx.html