2 回答
TA貢獻1851條經驗 獲得超3個贊
.concat()
該concat()方法用于合并兩個或多個數組。此方法不會更改現有數組,而是返回一個新數組。
這證實在狀態的不可變更新中使用是安全的。
請注意,對于作為參數傳遞的任何值,它的工作原理相同,但有點扁平化數組。
該concat方法創建一個新數組,該數組由調用它的對象中的元素組成,對于每個參數,按順序依次是該參數的元素(如果該參數是一個數組)或該參數本身(如果該參數是不是數組)。它不會遞歸到嵌套數組參數中。
[1].concat(['test']) //=> [1, "test"]
[1].concat('test') //=> [1, "test"]
[1].concat([['test']]) //=> [1, ["test"]]
.concat創建一個包含舊this.state.courseData值和接收到的新值的新數組。由于初始狀態是一個空數組[],除非data.data.courseDetails.userModuleDetailsV2不是數組,否則兩者結果相同。
this.state.courseData.concat(data.data.courseDetails.userModuleDetailsV2)
相當于
[].concat(newValues)
// or just
newValues // if array
[newValues] // if something else
所以兩者都是相同的,但.concat在這里是不必要的,因為它只會在內部調用一次,componentDidMount 除非 this.state.courseData預先填充了來自 props 或其他地方的默認數據。
刪除時不起作用.concat?
這意味著它data.data.courseDetails.userModuleDetailsV2可能不是一個數組,并且您期望在 render 方法中有一個數組,但是當 axios 調用成功時(以及在 之后setState),它不再是數組了。
this.setState({
courseData: this.state.courseData.concat(
data.data.courseDetails.userModuleDetailsV2
)
})
//=> [data.data.courseDetails.userModuleDetailsV2]
this.setState({
courseData: data.data.courseDetails.userModuleDetailsV2
})
//=> data.data.courseDetails.userModuleDetailsV2
話雖.concat如此,如果您要添加“獲取更多”功能,那么使用它可能會很有用。
onFetchMore = (offset) => {
fetchMoreAxiosCall(offset)
.then(newData => this.setState(({ courseData }) => ({
courseData: courseData.concat(newData)
})))
}
您可以只更新狀態內所需的值,而無需傳播舊狀態 ( { ...state, courseData: /**/ }) 因為 ( source ):
更新器的輸出與狀態淺合并。
TA貢獻1836條經驗 獲得超3個贊
相反,ReactpreviousState通過傳遞一個接受先前狀態作為第一個參數的函數來提供,例如
// general
this.setState((oldState) => ({ ...oldState }));
// useful for updating objects
this.setState(({ myObject }) => ({
myObject: { ...myObject, propToUpdate: true }
})
);
添加回答
舉報
