reactjs - Redux 工具包根据 api 响应更新状态

标签 reactjs redux react-redux redux-thunk

我是 redux 和 reduxjs/toolkit 的新手,我一直坚持在成功调用 api 后更新状态。我在这里关注文档 -> https://redux-toolkit.js.org/api/createAsyncThunk

import { createSlice } from '@reduxjs/toolkit';
import { loginUser } from './actions';

const userSlice = createSlice({
  name: 'user',
  initialState: { id: 0, name: '', email: '' },
  reducers: {},
  extraReducers: (builder) => {
    builder.addCase(loginUser.fulfilled, (state, action) => {
      // trying to overwrite the state directly like this doesn't work
      state = { ...action.payload }
      // updating each individual part of the state object does work, but this is not ideal for scalability
      // state.id = action.payload.id;
      // state.name = action.payload.name;
      // state.email = action.payload.email;
    });
  },

如评论中所述,尝试覆盖整个状态对象是行不通的。没有错误消息,但没有任何反应。但是,更新状态对象的每个单独部分确实有效。

最佳答案

Redux Toolkit 构建于 Immer 之上。 Immer 允许您以两种方式更新状态。

重要提示:请谨慎选择其中之一,切勿同时选择两者。

1。变异状态

builder.addCase(loginUser.fulfilled, (state, action) => {
  state.id = action.payload.id;
  state.name = action.payload.name;
  state.email = action.payload.email;
  // NEVER use return when mutating state
});

2。返回新状态

builder.addCase(loginUser.fulfilled, (state, action) => {
  // NEVER mutate state when using return
  return {
    id: action.payload.id,
    name: action.payload.name,
    email: action.payload.email,
  };
});

返回语法可以简化为:

builder.addCase(loginUser.fulfilled, (state, action) => action.payload);

但我不推荐。我认为您最好明确说明 reducer 中的状态变化。这样可以更轻松地了解正在发生的变化。

关于reactjs - Redux 工具包根据 api 响应更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69715812/

相关文章:

javascript - ReactJS服务端渲染、setTimeout问题

reactjs - 无法从 "./aws-exports"解析 "App.js"

reactjs - 通知 Redux 存储 React UI 错误

javascript - react + 终极版 : submit multi-component form

javascript - Redux 如何将状态传递给 mapStateToProps?

javascript - 在React es6中实现去抖

reactjs - 使用 create-react-app 后,我安装的任何软件包会破坏我的代码吗?

javascript - 使用 React Redux 的异步数据加载持续存在

javascript - React Native AsyncStorage 返回 promise 甚至使用 await 和 async

css - 我的 css 在我的 react-redux 元素中来自哪里