【发布时间】:2022-01-12 05:58:26
【问题描述】:
React 建议不要改变状态。我有一组对象,我正在根据一些事件进行操作。我的问题是,这样写可以吗:
const makeCopy = (arr) => arr.map((item) => ({ ...item }));
function SomeComponenet() {
const [filters, setFilters] = useState(aemFilterData);
const handleFilterClick = (filter, c) => {
let copiedFilters = makeCopy(filters);
/**
* Apply toggle on the parent as well
*/
if (!("parentId" in filter)) {
copiedFilters[filter.id].open = !copiedFilters[filter.id].open;
}
setFilters(copiedFilters);
}
}
我是否像上面那样改变了原始对象?还是这样写有区别吗:
const makeCopy = (arr) => arr.map((item) => ({ ...item }));
function SomeComponent() {
const [filters, setFilters] = useState(aemFilterData);
const handleFilterClick = (filter, c) => {
let copiedFilters = makeCopy(filters);
/**
* Apply toggle on the parent as well
*/
if (!("parentId" in filter)) {
copiedFilters = copiedFilters.map((f) => {
if (filter.id === f.id) {
return {
...f,
open: !f.open,
};
} else {
return { ...f };
}
});
}
setFilters(copiedFilters);
}
}
执行此操作的首选方法是什么?扩展运算符变得非常冗长,我不喜欢它,但如果我需要在这里这样做,我更喜欢它。 immutable.js 和 immer 或不是现在的选项。
【问题讨论】:
-
使用 JSON 进行深拷贝 --> stackoverflow.com/a/47690512/12509535
-
地图复制就够了,不用每一项都复制
-
childIds 数组不会使用扩展运算符克隆,并且容易受到两个对象的更改,因为它们将共享相同的...jsfiddle.net/aejgupLs
-
as long as I am not using some nested item within the state object as a dependency, it won't be an issue?是的,正确,这不是问题。Is my understanding correct?好像是这样。Does this mean I can safely consider the first approach above?是的,实际上您的第一种方法已经是矫枉过正了。您甚至克隆了数组中的所有项目。只克隆数组就足够了,因此这样做const copiedFilters = [...filters]就足够了。不需要你的makeCopy函数。 -
Here 是一个涵盖您的用例的问题。查看接受的答案。
标签: javascript reactjs immutability spread