Я также хотел создать простую функциональность отмены, но уже отправил приложение с redux-storage, которое сериализует и загружает состояние для каждого пользователя. Поэтому, чтобы сохранить его обратно совместимым, я не мог использовать какое-либо решение, которое обертывает мои государственные ключи, например redux-undo с past: []
и present:
.
Ищет альтернативу, Dan's tutorial вдохновил меня на переопределение combineReducers
. Теперь у меня есть одна часть состояния: history
, которая сохраняет до 10 копий остальной части штата и выталкивает их по действию UNDO
. Вот код, это может работать для вашего случая тоже:
function shouldSaveUndo(action){
const blacklist = ['@@INIT', 'REDUX_STORAGE_SAVE', 'REDUX_STORAGE_LOAD', 'UNDO'];
return !blacklist.includes(action.type);
}
function combineReducers(reducers){
return (state = {}, action) => {
if (action.type == "UNDO" && state.history.length > 0){
// Load previous state and pop the history
return {
...Object.keys(reducers).reduce((stateKeys, key) => {
stateKeys[key] = state.history[0][key];
return stateKeys;
}, {}),
history: state.history.slice(1)
}
} else {
// Save a new undo unless the action is blacklisted
const newHistory = shouldSaveUndo(action) ?
[{
...Object.keys(reducers).reduce((stateKeys, key) => {
stateKeys[key] = state[key];
return stateKeys;
}, {})
}] : undefined;
return {
// Calculate the next state
...Object.keys(reducers).reduce((stateKeys, key) => {
stateKeys[key] = reducers[key](state[key], action);
return stateKeys;
}, {}),
history: [
...(newHistory || []),
...(state.history || [])
].slice(0, 10)
};
}
};
}
export default combineReducers({
reducerOne,
reducerTwo,
reducerThree
});
Для меня, это работает как шарм, он просто не выглядит очень красиво. Я был бы рад за любую обратную связь, если это хорошая/плохая идея и почему ;-)
Справа.Теперь я думаю, что мне придется написать редуктор, который реагирует на действия прокрутки, чтобы сохранить текущее состояние. Единственное, что я еще не знаю, как этот редуктор прочитал часть дерева состояний, которое я хочу сохраните, а затем скопируйте это в _different_ часть дерева состояний. Обратите внимание, что это не просто для развития; мой вариант использования - для реального взаимодействия с пользователем. – Vincent
Если редуктору нужен доступ к двум различным частям дерева состояний, это, вероятно, означает, что вам нужен редуктор, который объединяет их обоих. – Qiming
@ Vincent Или, что второе состояние на самом деле не является фундаментальным (то есть не является источником истины) и может быть отброшено – Qiming