Сначала нам нужно понять, почему возникает эта ошибка.
NGXS использует deepFreeze
под капотом в режиме разработки для Object.freeze
вашего состояния (и глубоко вложенных объектов / массивов), чтобы предотвратить непредсказуемые мутации.
Вы можете проверить это, позвонив Object.isFrozen
:
const state = ctx.getState();
console.log(Object.isFrozen(state.entities));
delete state.entities[action.id];
Я понял, что вы entities
не массив, а объект.
Таким образом, проблема в том, что когда объект заморожен, его невозможно разморозить. Что мы должны делать? Мы должны разморозить сам объект состояния, объект entities
и его дочерние элементы:
const state = ctx.getState();
const newState = { ...state, entities: { ...state.entities }};
for (const key of Object.keys(newState.entities)) {
newState.entities[key] = { ...newState.entities[key] };
}
console.log(Object.isFrozen(newState.entities));
delete newState.entities[action.id];
Мне не нравится этот код, поэтому не бросайте в меня камни:) IЯ думаю, что вы можете искать некоторые пакеты, например deep-unfreeze
, чтобы быть более декларативными. О, я забыл о собственности IDs
. Окончательный код:
ctx.setState(state => {
const newState = {
entities: { ...state.entities },
IDs: state.IDs.filter(id => id !== action.id)
};
for (const key of Object.keys(newState.entities)) {
newState.entities[key] = { ...newState.entities[key] };
}
delete newState.entities[action.id];
return newState;
});
PS проверил его локально.