Хранение одного подсвойства с помощью Redux-Persist
Недавно я столкнулся с необходимостью сохранить только одно подсвойство для данного ключа состояния в Redux при использовании Redux-Persist. К сожалению, вы не можете просто внести его в белый список, как whitelist: ['prop.subprop']
. Благодаря помощи некоторых тем по проблемам GH [1][2] я нашел несколько решений.
- Просто дайте редуктору собственный ключ. Это очевидно самое простое решение. Однако это может не подойти вам, если иерархическая организация вашего состояния важна для вашего приложения, а данный подраздел действительно принадлежит группе.
- Используйте пакет, предназначенный для этого, например redux-persist-transform-filter.
- Внесите в белый список все состояние для этого свойства, но используйте настраиваемые случаи REHYDRATE, чтобы восстановить только данное подсвойство.
Мне больше всего понравился вариант 3, так как он не требовал дополнительной библиотеки, и я мог поддерживать организованность состояния.
Вот как это выглядит для состояний редуктора, которые вы хотите сохранить:
function sidebar(state = initialState, { type, payload }) { switch (type) { case SET_SOME_PROPERTY: return { ...state, prop: payload.prop }; case REHYDRATE: return { ...((payload.top && payload.top.subprop) || {}) }; default: return state; } }
Обратите внимание на вышеизложенное: в идеале странная логика для проверки родительского свойства не должна быть необходимой, но я столкнулся с некоторыми проблемами, когда ее не существовало в некоторых случаях.
Для тех, кого вы не хотите оставлять:
function dontKeepMe(state = initialState, { type, payload }) { switch (type) { case SET_ACTION: return { ...state, ...payload }; case CLEAR_ACTION: return initialState; case REHYDRATE: return {}; default: return state; } }
Есть пара потенциальных минусов:
- Вам нужно добавить
REHYDRATE
случаев ко всем редукторам подсвойств (может быть много). - Все свойство по-прежнему сохраняется в localStorage, и только при повторной гидратации оно частично восстанавливается.
Спасибо пользователю @acemarke за рецензирование этой статьи.
Как сохранить одно подсвойство с помощью Redux-Persist