let times = 0
const init = {name: 'Bob'}
function App() {
const [state, setState] = useState(init)
function modify() {
setState({name: 'Bob'})
}
function modify2() {
setState(init)
}
times ++
return (
<div className="App">
<p>{ times }</p>
<button onClick={modify}>Same Value Will Rerender</button>
<button onClick={modify2}>Same Reference Never Rerender</button>
</div>
);
}
export default function App() {
const [state, setState] = React.useState(1);
console.log("App rendered");
console.log({ state });
return (
<div className="App">
<button
onClick={() => {
setState(1);
}}
>
update state with same value
</button>
<button
onClick={() => {
setState(2);
}}
>
update state with different value
</button>
<div>state:{state}</div>
</div>
);
}
5条答案
按热度按时间twh00eeo1#
如果使用相同的值调用
setState
,它不会重新呈现组件。试试这个:
你会注意到,即使点击按钮,因为值没有改变,它也不会重新呈现组件。如果你改变调用
setState
的参数,它会重新呈现组件。这里有一个Code Sample作为参考。
尝试在
handleClick
方法中注解第一个setState
并取消注解第二个setState
,以查看差异。wa7juj8i2#
总结一下
如果你的状态是一个原始值(数字,字符串,布尔值,...),那么使用setState钩子设置相同的值将不会触发重新渲染。如果你的状态是一个对象或数组,那么它的行为将有所不同。
https://overreacted.io/how-are-function-components-different-from-classes/
https://dmitripavlutin.com/value-vs-reference-javascript/
91zkwejq3#
这是一个与js语法相关的问题,就像
===
操作一样。这是一个Code Sandbox
您可以重写 Package 器方法:
ulydmbyx4#
有点晚了,但是我发现了一个奇怪的情况,用相同的值设置状态会触发重新渲染两次,然后通常会起作用。将状态设置为2会触发重新渲染两次。
有什么解释吗?
dxxyhpgq5#
你可以读这篇文章吗?它有很好的信息与主题:
https://stackoverflow.com/a/55374111/17262218