我有一个React App,其数组格式如下:
var themes = [
{
id: 1,
name: 'Light',
},
{
id: 2,
name: 'Dark',
}
];
我的React Component
中有一个方法可以使用覆盖将新项目添加到主题:
addTheme = (theme) => {
const base = themes.find(t => t.name.toLowerCase() === theme.base.toLowerCase());
var newTheme = base ? base : themes[0];
console.log(newTheme);
newTheme.id = themes[themes.length - 1].id + 1;
newTheme.name = theme.name;
themes.push(newTheme);
console.log('themes:', themes);
};
我遇到的问题是将newTheme
变量设置为base
似乎会覆盖数组中的基础对象。
因此,如果我添加一个名为Midnight
的主题,那么Dark
主题也会被更改吗?
答案 0 :(得分:2)
您应该复制主题对象,因为find
返回对该对象的引用。
您有2个选项-浅或深复制对象。
1。浅拷贝(使用ES6):
const newTheme = {...base ? base : themes[0]}
2。深度复制(如果您没有函数属性):
JSON.parse(JSON.stringify(base ? base : themes[0]))
答案 1 :(得分:1)
LZString.decompress()
数组方法将不会返回主题的副本,而是返回对其的引用,因此您实际上是在更改原始主题。
答案 2 :(得分:1)
使用 Object.assign()
Array.find()方法不返回匹配值的副本,而是对象数组中实际匹配的对象。您需要复制该返回的主题对象,以创建要添加的新主题。 Object.assign({}, obj)
返回obj
对象的克隆(请注意,但不要进行深度克隆)。
addTheme = (theme) => {
const base = themes.find(t => t.name.toLowerCase() === theme.base.toLowerCase());
var newTheme = base ? Object.assign({},base) : Object.assign({},themes[0]);
console.log(newTheme);
newTheme.id = themes[themes.length - 1].id + 1;
newTheme.name = theme.name;
themes.push(newTheme);
console.log('themes:', themes);
};