react-redux

146 阅读1分钟

index.js

import store from './store';
import { Provider } from './react-redux';
ReactDOM.render(
    <Provider store={store}>
        <Counter1 />
        <Counter2 />
    </Provider>, document.getElementById('root'));

store/index.js

  • 容器盒子
import { createStore, applyMiddleware } from '../redux';
import combinedReducer from './reducers';
import logger from './redux-logger';
import thunk from './redux-thunk';
import promise from './redux-promise';
let store = applyMiddleware(thunk, promise, logger)(createStore)(combinedReducer);

合并reducers

  • reducers/index.js
import { combineReducers } from '../../redux';
import counter1 from './counter1';
let reducers = {
    counter1,//每个reducer都有自己的状态,都有自己的能响应的动作,
}
//combineReducers可以把多个reducer 函数组件的对象合并成一个reducer,
//合成之后会返回一个总的reducer,总的reducer里面会包含一个整的state
let combinedReducer = combineReducers(reducers);
export default combinedReducer;

//合并后的状态和reducers样子差不多
/* let combinedState = {
    counter1: { number: 0 },
} */

单独的reducers

  • reducers/counter1.js
import * as actionTypes from '../action-types';
function add2(amount) {
    return { type: actionTypes.ADD2, payload: { amount } };
}
function minus2() {
    return { type: actionTypes.MINUS2 };
}
const actionCreators = { add2, minus2 };
export default actionCreators;

action-type.js

  • 动作定义器
export const ADD1 = 'ADD1';

actionCreators/counter1.js

  • 动作创建器
  • 在组件中触发
import * as actionTypes from '../action-types';
function add2(amount) {
    return { type: actionTypes.ADD2, payload: { amount } };
}
function minus2() {
    return { type: actionTypes.MINUS2 };
}
const actionCreators = { add2, minus2 };
export default actionCreators;

在类组将中使用

import React from 'react';
import actionCreators from '../store/actionCreators/counter1';
import { connect } from '../react-redux';
class ClassCounter extends React.Component {
    render() {
        return (
            <div>
                <p>{this.props.number}</p>
                <button onClick={() => this.props.add2(5)}>+</button>
                <button onClick={this.props.minus2}>-</button>
            </div >
        )
    }
}
//把仓库中的状态映射为此组件的属性对象
const mapStateToProps = (state) => state.counter1;//{number:0}
export default connect(mapStateToProps, actionCreators)(ClassCounter);

在函数组将中使用

import React from 'react'
import {useSelector, useDispatch} from '../react-redux';
import actionCreators from '../store/actionCreators/counter1';

function Counter1() {
    //useSelector 替换是connect mapStateToProps
    let {number} = useSelector(state => state.counter1);
    let dispatch = useDispatch();//store.dispatch
    const {add1, minus1, thunkAdd} = actionCreators
    return (
        <div>
            <p>{number}</p>
            <button onClick={() => dispatch(add2())}>+</button>
            <button onClick={() => dispatch(minus2())}>-</button>
        </div>
    )
}

export default Counter1;