【问题标题】:Param Redux data not populating in store correctlyParam Redux 数据未正确填充到存储中
【发布时间】:2021-08-10 05:13:35
【问题描述】:

在我通过 Thunk 操作传递参数的情况下,我的 Redux 存储出现问题。如果没有参数,我的商店会正确填充。该操作已成功完成,我可以看到我的操作的成功/已完成消息已将数据返回到前端,但没有迹象表明它作为状态进入商店。

我之前有一个实例,其中数组列表从后端错误地命名,但这次不是这种情况。

我的商店没有填充状态数据的原因有哪些?

动作

export const requireUserDiveLogData = createAsyncThunk(
    'users/requireData', // action name
    // action expects to be called with the name of the field
    async (userId) => {
        // you need to define a function to fetch the data by field name
        const response = await userDiveLogList(userId);
        // what we return will be the action payload
        return response.data;
    },
    // only fetch when needed: https://redux-toolkit.js.org/api/createAsyncThunk#canceling-before-execution
    {
        // _ denotes variables that aren't used -  the first argument is the args of the action creator
        condition: (_, { getState }) => {
            const { users } = getState(); // returns redux state
            // check if there is already data by looking at the didLoadData property
            if (users.didLoadDiveLogData) {
                // return false to cancel execution
                return false;
            }
        }
    }
)

减速器

export const userSlice = createSlice({
    name: 'users',
    initialState: {
        userDiveLogList: [],
        didLoadDiveLogData: false,
    },
    reducers: {
        [requireUserDiveLogData.pending.type]: (state) => {
            state.didLoadDiveLogData = true;
        },
        [requireUserDiveLogData.fulfilled.type]: (state, action) => {
            return {
                ...state,
                ...action.payload
            }
        },
    }
})

【问题讨论】:

  • 不明白您的问题?你想做什么?你期待什么结果?
  • 我正在尝试将状态添加到商店,以便我可以访问它。我可以看到操作负载正在成功,但状态没有填充到用户字段中。

标签: javascript reactjs redux react-redux redux-toolkit


【解决方案1】:

您应该使用extraReducers 而不是reducers 来处理createAsyncThunkcreateAction 函数产生的操作。

此外,Redux Toolkit 的 createReducercreateSlice 在内部自动使用 Immer,让您可以使用“变异”语法编写更简单的不可变更新逻辑。不需要自己做浅拷贝工作。

例如

// @ts-nocheck
import {
  configureStore,
  createAsyncThunk,
  createSlice,
} from '@reduxjs/toolkit';

async function userDiveLogList(userId) {
  return { data: { userDiveLogList: [1, 2, 3] } };
}

export const requireUserDiveLogData = createAsyncThunk(
  'users/requireData',
  async (userId) => {
    const response = await userDiveLogList(userId);
    return response.data;
  },
  {
    condition: (_, { getState }) => {
      const { users } = getState();
      if (users.didLoadDiveLogData) {
        return false;
      }
    },
  }
);

const userSlice = createSlice({
  name: 'users',
  initialState: {
    userDiveLogList: [],
    didLoadDiveLogData: false,
  },
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(requireUserDiveLogData.pending, (state) => {
        state.didLoadDiveLogData = true;
      })
      .addCase(requireUserDiveLogData.fulfilled, (state, action) => {
        state.userDiveLogList = action.payload.userDiveLogList;
      });
  },
});

const store = configureStore({
  reducer: {
    users: userSlice.reducer,
  },
});

store.dispatch(requireUserDiveLogData()).then(() => {
  console.log(JSON.stringify(store.getState(), null, 2));
});

控制台输出:

{
  "users": {
    "userDiveLogList": [
      1,
      2,
      3
    ],
    "didLoadDiveLogData": true
  }
}

【讨论】:

  • 太好了,开始工作了。比我想象的要简单得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2022-01-09
  • 1970-01-01
  • 2021-12-06
  • 2018-06-15
  • 1970-01-01
  • 2019-03-03
相关资源
最近更新 更多