位置: IT常识 - 正文

React - Redux Hooks的使用细节详解

编辑:rootadmin
React - Redux Hooks的使用细节详解 文章目录Redux HooksRedux中Hooks介绍Redux中Hooks使用Redux HooksRedux中Hooks介绍

推荐整理分享React - Redux Hooks的使用细节详解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在之前的redux开发中,为了让组件和redux结合起来,我们使用了react-redux库中的connect:

但是这种方式必须使用高阶函数结合返回的高阶组件;

并且必须编写:mapStateToProps和 mapDispatchToProps映射的函数, 具体使用方式在前面文章有讲解;

在Redux7.1开始,提供了Hook的方式,在函数组件中再也不需要编写connect以及对应的映射函数了

useSelector的作用是将state映射到组件中:

参数一: 要求传入一个回调函数, 会将state传递到该回调函数中; 回调函数的返回值要求是一个对象, 在对象编写要使用的数据, 我们可以直接对这个返回的对象进行解构, 拿到我们要使用state中的数据

const { counter } = useSelector((state) => { return { counter: state.counter.counter }})

参数二: 可以进行比较来决定是否组件重新渲染;

React - Redux Hooks的使用细节详解

useSelector默认会比较我们返回的两个对象是否相等;

如何可以比较呢?

在useSelector的第二个参数中, 传入react-redux库中的shallowEqual函数就可以进行比较import { shallowEqual } from 'react-redux'const { counter } = useSelector((state) => ({ counter: state.counter.counter}), shallowEqual)

也就是我们必须返回两个完全相等的对象才可以不引起重新渲染;

useDispatch非常简单,就是调用useDispatch这个Hook, 就可以直接获取到dispatch函数,之后在组件中直接使用即可;

const dispatch = useDispatch()

我们还可以通过useStore来获取当前的store对象(了解即可, 不建议直接操作store对象);

Redux中Hooks使用

我们来使用Redux的Hooks在App组件实现一个计数器, 在App的子组件中实现一个修改message的案例:

首先我们先创建一个简单的store

// store/modules/counter.jsimport { createSlice } from "@reduxjs/toolkit";const counterSlice = createSlice({ name: "counter", initialState: { counter: 10, message: "Hello World" }, reducers: { changeNumberAction(state, { payload }) { state.counter = state.counter + payload }, changeMessageAction(state, {payload }) { state.message = payload } }})export const { changeNumberAction, changeMessageAction } = counterSlice.actionsexport default counterSlice.reducer// store/index.jsimport { configureStore } from "@reduxjs/toolkit";import counterSlice from "./modules/counter"const store = configureStore({ reducer: { counter: counterSlice }})export default store

要使用react-redux库需要导入Provider对App组件进行包裹

import React from "react"import ReactDOM from "react-dom/client"import { Provider } from "react-redux"import App from "./12_Redux中的Hooks/App"import store from "./12_Redux中的Hooks/store"const root = ReactDOM.createRoot(document.querySelector("#root"))root.render( <Provider store={store}> <App/> </Provider>)

在组件时使用useSelector和useDispatch实现获取store中的数据和修改store中数据的操作

import React, { memo } from 'react'import { useDispatch, useSelector } from 'react-redux'import { changeMessageAction, changeNumberAction } from './store/modules/counter'// 子组件Homeconst Home = memo(() => { console.log("Home组件重新渲染") // 通过useSelector获取到store中的数据 const { message } = useSelector((state) => ({ message: state.counter.message })) // useDispatch获取到dispatch函数 const dispatch = useDispatch() function changeMessage() { dispatch(changeMessageAction("Hello ChenYq")) } return ( <div> <h2>{message}</h2> <button onClick={changeMessage}>修改message</button> </div> )})// 根组件Appconst App = memo(() => { console.log("App组件重新渲染") // 通过useSelector获取到store中的数据 const { counter } = useSelector((state) => ({ counter: state.counter.counter })) // useDispatch获取到dispatch函数 const dispatch = useDispatch() function changeNumber(num) { dispatch(changeNumberAction(num)) } return ( <div> <h2>当前计数: {counter}</h2> <button onClick={() => changeNumber(1)}>+1</button> <button onClick={() => changeNumber(-1)}>-1</button> <Home/> </div> )})export default App

现在我们已经在组件中使用并且修改了了store中的数据, 但是现在还有一个小问题(性能优化)

当App组件中修改了counter时, App组件会重新渲染这个是没问题的; 但是Home组件中使用的是message, 并没有使用counter, 却也会重新渲染; 同样的在Home子组件中修改了message, 根组件App也会重新渲染; 这是因为在默认情况下useSelector是监听的整个state, 当state发生改变就会导致组件重新渲染

要解决这个问题就需要使用useSelector的第二个参数来控制是否需要重新渲染, 我们只需要在useSelector函数中传入react-redux库中的shallowEqual函数即可, 它内部会自动进行一个浅层比较, 当使用的state中的数据确实发生变化的时候才会重新渲染

import React, { memo } from 'react'import { useDispatch, useSelector, shallowEqual } from 'react-redux'import { changeMessageAction, changeNumberAction } from './store/modules/counter'// 子组件Homeconst Home = memo(() => { console.log("Home组件重新渲染") const { message } = useSelector((state) => ({ message: state.counter.message }), shallowEqual) const dispatch = useDispatch() function changeMessage() { dispatch(changeMessageAction("Hello ChenYq")) } return ( <div> <h2>{message}</h2> <button onClick={changeMessage}>修改message</button> </div> )})// 根组件Appconst App = memo(() => { console.log("App组件重新渲染") // 通过useSelector获取到store中的数据 const { counter } = useSelector((state) => ({ counter: state.counter.counter }), shallowEqual) // useDispatch获取到dispatch函数 const dispatch = useDispatch() function changeNumber(num) { dispatch(changeNumberAction(num)) } return ( <div> <h2>当前计数: {counter}</h2> <button onClick={() => changeNumber(1)}>+1</button> <button onClick={() => changeNumber(-1)}>-1</button> <Home/> </div> )})export default App
本文链接地址:https://www.jiuchutong.com/zhishi/300197.html 转载请保留说明!

上一篇:Tomcat服务器部署+Web项目搭建(tomcat服务器在哪个位置)

下一篇:翻译: 详细图解Transformer多头自注意力机制 Attention Is All You Need(图幅翻译)

  • 核酸检测预登记显示已预约怎么处理(核酸检测预登记二维码找不到)

    核酸检测预登记显示已预约怎么处理(核酸检测预登记二维码找不到)

  • chrome截屏快捷键(chrome截屏快捷键是哪个)

    chrome截屏快捷键(chrome截屏快捷键是哪个)

  • 微信的账户服务升级收益是什么(微信的账户服务升级收益)

    微信的账户服务升级收益是什么(微信的账户服务升级收益)

  • 快手小黄车申请退款为什么迟迟不能到账(快手小黄车申请退款后发货了怎么办)

    快手小黄车申请退款为什么迟迟不能到账(快手小黄车申请退款后发货了怎么办)

  • 抖音电商是什么(抖音电商是什么工作)

    抖音电商是什么(抖音电商是什么工作)

  • iqooneo3有没有红外(iqooneo3有没有红外遥控)

    iqooneo3有没有红外(iqooneo3有没有红外遥控)

  • 彩色打印机打印出来有横条(彩色打印机打印出来是空白的)

    彩色打印机打印出来有横条(彩色打印机打印出来是空白的)

  • i3 9100f有核显吗(i39100f有核显吗)

    i3 9100f有核显吗(i39100f有核显吗)

  • fla tl10是什么型号(fig-t l 10)

    fla tl10是什么型号(fig-t l 10)

  • 抖音极速版跟抖音短视频有什么区别(抖音极速版跟抖音是一样的吗)

    抖音极速版跟抖音短视频有什么区别(抖音极速版跟抖音是一样的吗)

  • 苹果11摄像头旁边的小孔是什么(苹果11摄像头旁边有个红点)

    苹果11摄像头旁边的小孔是什么(苹果11摄像头旁边有个红点)

  • bilibili转正用户什么意思(b站转正用户是什么)

    bilibili转正用户什么意思(b站转正用户是什么)

  • 亚马逊店铺怎么注册(亚马逊店铺怎么关闭月租)

    亚马逊店铺怎么注册(亚马逊店铺怎么关闭月租)

  • 手机tp保护膜是什么膜(手机tp保护膜多少钱)

    手机tp保护膜是什么膜(手机tp保护膜多少钱)

  • 手机内存不够照片存哪里(手机内存不够照片视频应该存哪里)

    手机内存不够照片存哪里(手机内存不够照片视频应该存哪里)

  • ipv4地址共有多少位(ipv4地址总数有多少)

    ipv4地址共有多少位(ipv4地址总数有多少)

  • 畅享10plus有没有人脸识别(畅享10plus有没有nfc功能)

    畅享10plus有没有人脸识别(畅享10plus有没有nfc功能)

  • 小米反馈回复在哪里看(小米手机的反馈回复在哪)

    小米反馈回复在哪里看(小米手机的反馈回复在哪)

  • 抖音合拍不了是什么原因(抖音合拍不是声音小就是慢半拍)

    抖音合拍不了是什么原因(抖音合拍不是声音小就是慢半拍)

  • xr如何安装卡贴(苹果xr卡贴教程)

    xr如何安装卡贴(苹果xr卡贴教程)

  • 饿了么手机订餐流程(饿了么点餐怎么预定)

    饿了么手机订餐流程(饿了么点餐怎么预定)

  • 苹果ipod是什么东西(ipod是啥意思啊?)

    苹果ipod是什么东西(ipod是啥意思啊?)

  • 苹果x id有锁什么意思(iphonex有id锁值多少钱)

    苹果x id有锁什么意思(iphonex有id锁值多少钱)

  • matlab在哪些高校授权(matlab13所高校)

    matlab在哪些高校授权(matlab13所高校)

  • switch账号解除绑定(switch账号解除绑定主号)

    switch账号解除绑定(switch账号解除绑定主号)

  • 小米cc9e如何隐藏应用(小米cc9应用隐身)

    小米cc9e如何隐藏应用(小米cc9应用隐身)

  • 音频运放的作用是什么(由运放器构成的音频放大电路设计、仿真、测试报告)

    音频运放的作用是什么(由运放器构成的音频放大电路设计、仿真、测试报告)

  • 5g如何改变生活(5g如何改变生活阅读答案)

    5g如何改变生活(5g如何改变生活阅读答案)

  • 苹果电源键是哪个(苹果的电源键是哪个键)

    苹果电源键是哪个(苹果的电源键是哪个键)

  • 【NPM】ubuntu20.04安装npm(ubuntu npm安装)

    【NPM】ubuntu20.04安装npm(ubuntu npm安装)

  • 小规模纳税人零申报逾期未申报
  • 免税增值税的有哪几项
  • 小规模纳税人可以开数电专票吗
  • 法人名下的车辆费用如何进公司帐
  • 非税收入票据能报销吗
  • 收到返利款怎么做账
  • 航空运单能当发票使用吗
  • 小企业会计准则以前年度损益调整
  • 专利捐献
  • 虚开发票企业所得税怎么补缴税?
  • 增值税的工程服务有哪些
  • 用实物资产注资给子公司需缴纳增值税吗?
  • 小规模代扣代缴个税会计分录
  • 专利申请费用怎么做账
  • 关于工商年检社保的通知
  • 不能远程补报之前的税款所属期
  • 付款凭证会计分录怎么写
  • 建筑工程公司开票如何做收入
  • 委托加工存货要交什么税
  • 中国电信服务
  • 存货清查的步骤
  • win7硬盘安装win10教程
  • window10最新20h2
  • 默认网关不可用win7
  • 杜鹃花怎么养家庭养法视频
  • 外地的社保在本地个税扣除
  • dsregcmd.exe
  • 企业所得税弥补以前年度亏损怎么算
  • 房地产企业预缴增值税如何申报
  • 财务收支审批制度主要包括
  • 生产费用在完工产品和在产品之间
  • 出差有补贴
  • 土地使用税缴纳人是使用者还是所有权人
  • 小规模纳税人免税额度是多少
  • 固定资产加速折旧最新政策2022
  • php pdo连接mysql
  • 其他债权投资如何进行投资收益的确认的核算?
  • 基于java的电子书店管理系统
  • formdata方法
  • PHP magento后台无法登录问题解决方法
  • 指令获取
  • 新企业所得税实施细则
  • 关于增值税普通电子发票
  • 工程发票多少点
  • 残疾人保障金所属期怎么填
  • 预缴税款计算表填0.01行吗
  • 航天税盘服务费开的普票可以抵税吗
  • 未开票的收入如何申报增值税
  • 自用房地产转换为采用成本模式计量的投资性房地产
  • 个体工商户怎么注册
  • 个人开发者要缴税吗
  • 无形资产土地入账日期怎么确定
  • 房地产公司车位出租会计分录
  • 其它权益工具投资和其他债权投资
  • 车船税缴纳后有发票吗
  • 企业买房怎么入账
  • 递延所得税资产怎么计算
  • 福利费专票分录
  • 收到??
  • mysql数据库查看是否区分大小写
  • mysql调用java
  • sqlserver字符串转换成数字
  • 一个简单的微笑说说
  • sql函数大全
  • linux tr命令详解
  • anddroid.process.acore进程停止什么意思
  • 用户请愿地址曝露怎么办
  • win10安装不了ie
  • linux命令统计代码行数
  • P2P Networking2.exe - P2P Networking2是什么进程 有什么用
  • linux系统硬盘分区类型
  • win8什么时候发布
  • node 进程
  • 定时软件有哪些
  • u3d脚本语言
  • 国家税务总局广东省税务局待遇
  • 北京930末班车时间表
  • 江苏电子税务局app下载
  • 财税库银是什么费用
  • 酒店访客时间是几个小时
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设