一文详解Redux Hooks的使用细节
本篇文章带大家聊聊Redux Hooks的使用细节,希望对大家有所帮助!

Redux Hooks
Redux中Hooks介绍
在之前的redux开发中,为了让组件和redux结合起来,我们使用了react-redux库中的connect:
在Redux7.1开始,提供了Hook的方式,在函数组件中再也不需要编写connect以及对应的映射函数了
useSelector的作用是将state映射到组件中:
useSelector默认会比较我们返回的两个对象是否相等;
useDispatch非常简单,就是调用useDispatch这个Hook, 就可以直接获取到dispatch函数,之后在组件中直接使用即可;
const dispatch = useDispatch()
我们还可以通过useStore来获取当前的store对象(了解即可, 不建议直接操作store对象);
Redux中Hooks使用
我们来使用Redux的Hooks在App组件实现一个计数器, 在App的子组件中实现一个修改message的案例:
// 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 storeimport 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>
)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组件重新渲染")
// 通过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>
)
})
// 根组件App
const 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中的数据, 但是现在还有一个小问题(性能优化)
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组件重新渲染")
// 通过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更多编程相关知识,请访问:编程教学!!
javascript