我必須在這裏丟失一些明顯的東西。我有一個待辦事項列表應用程序,它使用一個函數來創建新列表。一旦調用createList
,我想通過將其selected
支柱設置爲true
來突出顯示列表。因此,以下是執行此操作的兩種方法。我試圖一個接一個地打電話。他們都使用適當的回調修改狀態,使用prevState
,但不管什麼原因,createList
不會在toggleSelected
被調用之前將狀態設置爲新狀態,因此listName
在toggleSelected
中未定義。無論如何要確保在調用toggleSelected
之前將新列表對象設置爲狀態?我應該使用Redux,但我不想爲我的第一個React應用程序進入。React.js - 如何在另一個完成後調用setState函數
createList = (listName) => {
const lists = {...this.state.lists};
lists[listName] = {
listName: listName,
selected: false,
todos: {}
};
this.setState(prevState => {
return {lists: prevState.lists};
});
};
toggleSelected = (listName) => {
let selected = this.state.lists[listName].selected;
selected = !selected;
this.setState(prevState => {
return {
bookLists: update(prevState.lists, {[listName]: {selected: {$set: selected}}})
};
});
};
兩種方法調用另一個組件,像這樣的onSubmit
處理器與新的列表名稱後被傳遞:
this.props.createList(newListName);
this.props.toggleSelected(newListName);
PS - 如果你想知道這是怎麼回事用update()
,它是從一個不變性輔助插件,允許在狀態對象中輕鬆設置嵌套值(在這種情況下,state.lists[listName].selected
) - 我可能應該使用Redux的另一個原因。
PPS - 我意識到我可以從creatList
開始將新列表的selected
道具設置爲true
,但應用程序還有更多內容,我需要在創建後對其進行設置。
感謝您的答覆!快速問題:你是什麼意思'toggleSelected'是生成組件?從我看到的,它只是更新狀態與翻轉'選擇'(這種方法一直在應用程序的其他部分按預期工作)。 –
我可能誤解了你的setState做了什麼,你沒有將它傳遞給一個狀態和一個回調函數,而只是一個函數(這可能是一個新的setState方法被調用,到目前爲止我所使用的所有代碼是'this.setState(stateobj,callbackwhenupdated)')。 –
啊,不。 'setState'的第一個參數可以是具有以下簽名的更新函數:'(prevState,props)=> stateChange''。根據我的理解,這是更新狀態的正確方法:由於setState是asnyc,所以'prevState'將在任何其他方法改變之後返回狀態。 –