最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中Redux Hooks的使用詳解

 更新時(shí)間:2023年07月08日 10:50:55   作者:學(xué)全棧的灌湯包  
這篇文章主要介紹了React Redux Hooks的使用詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Redux Hooks

Redux中Hooks介紹

在之前的redux開(kāi)發(fā)中,為了讓組件和redux結(jié)合起來(lái),我們使用了react-redux庫(kù)中的connect:

但是這種方式必須使用高階函數(shù)結(jié)合返回的高階組件;

并且必須編寫(xiě):mapStateToProps和 mapDispatchToProps映射的函數(shù), 具體使用方式在前面文章有講解;

在Redux7.1開(kāi)始,提供了Hook的方式,在函數(shù)組件中再也不需要編寫(xiě)connect以及對(duì)應(yīng)的映射函數(shù)了

useSelector的作用是將state映射到組件中:

參數(shù)一: 要求傳入一個(gè)回調(diào)函數(shù), 會(huì)將state傳遞到該回調(diào)函數(shù)中; 回調(diào)函數(shù)的返回值要求是一個(gè)對(duì)象, 在對(duì)象編寫(xiě)要使用的數(shù)據(jù), 我們可以直接對(duì)這個(gè)返回的對(duì)象進(jìn)行解構(gòu), 拿到我們要使用state中的數(shù)據(jù)

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

參數(shù)二: 可以進(jìn)行比較來(lái)決定是否組件重新渲染;

useSelector默認(rèn)會(huì)比較我們返回的兩個(gè)對(duì)象是否相等;

如何可以比較呢?

在useSelector的第二個(gè)參數(shù)中, 傳入react-redux庫(kù)中的shallowEqual函數(shù)就可以進(jìn)行比較
import { shallowEqual } from 'react-redux'
const { counter } = useSelector((state) => ({
  counter: state.counter.counter
}), shallowEqual)

也就是我們必須返回兩個(gè)完全相等的對(duì)象才可以不引起重新渲染;

useDispatch非常簡(jiǎn)單,就是調(diào)用useDispatch這個(gè)Hook, 就可以直接獲取到dispatch函數(shù),之后在組件中直接使用即可;

const dispatch = useDispatch()

我們還可以通過(guò)useStore來(lái)獲取當(dāng)前的store對(duì)象(了解即可, 不建議直接操作store對(duì)象);

Redux中Hooks使用

我們來(lái)使用Redux的Hooks在App組件實(shí)現(xiàn)一個(gè)計(jì)數(shù)器, 在App的子組件中實(shí)現(xiàn)一個(gè)修改message的案例:

首先我們先創(chuàng)建一個(gè)簡(jiǎn)單的store

// store/modules/counter.js
import { 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.actions
export default counterSlice.reducer
// store/index.js
import { configureStore } from "@reduxjs/toolkit";
import counterSlice from "./modules/counter"
const store = configureStore({
  reducer: {
    counter: counterSlice
  }
})
export default store

要使用react-redux庫(kù)需要導(dǎo)入Provider對(duì)App組件進(jìn)行包裹

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

在組件時(shí)使用useSelector和useDispatch實(shí)現(xiàn)獲取store中的數(shù)據(jù)和修改store中數(shù)據(jù)的操作

import React, { memo } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { changeMessageAction, changeNumberAction } from './store/modules/counter'
// 子組件Home
const Home = memo(() => {
  console.log("Home組件重新渲染")
  // 通過(guò)useSelector獲取到store中的數(shù)據(jù)
  const { message } = useSelector((state) => ({
    message: state.counter.message
  }))
  // useDispatch獲取到dispatch函數(shù)
  const dispatch = useDispatch()
  function changeMessage() {
    dispatch(changeMessageAction("Hello ChenYq"))
  }
  return (
    <div>
      <h2>{message}</h2>
      <button onClick={changeMessage}>修改message</button>
    </div>
  )
})
// 根組件App
const App = memo(() => {
  console.log("App組件重新渲染")
  // 通過(guò)useSelector獲取到store中的數(shù)據(jù)
  const { counter } = useSelector((state) => ({
    counter: state.counter.counter
  }))
  // useDispatch獲取到dispatch函數(shù)
  const dispatch = useDispatch()
  function changeNumber(num) {
    dispatch(changeNumberAction(num))
  }
  return (
    <div>
      <h2>當(dāng)前計(jì)數(shù): {counter}</h2>
      <button onClick={() => changeNumber(1)}>+1</button>
      <button onClick={() => changeNumber(-1)}>-1</button>
      <Home/>
    </div>
  )
})
export default App

現(xiàn)在我們已經(jīng)在組件中使用并且修改了了store中的數(shù)據(jù), 但是現(xiàn)在還有一個(gè)小問(wèn)題(性能優(yōu)化)

當(dāng)App組件中修改了counter時(shí), App組件會(huì)重新渲染這個(gè)是沒(méi)問(wèn)題的; 但是Home組件中使用的是message, 并沒(méi)有使用counter, 卻也會(huì)重新渲染; 同樣的在Home子組件中修改了message, 根組件App也會(huì)重新渲染; 這是因?yàn)樵谀J(rèn)情況下useSelector是監(jiān)聽(tīng)的整個(gè)state, 當(dāng)state發(fā)生改變就會(huì)導(dǎo)致組件重新渲染

要解決這個(gè)問(wèn)題就需要使用useSelector的第二個(gè)參數(shù)來(lái)控制是否需要重新渲染, 我們只需要在useSelector函數(shù)中傳入react-redux庫(kù)中的shallowEqual函數(shù)即可, 它內(nèi)部會(huì)自動(dòng)進(jìn)行一個(gè)淺層比較, 當(dāng)使用的state中的數(shù)據(jù)確實(shí)發(fā)生變化的時(shí)候才會(huì)重新渲染

import React, { memo } from 'react'
import { useDispatch, useSelector, shallowEqual } from 'react-redux'
import { changeMessageAction, changeNumberAction } from './store/modules/counter'
// 子組件Home
const 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>
  )
})
// 根組件App
const App = memo(() => {
  console.log("App組件重新渲染")
  // 通過(guò)useSelector獲取到store中的數(shù)據(jù)
  const { counter } = useSelector((state) => ({
    counter: state.counter.counter
  }), shallowEqual)
  // useDispatch獲取到dispatch函數(shù)
  const dispatch = useDispatch()
  function changeNumber(num) {
    dispatch(changeNumberAction(num))
  }
  return (
    <div>
      <h2>當(dāng)前計(jì)數(shù): {counter}</h2>
      <button onClick={() => changeNumber(1)}>+1</button>
      <button onClick={() => changeNumber(-1)}>-1</button>
      <Home/>
    </div>
  )
})
export default App

到此這篇關(guān)于React - Redux Hooks的使用細(xì)節(jié)詳解的文章就介紹到這了,更多相關(guān)React Redux Hooks使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • react-router JS 控制路由跳轉(zhuǎn)實(shí)例

    react-router JS 控制路由跳轉(zhuǎn)實(shí)例

    這篇文章主要介紹了react-router JS 控制路由跳轉(zhuǎn)實(shí)例,react實(shí)現(xiàn)路由可以直接使用react-router。有興趣的可以了解一下
    2017-06-06
  • react-redux的connect用法詳解

    react-redux的connect用法詳解

    react-redux是react官方推出的redux綁定庫(kù),React-Redux 將所有組件分成兩大類(lèi)一個(gè)是UI組件和容器組件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-01-01
  • ForwardRef?useImperativeHandle方法demo

    ForwardRef?useImperativeHandle方法demo

    這篇文章主要為大家介紹了ForwardRef?useImperativeHandle方法demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • React函數(shù)組件與類(lèi)的區(qū)別有哪些

    React函數(shù)組件與類(lèi)的區(qū)別有哪些

    函數(shù)式組件的基本意義就是,組件實(shí)際上是一個(gè)函數(shù),不是類(lèi),下面這篇文章主要給大家介紹了關(guān)于React中函數(shù)組件與類(lèi)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • VSCode 配置React Native開(kāi)發(fā)環(huán)境的方法

    VSCode 配置React Native開(kāi)發(fā)環(huán)境的方法

    本篇文章主要介紹了VSCode 配置React Native開(kāi)發(fā)環(huán)境的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Webpack 4.x搭建react開(kāi)發(fā)環(huán)境的方法步驟

    Webpack 4.x搭建react開(kāi)發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了Webpack 4.x搭建react開(kāi)發(fā)環(huán)境的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • React中如何使用scss

    React中如何使用scss

    這篇文章主要介紹了React中如何使用scss問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 淺談React底層實(shí)現(xiàn)原理

    淺談React底層實(shí)現(xiàn)原理

    本文主要介紹了淺談React底層實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • React簡(jiǎn)便獲取經(jīng)緯度信息的方法詳解

    React簡(jiǎn)便獲取經(jīng)緯度信息的方法詳解

    在現(xiàn)代的Web應(yīng)用程序中,獲取用戶(hù)的地理位置信息是一項(xiàng)常見(jiàn)的需求,本文我們將介紹如何在React應(yīng)用程序中簡(jiǎn)便地獲取用戶(hù)的經(jīng)緯度信息,需要的可以參考下
    2023-11-11
  • React控制元素顯示隱藏的三種方法小結(jié)

    React控制元素顯示隱藏的三種方法小結(jié)

    這篇文章主要介紹了React控制元素顯示隱藏的三種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評(píng)論

林西县| 岑溪市| 剑河县| 阿瓦提县| 精河县| 平顺县| 青神县| 洪雅县| 尼勒克县| 旺苍县| 天长市| 观塘区| 桂东县| 当涂县| 东安县| 丰都县| 托克逊县| 来宾市| 台北县| 来凤县| 藁城市| 甘南县| 兰州市| 富锦市| 如东县| 西盟| 兰溪市| 正安县| 密云县| 来安县| 连南| 疏附县| 辉南县| 河间市| 桐乡市| 大名县| 保亭| 鄂温| 大同县| 荆州市| 施秉县|