react-redux

96 阅读2分钟
  • react-redux
  • 1、安装 yarn add react-redux
  • 2、import {Provider, connect} from 'react-redux'
  • Provider:组件
  • connect:高阶组件
  • 3、把所有的组件都嵌入到Provider组件中
  • =>Provider组件中只能有一个子元素
  • =>需要把之前创建的store容器作为属性传递给Provider组件
  • 4、在每一个子组件中,需要做一些特殊处理
  • 只要REDUX容器中的状态改变,就会重新获取最新的状态值(把值传递给组件的属性),并且重新渲染组件(REACT-REDUX完成)

store/index.js

import {
    createStore
} from 'redux';
import {
    cloneDeep
} from '../assets/utils';

let initial = {
    supNum: 20,
    oppNum: 10
};
const reducer = function reducer(state = initial, action) {
    state = cloneDeep(state);
    switch (action.type) {
        case 'VOTE_SUP':
            state.supNum++;
            break;
        case 'VOTE_OPP':
            state.oppNum++;
            break;
    }
    return state;
};

const store = createStore(reducer);
export default store;

\

提供Provider 把store放在上下文中

\

\

import { useContext, useEffect, useState } from 'react';

import ThemeContext from "./context";

\

\

\

connect

  • connect(mapStateToProps, mapDispatchToProps)(Result);
    • 第一个括号中传递两个函数
    • mapStateToProps:这个方法完成的事情是把REDUX中管理的状态做为属性传递给组件
    • mapDispatchToProps:这个方法完成的事情是把REDUX中的DISPATCH作为属性传递给组件
    • =>以后在组件中想要用到REDUX中的状态或者DISPATCH方法,直接通过本身的属性PROPS获取即可(不用自己去操作REDUX)
    • 最后一个括号中传递的是子组件名称
    • 子组件做的一些特殊处理
    • 1、导入 react-redux
    • 2、现在导出的不在是子组件了,而是通过connect返回的高阶组件
    • 3、之前在子组件中做的一些事情:
    • ->获取容器中的状态赋值给组件的状态
    • ->在第一次挂载完成后,向REDUX事件池中追加方法,等任务派发完成,容器状态改变,我们改变子组件状态,完成页面重新的渲染
    • ...
    • 这些事情,REACT-REDUX帮我们完成了(不需要自己写)
    • 4、执行connect做一些配置

import { connect } from 'react-redux';

// 迭代redux中的公共状态信息,并且做为属性传递给Vote组件
const mapStateToProps = state => {
    // state:redux容器中的状态
    // 返回的对象中包含了:想基于属性传递给Vote的公共状态信息
    return {
        supNum: state.supNum,
        oppNum: state.oppNum
    };
};
// 把需要基于disptach派发的任务,基于属性传递给Vote
const mapDispatchToProps = dispatch => {
    // dispatch:store.dispatch
    return {
        support() {
            dispatch({
                type: "VOTE_SUP"
            });
        }
    };
};
export default connect(mapStateToProps, mapDispatchToProps)(Vote);

使用中间件 redux-logger