位置: 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(图幅翻译)

  • 苹果12可以插2张卡吗(苹果12插2张卡为什么网络信号不好?)

    苹果12可以插2张卡吗(苹果12插2张卡为什么网络信号不好?)

  • vivo x27微信分身怎么开(vivox27微信分身怎么加密)

    vivo x27微信分身怎么开(vivox27微信分身怎么加密)

  • 苹果11隐藏的照片怎么显示出来(苹果11隐藏的照片怎么恢复)

    苹果11隐藏的照片怎么显示出来(苹果11隐藏的照片怎么恢复)

  • 如何解决手机号不存在(如何解决手机号码黑名单)

    如何解决手机号不存在(如何解决手机号码黑名单)

  • 钉钉显示钉盘空间不足怎么办(钉钉钉盘空间不足怎么办)

    钉钉显示钉盘空间不足怎么办(钉钉钉盘空间不足怎么办)

  • 华为mate30如何投屏到电视(华为mate30pro多少钱)

    华为mate30如何投屏到电视(华为mate30pro多少钱)

  • 抖音发布的视频为什么没有播放量(抖音发布的视频怎么突然没有了)

    抖音发布的视频为什么没有播放量(抖音发布的视频怎么突然没有了)

  • 压缩完的文件大于100m怎么办(压缩完的文件大小怎么改)

    压缩完的文件大于100m怎么办(压缩完的文件大小怎么改)

  • 地址错了已发货可以改地址吗(地址错了已发货改地址后有钱吗)

    地址错了已发货可以改地址吗(地址错了已发货改地址后有钱吗)

  • e3 1230 v5相当于i几(e31230v5相当于i7什么)

    e3 1230 v5相当于i几(e31230v5相当于i7什么)

  • p40是不是双扬声器(华为p40系列是不是双扬声器)

    p40是不是双扬声器(华为p40系列是不是双扬声器)

  • 苹果x美版基带是高通吗(iphonexs美版基带)

    苹果x美版基带是高通吗(iphonexs美版基带)

  • iphone11抗冻吗(iphone11怕冷吗)

    iphone11抗冻吗(iphone11怕冷吗)

  • iphonex背景虚化怎么拍(iphonex怎么背景虚化)

    iphonex背景虚化怎么拍(iphonex怎么背景虚化)

  • ipad如何关闭自动续费(ipad如何关闭自动更新app)

    ipad如何关闭自动续费(ipad如何关闭自动更新app)

  • 手机丢了怎么补办手机卡(手机丢了怎么补办手机号码)

    手机丢了怎么补办手机卡(手机丢了怎么补办手机号码)

  • 苹果手机是否有nfc功能(苹果手机是否有红外线功能)

    苹果手机是否有nfc功能(苹果手机是否有红外线功能)

  • 快手能恢复本地作品吗(快手可以恢复)

    快手能恢复本地作品吗(快手可以恢复)

  • 苹果x视频美颜怎么弄(苹果x视频美颜在哪里开)

    苹果x视频美颜怎么弄(苹果x视频美颜在哪里开)

  • 如何获取手机的imsi码(如何获取手机的验证码)

    如何获取手机的imsi码(如何获取手机的验证码)

  • users可以删除吗(以删除的软件怎么找回来)

    users可以删除吗(以删除的软件怎么找回来)

  • bn47电池用于什么手机(bn4a电池什么型号)

    bn47电池用于什么手机(bn4a电池什么型号)

  • 华为手表eid怎么查(华为手表怎么用)

    华为手表eid怎么查(华为手表怎么用)

  • 库乐队显示12怎么取消(库乐队app显示16数字怎么去除)

    库乐队显示12怎么取消(库乐队app显示16数字怎么去除)

  • vue2实现可拖拽甘特图(结合element-ui的gantt图)(vue 可拖拽)

    vue2实现可拖拽甘特图(结合element-ui的gantt图)(vue 可拖拽)

  • python中Allure框架是什么?(python框架的作用)

    python中Allure框架是什么?(python框架的作用)

  • 税务检查是什么行政行为
  • 房地产开发企业销售自行开发的房地产项目
  • 无形资产减值准备可以转回吗
  • 包装物押金计入成本吗
  • 出口货物如何申报
  • 算税负是用含税的吗
  • 红字发票盖章吗
  • 增值税需要结转到本年利润吗
  • 通过认证的增值税怎么算
  • 简易征收的项目是否可以实行30万免税
  • 抹掉的零头怎么入账
  • 专项科研经费
  • 出口退税没有进项就退不了税吗?
  • 公司交的拍卖费计入哪个会计科目?
  • 快递售后是干嘛的
  • 进口的原材料没有发票
  • 税务局会限制每月交税吗
  • 财产租赁合同印花税率多少
  • 认缴制的期限是多久
  • 企业所得税预缴计算方法
  • 如何界定广告
  • 小规模纳税人医院免增值税吗
  • 无形资产管理费用不计入
  • 季度不超过30万免税分录
  • 服务费计入什么收入
  • 控股子公司利润并表
  • 哪些发票可以开专票
  • 3070和3070ti性能差多少
  • 简易计税分包抵减
  • 组成计税价格用来算什么
  • linux系统文件压缩命令
  • 网速不稳定的解决方法
  • Win10 (21H1)Build 19043.1266更新补丁KB5005611正式版发布:附修复更新内容
  • 坏账准备期末余额怎么计算
  • 如何申请公积金装修房子
  • macbook air怎么点击
  • 产品成本计算的分类法适用于( )
  • P2PNetworking3.exe - P2PNetworking3是什么进程 有什么用
  • avgnt.exe
  • 兼职如何交税款
  • 非正常损失如何处理
  • php常用语句
  • 非独立核算的分公司怎么做账
  • uniapp前端 django后端
  • 个体工商户属于灵活就业人员吗
  • 纳税调整项目明细表利息支出怎么填
  • 政府会计累计盈余解析
  • 软件和硬件如何分开
  • 从在建工程调整到费用
  • 出库单可以自制吗
  • 商誉在资产负债表中如何体现
  • 新手任务税控设备申请
  • 原材料的帐务处理
  • 用友t6操作流程
  • 房地产开发的土地分割
  • 旅客运输服务进项税抵扣文件
  • 部分红冲的发票无法勾选怎么办
  • 出口海运费222011
  • 开票系统维护费怎么做账
  • 研发费加计扣除申报表怎么填
  • 会计收入的定义和分类
  • mysql5.5.62安装教程图解
  • sql多级汇总
  • mysqld占用cpu高
  • win sth
  • winxp升级win7失败怎么办
  • 在Linux系统中如何打开R语言控制台
  • win7打印错误怎么解决
  • windows8.1如何安装
  • [置顶]从lv2开始开挂的原勇者候悠闲的异世界生活
  • Cocos2d-JS中JavaScript继承
  • opengl绘制三维图形代码
  • 简洁实用的公司治理机制
  • 安卓源代码开放吗
  • python django orm
  • bootstrap需要学多久
  • 如何查询契税是否逾期
  • 湖北税务登记办理流程和方法
  • 地税发票在哪里开
  • 工会经费怎么缴付
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设