我一直在四處尋找的答案,這個問題現在很長一段時間,所以我只是要問:反應:'previousState'被認爲是可變的嗎?
當傳遞函數作爲第一個參數來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;
})
可以嗎? previousState.profiles可以被認爲是可變的嗎?
當然,替代方法是做這樣的事情:如果變異previousState是OK
var changedProfile = {id: 1, name: 'New Name', age: 21},
newProfiles = _.extend({}, this.state.profiles);
newProfiles[chanedProfile.id] = changedProfile;
this.setState({profiles: newProfiles});
但是,那麼它似乎是多餘的,以我的對象,然後設置狀態複製到複製並改變了對象。
編輯:首先提供了一個不好的例子。用更好的例子取而代之。
對不起,可怕的例子。我現在更新了這個問題。如果previousState是可變的,那麼我不明白爲什麼我會在所有這些例子中看到_.extend在哪裏?使用React.addons.update也似乎有點矯枉過正(除非它也用於其他的東西)。 – stianlp
我認爲原因是複製當前狀態並修改它更清楚地理解。儘管將函數傳遞給setState並在函數中返回對象可能不會立即顯而易見。我只是用一個初始狀態爲.x = 5的示例組件測試了這個;然後有一個onClick更新prevState對象的按鈕;然後打印出新的狀態。事情正常 - 我認爲這只是一個風格的問題 – luanped
好吧!謝謝你的回答。想想我會研究反應的來源。你知道previousState是一個深層還是淺層的副本嗎? – stianlp