乐闻世界logo
搜索文章和话题

如何在createSlice reducer中使用 dispatch ?

4 个月前提问
2 个月前修改
浏览次数37

1个答案

1

在 Redux 的 createSlice 中使用 dispatch 来触发另一个reducer的action不是直接进行的,因为 createSlice 自动生成的reducer 是同步的。然而,你可以利用 Redux Toolkit 中的 createAsyncThunk 或 redux middleware 如 redux-thunk 来处理这类需求。

使用 createAsyncThunk

如果你需要在一个 action 完成之后再触发另一个 action,你可以这样操作:

  1. 创建异步的 thunk action: 利用 createAsyncThunk 创建一个异步 action。

  2. 在这个异步 action 中 dispatch 其他 actions: 在这个 thunk action 中,你可以 dispatch 任何其他的同步或异步 actions。

  3. createSlice 中处理这些 actions: 你可以在相应的 reducers 中处理这些 actions 的结果。

示例代码

假设我们有一个使用 createSlice 创建的user slice,我们想在获取用户信息后更新用户状态:

javascript
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'; // 异步 thunk action export const fetchUserById = createAsyncThunk( 'users/fetchById', async (userId, { dispatch, getState }) => { const response = await fetch(`https://api.example.com/users/${userId}`); const userData = await response.json(); // 可以在这里调用其他 actions dispatch(userActions.setUserDetails(userData)); return userData; } ); const userSlice = createSlice({ name: 'user', initialState: { entities: [], loading: 'idle', userDetails: null }, reducers: { setUserDetails(state, action) { state.userDetails = action.payload; }, }, extraReducers: (builder) => { builder.addCase(fetchUserById.fulfilled, (state, action) => { state.entities.push(action.payload); }); } }); export const { setUserDetails } = userSlice.actions; export default userSlice.reducer;

在这个例子中,fetchUserById 是一个异步的 thunk action,在其中我们获取用户数据,并使用 dispatch 来调用 setUserDetails action 更新用户详情。这里的 setUserDetails 是同步的 reducer,它仅仅更新 redux store 的状态。

使用 Middleware (如 redux-thunk)

如果你的项目中已经集成了 redux-thunk, 你也可以在 thunk 中使用 dispatch 来调用多个 actions:

javascript
function fetchUserAndUpdateDetails(userId) { return async function(dispatch, getState) { const response = await fetch(`https://api.example.com/users/${userId}`); const userData = await response.json(); dispatch(userActions.setUserDetails(userData)); } }

这种方式不依赖于 createAsyncThunk,但它依然允许你在一个函数中处理多个操作,包括调用 API 和 dispatching actions。

以上方式都是在处理异步逻辑和需要在一个操作结束后触发其他操作的场景中非常有用的。希望这可以帮助你理解在 Redux Toolkit 中使用 dispatch 的方法。

2024年6月29日 12:07 回复

你的答案