Redux快速上手之【react-redux基础】

前言

  • 细阅此文章大概需要 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 分钟 \color{red}{3分钟} </math>3分钟左右
  • 本篇中讲述了:
    1. react-redux简述
    2. Provider代替Context上下文
    3. connect
  • 欢迎在评论区探讨、留言,如果认为有任何错误都还请您不吝赐教,万分感谢。希望今后能和大家共同学习、进步。
  • 下一篇会尽快更新,已经写好的文章也会在今后进行不定期的修订、更新。
  • 如果觉得这篇文章对您有帮助,还请点个赞支持一下,谢谢大家!
  • 欢迎转载,注明出处即可。

react-redux简述

react-redux最大的特点,就是让redux的相关操作在react中更简洁,主要影响是在组件应用的环节。

Provider代替Context上下文:【无需再手动通过context引用】

创建好公共容器后,我们无需在基于context手动传递storereact-redux内部帮我们实现了这个能力,我们只需要在根组件和后代组件中引入store即可,无需再关注传递方式。

js 复制代码
// 在根节点引入store,基于react-redux传递
import React from 'react';
import ReactDom from 'react-dom';
import App from './view/App';
/*引入redux公共容器*/
import store from './store';
/*不再引入上下文*/
//import AppContext from './AppContext';

/*引入react-redux Provider*/
import {Provider} from 'react-redux';

const root ReactDOM.createRoot(document.getElementById('root'))
root.rnder(
    <Provider store={{store}}> // 基于react-redux Provider传递公共容器
        <App />
    </Provider>
)

connect:【无需手动获取store及公共状态、无需subscript手动更新组件】

最舒服的就是,react-reduxconnect方法帮我们实现了以下三点:

  1. 使用公共容器无需再手动引入store
  2. 获取公共状态无需再使用getState
  3. 基于dispatch派发更新公共状态前,无需再手动编写组件更新的方法并subscript到事件池中了

connext的使用

connect函数执行的返回值:

会返回一个函数,执行这个返回的函数,传入一个组件,会返回一个将我们需要的state和action(需要派发的任务的)注入到props中的的新组件

connect函数执行需要传入两个参数:

  1. mapStateToProps:可以接收到redux中的公共状态,我们可以把需要的信息作为属性,合并传递给组件即可,在组件中使用时,可以基于props获取。

    js 复制代码
    const mapStateToProps = (state) => {
        // state:redux公共容器中,所有模块的公共状态
    
        return {
            // 返回的对象中的信息,会作为属性,传递给组件
            moduleA_a: state.moduleA.a
            moduleA_b: state.moduleA.b
            moduleB_states: state.moduleB
            states: state
            //....
        }
    }
  2. mapDispatchToProps:把需要派发的任务当作属性传递给组件,接收派发任务的方法【store.dispatch()】 ,配合上一篇讲到的createAction进行使用

    js 复制代码
    import action  from '../store/actions'
    
    // ...组件内
    const mapDispatchToProps = (dispatch) => {
        // dispatch:redux中派发任务的方法【store.dispatch()】,配合上一篇讲到的createAction进行使用
    
        return {
            // 返回的对象中的信息,会作为属性,传递给组件
            moduleA_fun_adda:()=>{dispatch(action.moduleA.adda)}
            moduleA_fun_addb:()=>{dispatch(action.moduleA.addb)}
            moduleB_fun_addC:()=>{dispatch(action.moduleB.addc)}
            moduleB_fun_addD:()=>{dispatch(action.moduleB.addd)}
            //....
        }
    }

    或者connect函数的第二个参数可以直接简写为一个派发对象,在connect函数内部会通过bindActionCreators将这样的对象直接变为mapDispatchToProps处理后的这种形式

    js 复制代码
    import action  from '../store/actions'
    
    // ...组件内
    export default connect(null, action.moduleA)(Operator)
    
    // ============等价于下面这种写法================
    const mapDispatchToProps1 = (dispatch) => {
    
        return {
            moduleA_fun_adda:()=>{dispatch(action.moduleA.adda)}
            moduleA_fun_addb:()=>{dispatch(action.moduleA.addb)}
            //....
        }
    }
    
    export default connect(null, mapDispatchToProps1)(Operator)
    
    // ============等价于下面这种写法================
    const mapDispatchToProps2 = (dispatch) => {
        return bindActionCreators(action.moduleA, dispatch)
    }
    
    export default connect(null, mapDispatchToProps2)(Operator)

具体示例

js 复制代码
import action  from '../store/actions'

const moduleB = function (props) {

const { moduleA_a, moduleA_b, moduleB_states, moduleB_fun_addc, moduleB_fun_addD } = props
// 解构出注入到组件中的state和action
    console.log(moduleA_a,'moduleA_a')
    console.log(moduleA_b,'moduleA_b')
    console.log(moduleB_states.c,'moduleB_states_c')
    console.log(moduleB_states.d,'moduleB_states_d')
  
   const handleAddC = () => {moduleB_fun_addc()}
   const handleAddD = () => {moduleB_fun_addD()}

  return <div>
      <button onclick={handleAddC}>add C</button>
      <button onclick={handleAddD}>add D</button>
  </div>;
};

const mapStateToProps = (state) => { // 把需要的信息作为属性,合并传递给组件

        return {
            moduleA_a: state.moduleA.a
            moduleA_b: state.moduleA.b
            moduleB_states: state.moduleB
        }
    }
const mapDispatchToProps = (dispatch) => { // 把需要派发的任务当作属性传递给组件

        return {
            moduleB_fun_addc:()=>{dispatch(action.moduleB.addc)}
            moduleB_fun_addD:()=>{dispatch(action.moduleB.addd)}
            //....
        }
    }

export default connect(mapStateToProps,mapDispatchToProps)(moduleB)
// 返回一个注入state和action到props 的新组件
相关推荐
学不会•2 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic5 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
沉默璇年6 小时前
react中useMemo的使用场景
前端·react.js·前端框架
yqcoder6 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
2401_882727577 小时前
BY组态-低代码web可视化组件
前端·后端·物联网·低代码·数学建模·前端框架