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

  • 以前年度损益调整
  • 盖了骑缝章的合同怎么写
  • 所得税费用会影响营业利润吗
  • 超过规定标准的扣除项目金额怎么算
  • 金税四期已经开始了吗
  • 一般纳税人需要缴纳哪些税种
  • 手撕定额发票不是免税怎么还报税
  • 会计和税法折旧年限不同如何计算终结期现金净流量
  • 长期借款账务处理会计分录例题
  • 财产保全包括支付宝吗
  • 利息收入红冲怎么做
  • 买体育彩票收银配比是多少
  • 认证过的进项税怎么记账
  • 减免税款是否要结转到未交增值税?
  • 公车保险费可以抵扣吗
  • 营改增后固定资产进项税抵扣规定
  • 劳务费个人所得税税率表2023最新
  • 装修费算固定资产吗?
  • 进项税额转出会计分录月末如何结转
  • 延期申报出口退税流程
  • 增值税发票已经认证可以撤销吗?
  • 金税盘减免税款可以抵扣销项税吗
  • 研发销售型软件有哪些
  • 企业所得税的罚款比例
  • windows11邮件
  • 电脑中毒如何处理
  • 因质量问题被扣的货款销售方怎么做账
  • 任务管理器无法完成操作拒绝访问
  • 委托加工物资企业原材料都是自己采购
  • 现金长款和短款怎么处理
  • 黄金税收多少
  • 赞助收入税务处理
  • 前端段落空两格怎么设置
  • 对于小型微利企业的建议
  • php和mysql的联合使用
  • tar压缩解压缩命令
  • php 命名空间 通俗易懂
  • 如何使用php给图片命名
  • 拓展费怎么做账
  • python中dataframe的布尔过滤
  • Python打开文件的代码
  • 基建期业务招待会议记录
  • 其他支出怎么做账
  • 累计净值包含业绩吗
  • 长期股权投资的账面价值怎么计算
  • 前期费用怎么计算
  • 新准则下其他应收坏账
  • 企业所得税业务招待费怎么调整
  • 企业汇算清缴必须要做审计吗
  • 免征的增值税如何处理
  • 500万以下设备一次性扣除
  • 12月收入1月份开发票怎么报企业所得税
  • 公司内部核算调研报告
  • 航空公司变更起飞时间赔偿
  • 限额领料单属于什么凭证多选题
  • 如何清除sql2008r2日志
  • Sqlserver中char,nchar,varchar与Nvarchar的区别分析
  • 3种方法教你有效祛湿
  • freebsd使用手册
  • ipad和macbook怎么交互
  • coocareservice.exe是病毒吗
  • win7系统怎么开wifi热点
  • xp管理员账号密码
  • sistray.exe - sistray是什么进程 有什么用
  • 在linux系统中
  • windows补丁kb3033929
  • 如何让卖家给你乖乖退款
  • shell脚本定时执行命令
  • android设计模式的应用场景
  • unity导入max文件
  • JavaScript+html5 canvas制作色彩斑斓的正方形效果
  • python模块和包的区别
  • 增值税的进项税额转出是什么意思
  • 村委会税务登记流程
  • 新电子税务局使用方法
  • 广州电子税务局官网登录入口网址
  • 山西国家税务总局
  • 七创社开放时间
  • 企业获得的保险公司保险赔偿款收入
  • 福州市税务局领导班子成员名单
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设