跳到主要内容

Redux基础使用教程

安装 redux 插件

pnpm add react-redux @reduxjs/toolkit

开发

1.创建仓储文件夹 stores

在 src 文件下,创建仓储文件夹 stores

2.创建切片文件 createSlice,可多个

如,user.js

用户切片userSlice.js
import { createSlice } from '@reduxjs/toolkit'
import { USERSLICE } from './constant'
const userSlice = createSlice({
name: USERSLICE,
initialState: {
age: 1,
},
reducers: {
setAge: (state, action) => {
state.age = action.payload
},
},
})
export default userSlice

3.合并切片文件 configureStore

创建文件 index.js

import { configureStore } from '@reduxjs/toolkit'
import userSlice from './user'
const store = configureStore({
reducer: {
user: userSlice.reducer,
},
})

export default store

4. 提供状态数据 Provider

Provider 提供者

import { Provider } from 'react-redux'
;<Provider store={stores}>
<App />
</Provider>

5.在其他组件中,获得数据 useSelector

import { useSelector, useDispatch } from 'react-redux'

function Test() {
// 获得状态数据
const user = useSelector((state) => state.user)
const dispatch = useDispatch()
// 更新状态数据
return (
<>
<div>Test</div>
<div style={{ padding: '16px', textAlign: 'center' }}>
<p>{user.age}</p>
<p>
<button
onClick={() => {
dispatch({ type: 'user-slice/setAge', payload: user.age + 1 })
}}>
+1
</button>
<button
onClick={() => {
dispatch({ type: 'user-slice/setAge', payload: user.age - 1 })
}}>
-1
</button>
</p>
</div>
</>
)
}
export default Test

6.在其他组件中,更新数据 useDispatch

通过 dispatch 发送 action 动作

import { useSelector, useDispatch } from 'react-redux'
import userSlice from '../stores/user'

// action 生成器
const { setAge } = userSlice.actions

function Test() {
// 获得状态数据
const user = useSelector((state) => state.user)
// 更新状态数据
const dispatch = useDispatch()
return (
<>
<div>Test</div>
<div style={{ padding: '16px', textAlign: 'center' }}>
<p>{user.age}</p>
<p>
<button
onClick={() => {
dispatch(setAge(user.age + 1))
}}>
+1
</button>
<button
onClick={() => {
dispatch({ type: 'user-slice/setAge', payload: user.age - 1 })
}}>
-1
</button>
</p>
</div>
</>
)
}

export default Test

在切片文件中,新数据替换旧数据、

在 reduxjs/toolkit 新版本中已经包含了 Immer ,所以不用再解构赋值复制一份在赋值,可以直接赋值。其他交给 RTK 处理。

reducers: {
setAge: (state, action) => {
state.age = action.payload
}
}

动作生成器

// 引入切片
import userSlice from '../stores/user'
// action 生成器
const { setAge } = userSlice.actions
// 等价于 setAge === {type:'user-slice/setAge',payload:新值}