Как создать идентификаторы сущностей в функции подготовки редуктора createSlice - PullRequest
0 голосов
/ 18 июня 2020

У меня проблемы с функцией обратного вызова prepare, включенной в мой addEntity reducer, который я включаю в функцию createSlice redux-toolkit.

Я пытаюсь использовать обратный вызов prepare, чтобы добавить уникальные идентификаторы в мои полезные данные.

redux-toolkit createSlice документация говорит:

Если вам нужно настроить создание значения полезной нагрузки создателя действия с помощью обратного вызова prepare, значение соответствующего поля объекта аргумента redurs должно быть объектом, а не функцией. Этот объект должен содержать два свойства: reducer и prepare. Значение поля reducer должно быть функцией case reducer, тогда как значение поля 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 перед передачей полезной нагрузки редуктору? Будем очень признательны за любую помощь или руководство.

1 Ответ

2 голосов
/ 18 июня 2020

Обратный вызов подготовки должен возвращать объект, который выглядит как {payload?, meta?, error?}. В настоящее время ваш код напрямую возвращает намеченную полезную нагрузку.

Измените его на:

addEntity: {
  reducer: myEntityAdapter.addOne,
  prepare: (payload) => ({
    payload: {
      ...payload,
      id: uuidv4()
    }
  }),
}
...