【发布时间】:2020-07-03 01:04:43
【问题描述】:
根据this 和that 的问题,spread operator 似乎用于更新在useState 挂钩中管理的对象。
我创建了一个超级简单的例子,发现即使对象的内容没有改变,也会触发重新渲染(很明显,因为对象改变了):
import React from "react";
function useFriendStatus() {
const [person, setPersonProps] = React.useState({name:'Mark',age:23});
React.useEffect(() => {
console.log("rerender");
const interval = setInterval(() => {
setPersonProps({...person}); //simply set the object again -> no content changed
console.log('update');
}, 1000);
return () => clearInterval(interval);
}, [person]);
return person;
}
export default function App() {
const person = useFriendStatus();
return <div className="App">Hello World: {"" + person.name}</div>;
}
在这里您可以看到我的分析器的屏幕截图,显示似乎触发了重新渲染(即使显示的名称没有改变):
我想知道这是否是一种“好习惯”,因为一切似乎都被重新渲染了。有时,您从 API 获得深度嵌套的对象并将它们分解为超级简单的非对象 userState 挂钩是不可能的。
字符串化不是更好吗?
import React from "react";
function useFriendStatus() {
const [person, setPersonProps] = React.useState(JSON.stringify({name:'Mark',age:23}));
React.useEffect(() => {
console.log("rerender");
const interval = setInterval(() => {
const personCopy=JSON.parse(person);
setPersonProps(JSON.stringify({...personCopy}));
console.log('update');
}, 1000);
return () => clearInterval(interval);
}, [person]);
return person;
}
export default function App() {
const person = JSON.parse(useFriendStatus());
return <div className="App">Hello World: {"" + person.name}</div>;
}
在实践中你是如何处理的?
【问题讨论】:
标签: javascript reactjs react-hooks