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

  • 想涨价?企业请get这4个技能,快速捕获消费者的心(想涨价?企业请客怎么说)

    想涨价?企业请get这4个技能,快速捕获消费者的心(想涨价?企业请客怎么说)

  • 电脑怎么更新显卡驱动(电脑怎么更新显卡)

    电脑怎么更新显卡驱动(电脑怎么更新显卡)

  • 抖音作品怎样设置成私密(抖音作品怎样设置不让别人看到)

    抖音作品怎样设置成私密(抖音作品怎样设置不让别人看到)

  • 小米10和10pro手机壳通用吗(小米10和10pro手机膜一样吗)

    小米10和10pro手机壳通用吗(小米10和10pro手机膜一样吗)

  • 手机内屏出现紫色扩散怎么办(手机内屏出现紫色扩散能坚持多久)

    手机内屏出现紫色扩散怎么办(手机内屏出现紫色扩散能坚持多久)

  • 取消关注后对方知道吗(取消关注后对方点过赞的作品还在吗)

    取消关注后对方知道吗(取消关注后对方点过赞的作品还在吗)

  • 华为聊天记录怎么能恢复(华为聊天记录怎么彻底删除)

    华为聊天记录怎么能恢复(华为聊天记录怎么彻底删除)

  • 华为畅享9s有长截屏吗(华为畅享9s有长焦模式吗)

    华为畅享9s有长截屏吗(华为畅享9s有长焦模式吗)

  • 什么叫多进制数字调制(什么是多进制调制)

    什么叫多进制数字调制(什么是多进制调制)

  • 文件下载打开找不到应用程序(下载的文件点击打开没有反应)

    文件下载打开找不到应用程序(下载的文件点击打开没有反应)

  • 微信聊天记录删了红包没领怎么办(微信聊天记录删除了怎么恢复回来)

    微信聊天记录删了红包没领怎么办(微信聊天记录删除了怎么恢复回来)

  • 微信投诉警告处理是什么意思(微信投诉警告处理被投诉的可以收到吗)

    微信投诉警告处理是什么意思(微信投诉警告处理被投诉的可以收到吗)

  • airpods支持ios几(airpods支持ios9吗)

    airpods支持ios几(airpods支持ios9吗)

  • 苹果耳机充电线和手机充电线一样吗(苹果耳机充电线可以充手机吗)

    苹果耳机充电线和手机充电线一样吗(苹果耳机充电线可以充手机吗)

  • 移动硬盘磁头坏了能修吗(移动硬盘磁头坏了能导出数据吗)

    移动硬盘磁头坏了能修吗(移动硬盘磁头坏了能导出数据吗)

  • 爱奇艺会员怎么不能下载(爱奇艺会员怎么让第二个人登录)

    爱奇艺会员怎么不能下载(爱奇艺会员怎么让第二个人登录)

  • oppo手机显示hd怎么取消(oppo手机显示HD怎么设置)

    oppo手机显示hd怎么取消(oppo手机显示HD怎么设置)

  • 淘宝下单后怎么添加备注(淘宝下单后怎么退款申请退款)

    淘宝下单后怎么添加备注(淘宝下单后怎么退款申请退款)

  • 快手为什么没有查找功能(快手为什么没有赚钱的功能)

    快手为什么没有查找功能(快手为什么没有赚钱的功能)

  • ios超级签名是什么(苹果超级签名和普通签名)

    ios超级签名是什么(苹果超级签名和普通签名)

  • iosgm版是什么意思(ios14gm版本是什么意思)

    iosgm版是什么意思(ios14gm版本是什么意思)

  • 华为mate20pro进水了还保修吗(华为mate20pro进水不开机)

    华为mate20pro进水了还保修吗(华为mate20pro进水不开机)

  • 小红书的订单去哪看啊(小红书的订单去哪里了)

    小红书的订单去哪看啊(小红书的订单去哪里了)

  • 如何查询苹果手机串号?(如何查询苹果手机充电次数)

    如何查询苹果手机串号?(如何查询苹果手机充电次数)

  • 一品红怎么养(图文)(一品红怎么养才长得好)

    一品红怎么养(图文)(一品红怎么养才长得好)

  • uniapp web-view加载本地html(uniapp页面loading)

    uniapp web-view加载本地html(uniapp页面loading)

  • 商品混凝土税率为啥是3%
  • 无合同销售收入怎么算
  • 成本票和进项票怎么区分
  • 季报申报之后还可以改吗?
  • 银行承兑汇票背书可以拆分
  • 铁路运输专用发票印花税处理
  • 劳保统筹费用
  • 小规模收到货运专用发票
  • 开加工费的发票该如何抵扣?
  • 企业所得税按季预缴怎么算
  • 如何开具红字专用发票信息表
  • 营改增开始试点到普及的行业
  • 收取手续费的委托代销 发票谁来开
  • 承兑汇票贴单怎么贴
  • a公司转给b公司投资款的会计分录
  • 电子承兑转出后多久到账
  • 1697510302
  • 生物资产全套账务处理
  • 网页显示不全怎么回事
  • 事业单位收到开办费的会计分录
  • 鸿蒙os程序
  • win10专业版分辨率1920x1080不见了
  • win7系统如何设置热点
  • 如何解决连接宽带的方法
  • 买车的收费项目详细清单
  • 鸿蒙系统蓝牙耳机声音小怎么办
  • 固定资产和低值易耗品的登记和管理咋弄?
  • 高新技术产业研究院有限公司
  • 营改增全面推开为什么还叫试点
  • 偏食和挑食会有什么不良后果?
  • 因为技术原因
  • github账号在哪里看
  • 永磁同步电机基础理论pdf
  • 往来款会计
  • 住宿费记入管理费用还是营业费
  • php 时间
  • mysql查询日志位置
  • mongodb安装使用
  • 用友要怎么删除凭证
  • 开具红字增值税普通发票
  • 收到发票并支付货款怎么做账
  • 季度所得税申报怎么弥补以前年度亏损
  • 资产负债表是根据科目余额表填的吗
  • mysql delete limit 使用方法详解
  • 工程结算编制收费标准
  • 小规模纳税人转一般纳税人的条件
  • 公司代缴社保生育津贴大概领多少
  • 房地产增值税发票是什么意思
  • 民办非企业单位什么意思
  • 理财产品利息计入本金吗
  • 预付款项给供应商合法吗
  • 一般纳税人加工费怎么做账
  • 企业建帐的基本要求
  • 商业企业内部物流的主要作用是保证商品的正常销售
  • mysql基本介绍
  • mysql怎么使用索引
  • 透明终端架构
  • ghost装win7无法启动
  • win7安装sqlserver2000
  • win7系统怎么用
  • muamgr.exe - muamgr是什么进程 有何作用
  • win7网络连接不见了
  • win7系统怎么设置桌面便签
  • 在Linux系统中安装虚拟window
  • android studio ndk开发教程
  • python black
  • 如何使用朋友的山姆卡
  • 视锥是什么意思
  • js深度拷贝的方法
  • 菜鸟100例python3
  • 猫的游戏视频
  • gpu解码视频
  • mongodb python
  • django优势在哪里
  • 北京电子税务
  • 非营利组织税务处理
  • 公司向境外汇款限额
  • 电子税务局怎么添加银行账户信息
  • 城市维护建设税税率
  • 推动税务系统全面从严
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设