Как обновить мета-состояние модели до последней версии redux-orm (0.9.x)?

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

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

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

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

Спасибо!


person pilif    schedule 01.06.2018    source источник


Ответы (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
}
person guillaumepotier    schedule 07.06.2018