【发布时间】:2021-02-17 01:16:21
【问题描述】:
根据我对 React 的了解,你不应该改变任何对象,否则 React 不知道重新渲染,例如,当单击按钮时,以下示例不应触发 UI 中的重新渲染:
import React, { useState } from "react";
import ReactDOM from "react-dom";
function App({ input }) {
const [items, setItems] = useState(input);
return (
<div>
{items.map((item) => (
<MyItem item={item}/>
))}
<button
onClick={() => {
setItems((prevItems) => {
return prevItems.map((item) => {
if (item.id === 2) {
item.name = Math.random();
}
return item;
});
});
}}
>
Update wouldn't work due to shallow copy
</button>
</div>
);
}
function MyItem ({item}) {
const name = item.name
return <p>{name}</p>
}
ReactDOM.render(
<App
input={[
{ name: "apple", id: 1 },
{ name: "banana", id: 2 }
]}
/>,
document.getElementById("container")
);
你可以试试上面的代码here
更新对象数组的正确方法应该如下所示(其他深度复制方法也可以)
setItems((prevItems) => {
return prevItems.map((item) => {
if (item.id === 2) {
# This way we return a deepcopy of item
return {...item, name: Math.random()}
}
return item;
});
});
为什么第一个版本可以正常工作,即使我只是更新原始项目对象,UI 也会立即更新?
【问题讨论】:
标签: javascript reactjs setstate