Реагировать, как удалить свойства из состояния

Я пытаюсь заменить все состояние или, по крайней мере, удалить из него все свойства.

Перед реакцией 16 я просто назвал эти две строки

this.state = {}
this.forceUpdate()

С обновлением для реакции 16 это больше не работает. В настоящее время у меня есть этот обходной путь в методе shouldComponentUpdate:

for (let prop in nextState) { 
    if (nextState.hasOwnProperty(prop)) { 
        delete nextState[prop]; 
    } 
}

Но это «чувство» неправильно. Так кто-нибудь знает правильный способ сбросить все состояние с новым объектом? Насколько я проверял, this.setState просто изменяет различия и оставляет другие свойства нетронутыми.


person JD2k    schedule 13.12.2018    source источник
comment
stackoverflow.com/a/46116588/4467208   -  person Murat Karagöz    schedule 13.12.2018
comment
@MuratKaragöz Я уже пробовал это, но каждое свойство, которое находится в состоянии, но не в initialState, остается в this.state без изменений.   -  person JD2k    schedule 13.12.2018


Ответы (1)


Вы не можете удалить свойства из состояния, потому что оно внутренне использует слияние

nextState = Object.assign({}, nextState, partialState);

Так что нет возможности удалить уже существующие ключи. Единственное, что вы можете сделать, это установить для текущих ключей значение undefined. Если вы знаете свойства, вы можете установить их вручную.

Если нет, вы можете попробовать установить их все на undefined:

this.setState(
  Object.keys(this.state).reduce((a, c) => {
    a[c] = undefined;
    return a;
  }, {})
)
person jorbuedo    schedule 13.12.2018
comment
Спасибо за разъяснение. К сожалению, я не могу использовать этот обходной путь, потому что я прошу о существовании ключей, даже если они не определены. Поэтому мне нужно перепрограммировать компонент, чтобы он полностью перезагружался, когда мне нужен сброс. - person JD2k; 13.12.2018