Во-первых, я понимаю, что это изменение мутированного состояния; Я знаю стыд за меня. Иногда правильный способ кажется не самым умным, или я, по крайней мере, не знаю ничего лучше.Редуктор динамического ключа Redux
Позвольте мне объяснить, что я не буду вводить ключи в свое состояние без создания и обмена старым состоянием и новым состоянием для предопределенных элементов. Я просто хочу немного нажимать клавиши, и если я этого не сделаю, все равно все они будут очищены. Мое начальное состояние выглядит как
{graphSite: {site: "default", graphBrowser: { graphID: '', graphKey:'' }, browsable:[] }};
мой редуктор выглядит следующим образом ** с помощью Babel ES7 объекта распространения оператор
case BROWSER: { state.graphSite.browsable[action.id] = action.payload
return {...state}
}
Так что это будет работать, но Redux инструменты Dev не показывает изменение состояния хотя просматриваемый массив доступное, возможно, это потому, что я пошел против зерна, хотя, если я продлить изменения:
case BROWSER: { state.graphSite.browsable[action.id] = action.payload
return {...state,
graphSite: {...state.graphSite,
graphBrowser: {...state.graphSite.graphBrowser},
browsable: {...state.graphSite.browsable} }
}
}
Теперь просматриваемым показывает правильно в инструменте, но в идеале я этот s ame предмет.
Итак, вопрос заключается в том, как лучше всего управлять состоянием для динамических ключей, которые не находятся в исходном состоянии хранилища. Это работает, похоже, что я делаю что-то неправильно, потому что я манипулировал исходным состоянием.
Вы мутируете само государство. 'state.graphSite.browsable [action.id] = action.payload'. Вам нужно сделать глубокую копию состояния и скопировать копию так, как вы это делаете, а затем вернуть копию – xiaofan2406
. Мне нужно, чтобы ионы действия были достаточно динамичными, мне не нужно отслеживать возможные начальные состояния для изменения.Проблема в том, что копировать нечего, если вы не мутируете оригинал и не возвращаете его как новое. В противном случае id выполняет обычное распространение объекта, а часть, которую я хочу изменить. Это было главным образом для всего, потому что, если это был массив, я не могу гарантировать порядок от асинхронных вызовов. – JustDave