Я искал вокруг ответа на эти вопросы довольно долгое время сейчас, так что я просто хочу, чтобы спросить:Реагирует: считается ли предыдущее состояние измененным?
При передаче функции в качестве первого параметра this.setState, является previousState изменяемых ?
В документации говорится, что функции (состояние, реквизит) может использоваться для обновления состояния от предыдущего, но это также хорошо использовать функцию следующим образом:
Пример: Предположите state.profiles с профилями пользователей, и мы хотим изменить один профиль пользователя. Поэтому вопрос о вложенных объектах в состоянии.
// Profiles has this structure:
// {1:{name: 'Old Name', age: 21}, 2: {name: 'Profile 2', age: 12}};
var changedProfile = {id: 1, name: 'New Name', age: 21};
this.setState(function (previousState) {
previousState.profiles[changedProfile.id] = changedProfile;
return previousState;
})
Это нормально? Можно ли считать, что предыдущиеState.profiles считаются изменчивыми?
Конечно, альтернатива была бы сделать что-то вроде этого:
var changedProfile = {id: 1, name: 'New Name', age: 21},
newProfiles = _.extend({}, this.state.profiles);
newProfiles[chanedProfile.id] = changedProfile;
this.setState({profiles: newProfiles});
Но если мутирует previousState в порядке, то это кажется излишним для меня, чтобы скопировать объект и затем установить состояние на скопированный и измененный объект.
РЕДАКТИРОВАТЬ: Приведенный пример с плохим примером. Заменено лучшим примером.
Извините, ужасный пример. Я сейчас обновил этот вопрос. Если предыдущееState изменчиво, то я не понимаю, почему я вижу все эти примеры с _.extend везде? Использование React.addons.update также кажется немного переборщиком (если оно не используется и для других вещей). – stianlp
Я думаю, причина в том, что копирование текущего состояния и его изменение понятнее. В то время как передача функции setState и возврат объекта в функцию может быть не сразу очевидной. Я просто проверил это с помощью компонента образца с начальным состоянием .x = 5; а затем нажмите кнопку, чтобы onClick обновлял объект prevState; а затем распечатать новое состояние. Все хорошо работает - я думаю, что это только вопрос стиля – luanped
Хорошо! Спасибо, что ответили. Думаю, я посмотрю на источник реакции. Знаете ли вы, что предыдущее состояние является глубокой или мелкой копией? – stianlp