this.setState((prevState) => { console.log("entry") let selected = this.state.selected selected.push(id) return { selected } })
會觸發控制台打印兩次entry
因為js對象都是淺拷貝,所以應該是直接修改state導致的結果。具體原理暫時不清楚。
解決:
使用深拷貝。當數據比較復雜的時候,下面的方法有bug。具體請搜索“js深拷貝”相關文章
this.setState((prevState) => { let selected = [] prevState.selected.map((item) => { selected.push(item) }) selected.push(id) return { selected } })