Быстрая информация для описания контекста.
Я работаю с компонентом дерева, который получает в качестве опоры такую модель данных:
workfolder: [{
label: "test",
folders: [
{ label: "label 1", id: 1 },
{ label: "label 2", id: 2 },
{ label: "label 3", id: 3 }
]
}];
Все данные хранятся в хранилище Redux.
Начальное значение:
state: { workfolder: [] }
При монтировании я выбираю значения по умолчанию и объединяю результаты с workfolder
в редукторе, и я получаю свое дерево.
return {
...state,
workfolder: results
}
Когда я нажимаю на одну из меток (метка 3), я снова выбираю подпапки, используя id
, и получаю:
[{ label: "label 5", id: 5 },{ label: "label 5", id: 5 }]
На этом этапе в редукторе я использую библиотеку для зацикливания вглубь состояния, пока не найду свойство, соответствующее id
элемента, на который я нажал (метка 3 в данном случае), и хочу объединить вложенные папки в новый атрибут папки.
let newState = JSON.parse(JSON.stringify(state.workfolder));
deepForEach( newState, (value, key, subject, path) => {
const isParentFolder = value === action.payload.parent;
const hasNotFolders = !subject.folders;
if( isParentFolder && hasNotFolders ) {
subject.folders = action.payload.node
}
} );
затем я объединяю новое состояние в магазине:
return {
...state,
workfolder: newState
}
Следуя этому пути, я получаю обновление магазина, но компонент не будет перерисовываться.
ПРИМЕЧАНИЕ: это фиктивный пример. В реальной жизни мне приходится иметь дело с многоуровневым вложенным объектом, имеющим только id
и string
, содержащий путь атрибута, который я хочу изменить в магазине.
Пример, который я нашел в в документации по редуксу , показывает, как сделать это статически, записывая слияние ...