react-redux的原理,react-redux的使用

1.react-redux的原理

// react-redux/context.js

import { createContext } from "react";

const StoreContext = createContext(null);

export { StoreContext };
// react-redux/connect.js

import React, { Component } from "react";
import { StoreContext } from "./context";

// connect函数返回一个函数
function connect(mapStateToProps, mapDispatchToProps) {
  // 返回的函数是个高阶组件
  return function (WrapComponent) {
    class EhanceComponent extends Component {
      constructor(props, context) {
        super(props, context);
        this.state = {
          storeContext: mapStateToProps(context.getState()),
        };
      }

      componentDidMount() {
        // 监听store的变化,更新state,渲染页面
        this.unsubscribe = this.context.subscribe(() => {
          this.setState({
            storeContext: mapStateToProps(this.context.getState()),
          });
        });
      }

      // 组件卸载去除监听
      componentWillUnmount() {
        this.unsubscribe();
      }

      render() {
        return (
          <WrapComponent
            {...this.props}
            {...mapStateToProps(this.context.getState())}
            {...mapDispatchToProps(this.context.dispatch)}
          />
        );
      }
    }

    EhanceComponent.contextType = StoreContext; //设置上下文context

    return EhanceComponent;
  };
}

export { connect };

2.react-redux的使用

// App.js

import "./App.less";
import Contxt from "./test/context";
import TState from "./test/state";
import TShouldUpdate from "./test/shouldUpdate";
import TRef from "./test/ref";
import TStyled from "./test/styled";
import TClass from "./test/classnames";
import TAntd from "./test/antd";
import TRtredux from "./test/rtredux";
import TThunk from "./test/thunk";
import TSaga from "./test/saga";
import store from "./test/store";
import { Provider } from "react-redux"; // 引入Provider,设置store进行传递

function App() {
  return (
    <Provider store={store} className="App">
      <Contxt></Contxt>
      <TState></TState>
      <TShouldUpdate></TShouldUpdate>
      <TRef />
      <TStyled />
      <TClass />
      <TAntd />
      <TRtredux />
      <TThunk />
      <TSaga />
    </Provider>
  );
}

export default App;
// react-redux的使用页面

import React, { Component } from "react";
import { connect } from "react-redux";
import { countAction } from "./store/count";
import { Button } from "antd";

export class TRtredux extends Component {
  render() {
    return (
      <>
        <hr />
        <h3>自定义react-redux</h3>
        <p>{this.props.count}</p>
        <Button type="ghost" onClick={() => this.props.changeCount(5)}>
          操作redux
        </Button>
      </>
    );
  }
}

const mapStateToProps = (state) => ({
  count: state.countInfo.count,
});

const mapDispatchToProps = (dispatch) => ({
  changeCount(num) {
    dispatch(countAction.changeMore(num));
  },
});

export default connect(mapStateToProps, mapDispatchToProps)(TRtredux);
// store/count/index.js

import countReducer from "./reducer";
import * as countAction from "./action";
import * as countConst from "./constant";

export { countReducer, countAction, countConst };


// store/count/constant.js

export const CHANGENUMBER= "CHANGENUMBER";


// store/count/action.js

import { CHANGENUMBER } from "./constant";

export const changeMore = (number) => ({ type: CHANGENUMBER, number });


// store/count/reducer.js

import { CHANGENUMBER } from "./constant";

const countInfo = {
  count: 0,
};

// reducer是纯函数 结合state和action,返回新的state
function changeCounter(state = countInfo, action) {
  switch (action.type) {
    case CHANGENUMBER:
      return { ...state, count: state.count + action.number };
    default:
      return state;
  }
}

export default changeCounter;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值