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 的新组件
相关推荐
青灯文案1几秒前
前端 HTTP 请求由 Nginx 反向代理和 API 网关到后端服务的流程
前端·nginx·http
m0_748254885 分钟前
DataX3.0+DataX-Web部署分布式可视化ETL系统
前端·分布式·etl
ZJ_.16 分钟前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营21 分钟前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
学代码的小前端1 小时前
0基础学前端-----CSS DAY9
前端·css
joan_851 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
m0_748236111 小时前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
Watermelo6172 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
m0_748248942 小时前
HTML5系列(11)-- Web 无障碍开发指南
前端·html·html5