如何正确更改 React 中多个嵌套对象数组的状态?
How to correctly change state of a multiple nested array of objects in React?
在 React 中更改多个嵌套对象数组的状态的最佳方法是什么?让我们看看下面的例子:我有一个组件,可以显示每个流派的顶级播放列表。我有一个 属性 genre 这是一个对象数组,每个对象都有一个 属性 songs 这也是一个对象数组。如果我想及时将名为 Soldier of Fortune 的歌曲更改为 Child in Time(让我们假设在 Change 函数中作为参数,我已经从 UI 更改中提供了 Song 和 Genre 的索引)。如何访问多层嵌套对象而不改变状态?
this.state = {
title: 'Top playlists',
genres: [
{
genreName: 'pop',
followers: 2456,
songs: [
{
title: 'Soldier of fortune',
author: 'Deep Purple',
},
],
},
],
};
handleChangeSongName = (e, genreIndex, songIndex) => {
// genreIndex = 0;
// songIndex = 0;
// e.target.name = title;
// e.target.value = "Child in time"
...What to do here?
}
我会这样改变你的状态:
this.state = {
title: "Top playlists",
genres: [
{
followers: 2456,
genreName: "pop",
songs: [
{
title: "Soldier of fortune",
author: "Deep Purple"
}
]
}
]
};
然后是
handleChangeSongName = (e, genreIndex, songIndex) => {
// genreIndex = 0;
// songIndex = 0;
// e.target.name = title;
// e.target.value = "Child in time"
...What to do here?
const genres = _.cloneDeep(this.state.genres); // create deep copy with underscore
// or like this
// const genres = JSON.parse(JSON.stringify(this.state.genres))
if(genres.length && genres[genreIndex] && genres[genreIndex].songs.length && genres[genreIndex].songs[songIndex]) {
genres[genreIndex].songs[songIndex][e.target.name] = e.target.value;
this.setState({
genres: genres
});
}
}
您可以将 handleChangeSongName 函数修改为:
handleChangeSongName = (e, genreIndex, songIndex) => {
// genreIndex = 0;
// songIndex = 0;
// e.target.name = title;
// e.target.value = "Child in time"
this.setState((prevState) => {
let temp = {
...prevState,
genres: [...prevState.genres]
}
// change title "Soldier of fortune" to "Child in time"
temp.genres[genreIndex].songs[songIndex][e.target.name] = e.target.value
return temp
})
}
在 React 中更改多个嵌套对象数组的状态的最佳方法是什么?让我们看看下面的例子:我有一个组件,可以显示每个流派的顶级播放列表。我有一个 属性 genre 这是一个对象数组,每个对象都有一个 属性 songs 这也是一个对象数组。如果我想及时将名为 Soldier of Fortune 的歌曲更改为 Child in Time(让我们假设在 Change 函数中作为参数,我已经从 UI 更改中提供了 Song 和 Genre 的索引)。如何访问多层嵌套对象而不改变状态?
this.state = {
title: 'Top playlists',
genres: [
{
genreName: 'pop',
followers: 2456,
songs: [
{
title: 'Soldier of fortune',
author: 'Deep Purple',
},
],
},
],
};
handleChangeSongName = (e, genreIndex, songIndex) => {
// genreIndex = 0;
// songIndex = 0;
// e.target.name = title;
// e.target.value = "Child in time"
...What to do here?
}
我会这样改变你的状态:
this.state = {
title: "Top playlists",
genres: [
{
followers: 2456,
genreName: "pop",
songs: [
{
title: "Soldier of fortune",
author: "Deep Purple"
}
]
}
]
};
然后是
handleChangeSongName = (e, genreIndex, songIndex) => {
// genreIndex = 0;
// songIndex = 0;
// e.target.name = title;
// e.target.value = "Child in time"
...What to do here?
const genres = _.cloneDeep(this.state.genres); // create deep copy with underscore
// or like this
// const genres = JSON.parse(JSON.stringify(this.state.genres))
if(genres.length && genres[genreIndex] && genres[genreIndex].songs.length && genres[genreIndex].songs[songIndex]) {
genres[genreIndex].songs[songIndex][e.target.name] = e.target.value;
this.setState({
genres: genres
});
}
}
您可以将 handleChangeSongName 函数修改为:
handleChangeSongName = (e, genreIndex, songIndex) => {
// genreIndex = 0;
// songIndex = 0;
// e.target.name = title;
// e.target.value = "Child in time"
this.setState((prevState) => {
let temp = {
...prevState,
genres: [...prevState.genres]
}
// change title "Soldier of fortune" to "Child in time"
temp.genres[genreIndex].songs[songIndex][e.target.name] = e.target.value
return temp
})
}