当前位置: 首页 > news >正文

react-redux的使用

关于react-redux

首先:react-redux和redux并不是一个东西,redux是一个独立的东西,react-redux是react官方根据市场偏好redux推出的react插件库。

了解react-redux的原理图:

安装:npm i react-redux 

redux的ui组件和容器组件是分离的:

新建一个容器组件文件夹container:count:index.js文件(src\containers\Count\index.jsx)

// 引入count的ui组件
import CountUI from '../../components/Count'// 引入connect用于链接ui组件与redux
import {connect} from 'react-redux'
import {createIncrementAction,createDecrementAction,createIncrementAsyncAction} from '../../redux/count_action'
// a函数返回的对象中的key就作为传递给ui组件的props的key,value就作为传递给ui组件的props的value--状态
function mapStateToProps(state){return {n:state}
}
function mapDispatchToProps(dispatch){return {jia:(data)=>{dispatch(createIncrementAction(data))},jian:(data)=>{dispatch(createDecrementAction(data))},jiaAsync:(data,time)=>{dispatch(createIncrementAsyncAction(data,time))}}
}
// 使用connect()()创建并暴露一个count的容器组件
export default connect(mapStateToProps,mapDispatchToProps)(CountUI)

关键是这里的connect连接了ui组件和store.js(状态管理)

ui组件中:完全不操作store和获取store,通过props可以直接访问从容器组件中的store和方法。

import React, { Component } from 'react'
export default class index extends Component {// componentDidMount(){//     // 检测redux中的状态的变化,只要变化,就调用render//     store.subscribe(()=>{//         this.setState({})//     })// }// 加increment=()=>{const {value}=this.selectNumberthis.props.jia(value*1)}// 减decrement=()=>{const {value}=this.selectNumberthis.props.jian(value*1)}// 奇数加incrementIfOdd=()=>{const {value}=this.selectNumberif(this.props.count%2!==0){this.props.jia(value*1)}}// 异步加incrementAsync=()=>{const {value}=this.selectNumberthis.props.jiaAsync(value*1,500)}render() {return (<div><h1>当前求和为:{this.props.n}</h1><select ref={c=>this.selectNumber=c}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button onClick={this.increment}>+</button><button onClick={this.decrement}>-</button><button onClick={this.incrementIfOdd}>当前求和为奇数再加</button><button onClick={this.incrementAsync}>异步加</button></div>)}
}

代码优化1:容器组件(简写箭头函数的方式)

// 引入connect用于链接ui组件与redux
import {connect} from 'react-redux'
import {createIncrementAction,createDecrementAction,createIncrementAsyncAction} from '../../redux/count_action'
// a函数返回的对象中的key就作为传递给ui组件的props的key,value就作为传递给ui组件的props的value--状态
const mapStateToProps= state => ({n:state})
const mapDispatchToProps= dispatch => ({
jia:data=> dispatch(createIncrementAction(data)),
jian:data=>dispatch(createDecrementAction(data)),
jiaAsync:(data,time)=>dispatch(createIncrementAsyncAction(data,time))
})
// 使用connect()()创建并暴露一个count的容器组件
export default connect(mapStateToProps,mapDispatchToProps)(CountUI)

 代码优化2:可以直接简写返回一个对象映射(项目中可能这种写法更多见)

// 引入count的ui组件
import CountUI from '../../components/Count'// 引入connect用于链接ui组件与redux
import {connect} from 'react-redux'
import {createIncrementAction,createDecrementAction,createIncrementAsyncAction} from '../../redux/count_action'
// a函数返回的对象中的key就作为传递给ui组件的props的key,value就作为传递给ui组件的props的value--状态
// const mapStateToProps= state => ({n:state})
// const mapDispatchToProps= dispatch => ({
// jia:data=> dispatch(createIncrementAction(data)),
// jian:data=>dispatch(createDecrementAction(data)),
// jiaAsync:(data,time)=>dispatch(createIncrementAsyncAction(data,time))
// })
// 使用connect()()创建并暴露一个count的容器组件
export default connect(state => ({n:state}),{jia:createIncrementAction,jian:createDecrementAction,jiaAsync:createIncrementAsyncAction,}
)(CountUI)

使用react-redux之后:

入口文件中写provider全局提供store.不用再每使用一个组件,传一次store.

不用自己写监听store变化了,connect已经实现了。 

如果有很多reducer文件:store.js文件

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java编程中接口与实现分离的七种关键技术和设计模式
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
  • plantUML介绍和使用
  • python:画由两条抛物线所围成的图形
  • Vue 3 深入指南:`watch` 属性监控与响应式处理
  • 深入理解java web分层架构的高内聚低耦合
  • 力扣热题100_二分查找_74_搜索二维矩阵
  • WPF学习(8) --Windows API函数的使用
  • SSM环保知识普及平台—计算机毕业设计源码20330
  • JavaScript AI 编程助手
  • 回顾 | 瑞云科技亮相ICIC2024,虚拟仿真实训云平台引关注
  • 下载文件--后端返回文件数据,前端怎么下载呢
  • 论文阅读笔记:The Graph Neural Network Model
  • 微信小程序电话号码授权
  • 机器学习第十一章-特征选择与稀疏学习
  • es6要点
  • jquery cookie
  • JS题目及答案整理
  • js中forEach回调同异步问题
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • mysql常用命令汇总
  • python3 使用 asyncio 代替线程
  • Python利用正则抓取网页内容保存到本地
  • redis学习笔记(三):列表、集合、有序集合
  • SQLServer之创建显式事务
  • vue 个人积累(使用工具,组件)
  • 前端性能优化--懒加载和预加载
  • 阿里云重庆大学大数据训练营落地分享
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #Linux(权限管理)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #宝哥教你#查看jquery绑定的事件函数
  • (52)只出现一次的数字III
  • (C++17) optional的使用
  • (二十三)Flask之高频面试点
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (未解决)macOS matplotlib 中文是方框
  • .axf 转化 .bin文件 的方法
  • .NET 4.0中的泛型协变和反变
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net Web窗口页属性
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET开源快速、强大、免费的电子表格组件
  • [Avalon] Avalon中的Conditional Formatting.
  • [C/C++入门][字符与ASCII码]6、用代码来转换字符与它的ASCII码
  • [CISCN2019 华东南赛区]Web4
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [CSS]文字旁边的竖线以及布局知识
  • [DDR5 Jedec 4-1] 预充电命令 Precharge