类组件
在React类组件中,告诉我们setState 总是导致重新渲染,无论状态是否实际更改为新值。实际上,组件将重新呈现,当状态更新为同一值以前。
除非shouldComponentUpdate()返回false,否则setState()将始终导致重新渲染。
挂钩(功能组件)
但是,使用钩子时,文档将更新状态指定为与先前状态相同的值,不会导致(子组件)重新呈现:
摆脱状态更新
如果您将State Hook更新为与当前状态相同的值,React将在不渲染子级或激发效果的情况下纾困。(React使用Object.is比较算法。)
密切相关的问题
this.setState即使新state值与之前的值相同,类中的组件始终会导致重新渲染是否正确?setStatefrom useState仅会导致重新渲染是否正确state?state与this.setState在带有钩子的函数组件的函数内部进行设置相同?renderstatestate在render方法中进行设置,则会发生无限循环。这是因为类组件不在乎新state的与先前的相同state。它只是在每个上不断重新渲染this.setState。state在函数体内进行设置(render与类组件中的方法类似,在重新渲染时运行)将不是问题,因为当看到该组件时 …考虑以下 Component
const Component = () =>{
const [state, setState] = useState(null)
const onClick = () => setState('foo')
console.log(state)
return <button onClick={onClick}> Change </button>
}
Run Code Online (Sandbox Code Playgroud)
console只打印nullconsole打印fooconsole打印fooconsole不打印任何东西我知道这console不会打印任何内容,因为我正在调用setState传递与当前状态相同的值,而 React 正在救助状态更新。这部分对我来说很清楚。我的问题是关于以下断言
请注意,在退出之前,React 可能仍需要再次渲染该特定组件。这不应该是一个问题,因为 React 不会不必要地“深入”到树中。如果您在渲染时进行昂贵的计算,您可以使用 useMemo 优化它们。
为什么需要这个额外的渲染?我的意思是,不是第二次点击后就Object.is返回false了吗?
我有下面的示例代码:
function App() {
console.log("render");
const [val, setVal] = React.useState(0);
return (
<div className="App">
<h1>{val}</h1>
<button onClick={() => setVal(12)}>Update with same value</button>
</div>
);
}
Run Code Online (Sandbox Code Playgroud)
当我多次单击一个按钮时,控制台会记录 3 次并显示“渲染”消息。对我来说,它应该只有 2 次:
1 用于第一次渲染
2 用于从 val 0 到 12 的更新(单击按钮时)
从这一次开始,它不应重新渲染,因为相同的值 (12) 已更新为 val。
但是为什么会出现3次呢?这意味着尽管更新了相同的值,它仍然会重新渲染一次。
哪位知道的请解释一下,先谢谢了。
P/S:我发现它只会在值改变时导致额外的重新渲染,然后用相同的值更新
function App() {
console.log("render");
const [val, setVal] = useState(4);
return (
<div className="App">
<h1>{val}</h1>
<button onClick={() => {
setVal(val => val + 1)
}}>Update</button>
<button onClick={() => {
setVal(val => val)
}}>Update with same …Run Code Online (Sandbox Code Playgroud)