1

我在redux-toolkit的函数中prepare包含的reducer中包含的回调函数遇到了一些问题。addEntitycreateSlice

我正在尝试使用prepare回调将唯一 ID 添加到我的操作有效负载中。

redux -toolkitcreateSlice文档说:

如果需要通过 prepare 回调自定义创建 action creator 的有效负载值,reducers 参数对象的相应字段的值应该是对象而不是函数。该对象必须包含两个属性:reducer 和 prepare。reducer 字段的值应该是 case reducer 函数,而 prepare 字段的值应该是 prepare 回调函数。

这是我正在使用的代码(使用 TypeScript 编写):

import { createSlice, createEntityAdapter } from '@reduxjs/toolkit';
import { MyEntityType } from '../../js/types/MyEntityType';
import { v4 as uuidv4 } from 'uuid';

const myEntityAdapter = createEntityAdapter<MyEntityType>();

const { reducer, actions } = createSlice({
    name: 'myEntity',
    initialState: myEntityAdapter.getInitialState(),
    reducers: {
        addEntity: {
            reducer: myEntityAdapter.addOne,
            prepare: (payload) => ({...payload, id: uuidv4()}),
        },
        removeEntity: myEntityAdapter.removeOne,
        updateEntity: myEntityAdapter.updateOne,
    }
});

但是,当我编译我的应用程序并测试使用该操作创建实体addEntity时,prepare回调似乎没有做任何事情。

这是我使用 Redux DevTools 调度的操作:

{
 type: 'myEntity/addEntity',
 payload: {myPayloadTrait: 100, id: 'test'} // Expected behavior: this id should be overwritten in the prepare callback
}

结果状态:

myEntity: {
    ids: {
        0:"test"
    },
    entities: {
        "test": {
            myPayloadTrait: 100
            id: "test"
        }
    }
}

为什么我的准备回调"test"在将有效负载传递给减速器之前不会覆盖 id?任何帮助或指导将不胜感激。

4

1 回答 1

2

准备回调必须返回一个看起来像{payload?, meta?, error?}. 您的代码当前正在直接返回预期的有效负载。

将其更改为:

addEntity: {
  reducer: myEntityAdapter.addOne,
  prepare: (payload) => ({
    payload: {
      ...payload,
      id: uuidv4()
    }
  }),
}
于 2020-06-18T13:21:01.423 回答