一文详解Redux Hooks的使用细节

本篇文章带大家聊聊redux hooks的使用细节,希望对大家有所帮助!

一文详解Redux Hooks的使用细节

Redux Hooks

Redux中Hooks介绍

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

但是这种方式必须使用高阶函数结合返回的高阶组件;并且必须编写:mapStateToProps和 mapDispatchToProps映射的函数, 具体使用方式在前面文章有讲解;【相关推荐:Redis视频教程、编程视频】

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

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

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

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

登录后复制

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

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(        )

登录后复制

在组件时使用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 (    
      

{message}

          
  )})// 根组件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 (    
      

当前计数: {counter}

                      
  )})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 (    
      

{message}

          
  )})// 根组件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 (    
      

当前计数: {counter}

                      
  )})export default App

登录后复制

更多编程相关知识,请访问:编程教学!!

以上就是一文详解Redux Hooks的使用细节的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2697590.html

(0)
上一篇 2025年3月7日 18:43:19
下一篇 2025年3月7日 07:03:10

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅析React Hook中useEffecfa函数的使用

    本篇文章给大家介绍一下react hook中的useeffecfa函数,聊聊useeffecfa函数的使用细节,希望对大家有所帮助! useEffect的详细解析 useEffecf基本使用 书接上文, 上一篇文章我们讲解了State Ho…

    2025年3月7日
    200
  • react 怎么实现按需加载

    react实现按需加载的方法:1、通过“import ‘antd/lib/button/style’”精确加载组件;2、通过配合“babel-plugin-import”插件实现按需加载;3、通过“babel-plu…

    2025年3月7日
    200
  • react怎么实现滚动条

    react实现滚动条的方法:1、使用“render() {const translateDistancePercentage…}”方式设置滚动条滚动百分比;2、通过“.scrollBar {width: 362px;&#8230…

    2025年3月7日
    200
  • react怎么实现列表排序

    react实现列表排序的方法:1、将整体设置成一个无序列表,并将子元素放置li内;2、在“Radio.Group”中进行Radio的移动;3、通过arrayMoveImmutable数组重新排序函数实现列表排序即可。 ) }) } 备注 {…

    2025年3月7日
    200
  • 深入详解React中的ref

    对于 Ref 理解与使用,一些读者可能还停留在用 ref 获取真实 DOM 元素和获取类组件实例层面上 其实 ref 除了这两项常用功能之外,还有很多别的小技巧 通过本篇文章的学习,你将收获 React ref 的基本和进阶用法,并且能够明…

    2025年3月7日 编程技术
    200
  • 为什么现在还使用jQuery?理由分析

    据统计, jQuery 全球网站使用量目前依然高企。但一个不争事实 ,随着Web技术现代化,jQuery 已经被边缘化,也有不少人直接认为 jQuery 已经过时,不必再考虑使用。这部分人可能 很少用,或不用 jQuery,使不使用jQue…

    2025年3月7日
    200
  • 【整理分享】一些好用的React Native工具

    近几年在大前端的开发领域,选择跨端方案的公司和部门越来越多,曾一何时市面有不下10种跨端框架,但随着“生物进化论”的推动,目前市面上仅剩两种主流方案,就是经常听到的 React Native 和 Flutter。去年终于引来了 React …

    2025年3月7日 编程技术
    200
  • 【整理分享】7个热门的React状态管理工具

    最近在做项目技术栈整理工作; 由于团队越来越大、人员增多、项目增多; 统一技术栈是一件非常有必要的事; React 状态管理工具有很多,但是选择一个合适的状态管理工具其实很重要; 今天跟大家分享一下我整理的几个非常热门的 React状态管理…

    2025年3月7日 编程技术
    200
  • 基础教程:使用Jest测试React组件

    测试代码对于许多开发人员来说是一种令人困惑的做法。这是可以理解的,因为编写测试需要更多的精力、时间和预见可能用例的能力。由于缺乏资源和人力,从事小型项目的初创公司和开发人员通常倾向于完全忽略测试。 但是,我认为您应该测试您的组件有几个原因:…

    2025年3月7日
    200
  • React中使用表格:第一部分

    用于呈现数据的最常见的用户界面元素之一是表格。事实证明,使用表格时需要控制很多方面,例如: 定义列和标题各种单元格格式(文本、数字、复选框)调整大小过滤动态成长样式 在这个由两部分组成的系列中,您将了解使用 React Bootstrap …

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论