Как обновить "мета" состояние модели с помощью последней версии Redux-Orm (0.9.x)?

Я пытаюсь реализовать redux-orm и не уверен в наилучшем способе обновления мета-свойств в моих моделях. Возвращаемое значение статических редукторов игнорируется в последней версии, и, просматривая API, я не вижу никакого способа изменить свойство meta из модели внутри функции статического редуктора.

IE, для стандартных обновлений состояния сущности, вот пример из репо:

static reducer(action, Book, session) {
    switch (action.type) {
    case 'CREATE_BOOK':
        Book.create(action.payload);
        break;
    case 'UPDATE_BOOK':
        Book.withId(action.payload.id).update(action.payload);
        break;
    case 'REMOVE_BOOK':
        const book = Book.withId(action.payload);
        book.delete();
        break;
    ... this function calls the model directly and has no return value

Я нашел несколько примеров статической реализации metaReducer, но все они со старой версией. Я мог бы сделать одноуровневый редуктор, чтобы справиться с этим, но я бы предпочел, чтобы все было на моих реальных сущностях ORM, и использовал предоставленное мета-свойство.

Если у кого-то есть простой пример реализации метаредуктора с последней версией redux-orm, это будет очень цениться.

Спасибо!

1 ответ

В основном вы должны убедиться, что ваши модели содержат ключ (в приведенном ниже примере здесь type), что позволит вам легко получить правильный session хранить для каждого ресурса.

Тогда очень просто выполнять базовые операции CRUD с метаредуктором, который бы обрабатывал все ваши модели с помощью redux-orm.

Вот очень упрощенный пример кода, который я использую в своем приложении с redux-orm@^ 0.9.0

export default function resourcesReducer (state, action) {
  const session = orm.session(getDefaultState(state))
  const resource = action.resource

  switch (action.type) {
    case RESOURCE_CREATE: {
      session[resource.type].create(resource)
      break
    }
    case RESOURCE_EDIT: {
      session[resource.type].withId(resource.id).update(resource)
      break
    }
    case RESOURCE_DELETE: {
      session[resource.type].withId(resource.id).delete(resource)
      break
    }
  }

  return session.state
}
Другие вопросы по тегам