Итак, вы возитесь с React и попадаете в место, где вам нужно обновить состояние, проблема в том, что setState выполняет неглубокое слияние, что означает, что он заботится только о первом уровне объекта и заменяет все, что глубже первого уровня, поэтому вот пример состояния
state = { fruit: “apple”, bird: { short: "hummingbird", tall: "ostrich" } }
setState уничтожит все в Bird, если вы сделаете следующее
this.setState({ bird, { tall: “Emu” } })
setState не перейдет на второй уровень объекта, чтобы просто заменить «страус» на «эму». Он воссоздает новую птицу, содержащую только «высокий». Замечательно а!
Теперь состояние будет выглядеть так
state = { fruit: “apple”, bird: { tall: "emu" } }
Чтобы предотвратить такое поведение, вам нужно использовать вторую форму setState()
, которая принимает функцию, а не объект. Эта функция получит предыдущее состояние в качестве первого аргумента, а реквизиты во время применения обновления в качестве второго аргумента:
this.setState((prevState, currentProps) => ({ bird : {...prevState, tall: "emu" } )});
Так что это будет иметь желаемый эффект. Вот как будет выглядеть состояние
state = { fruit: “apple”, bird: { short: "hummingbird", tall: "emu" } }
Еще одна вещь, о которой следует помнить, если вы этого не сделаете, это то, как работает оператор распространения,
var obj = {a:1, b:2}; var before = { a: 3, …obj }; var after = { …obj, a:3 }; console.log(‘before’, before); // {a:1, b:2} console.log(‘after’, after); // {a:3, b:2} https://jsfiddle.net/eitanp461/6osws8cq/
Спасибо за то, что прочитали этот поспешно написанный пост в блоге, который я делаю, продолжая улучшать свои навыки реагирования.