2016-03-05 3 views
1

Я искал вокруг ответа на эти вопросы довольно долгое время сейчас, так что я просто хочу, чтобы спросить:Реагирует: считается ли предыдущее состояние измененным?

При передаче функции в качестве первого параметра this.setState, является previousState изменяемых ?

From React docs

В документации говорится, что функции (состояние, реквизит) может использоваться для обновления состояния от предыдущего, но это также хорошо использовать функцию следующим образом:

Пример: Предположите 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 в порядке, то это кажется излишним для меня, чтобы скопировать объект и затем установить состояние на скопированный и измененный объект.

РЕДАКТИРОВАТЬ: Приведенный пример с плохим примером. Заменено лучшим примером.

ответ

0

В вашем примере ваше новое состояние не зависит вообще от предыдущего состояния, так что вы можете просто сделать:

this.setState({ 
    a: 123; 
    b: {x: 'X', y: 'Y'}; 
}) 

Однако если это был просто плохой пример, и как-то вам нужно проверить предыдущее состояние, чтобы определить новое состояние, то это будет что-то вроде этого:

this.setState(function (previousState) { 
    return { 
    a: previousState.a + 123; 
    b: Object.assign(previousState.b, {x: 'X', y: 'Y'}); 
    } 
}) 

по существу результата является то, что мы возвращаем объект, новое состояние, и мы можем использовать предыдущее состояние, как мы видим, нужными - так что да, вы можете мутировать предыдущее состояние, как это было на вашем экзамене ple

+0

Извините, ужасный пример. Я сейчас обновил этот вопрос. Если предыдущееState изменчиво, то я не понимаю, почему я вижу все эти примеры с _.extend везде? Использование React.addons.update также кажется немного переборщиком (если оно не используется и для других вещей). – stianlp

+0

Я думаю, причина в том, что копирование текущего состояния и его изменение понятнее. В то время как передача функции setState и возврат объекта в функцию может быть не сразу очевидной. Я просто проверил это с помощью компонента образца с начальным состоянием .x = 5; а затем нажмите кнопку, чтобы onClick обновлял объект prevState; а затем распечатать новое состояние. Все хорошо работает - я думаю, что это только вопрос стиля – luanped

+0

Хорошо! Спасибо, что ответили. Думаю, я посмотрю на источник реакции. Знаете ли вы, что предыдущее состояние является глубокой или мелкой копией? – stianlp

Смежные вопросы