嗨,我现在正在学习React,遇到了一些问题。
我知道当状态改变时,组件会重新渲染,而UseEffect中没有深度的代码只运行一次。但我不能解释为什么无限渲染发生时,我写setState在JSX或在渲染语法。
下面的代码导致无限重渲染
import React, { useState, useEffect } from 'react'
const index = () => {
const [active, setActive] = useState(false);
console.log("render", active);
setActive(false);
return (
<div>
</div>
)
}
export default index
但是下面的代码没有问题,即使它一直调用setState。
import React, { useState, useEffect } from 'react'
const index = () => {
const [active, setActive] = useState(false);
console.log("render", active);
useEffect(() => {
setInterval(()=>{
console.log("run")
setActive(true)
},0);
}, [])
return (
<div>
</div>
)
}
setState触发重新渲染不管状态值?我想知道为什么在useEffect之外使用setState会导致错误的确切原因。
这是因为,在第一种情况下,当不使用useEffect时,你在声明状态后就更新了状态。即使你再次将状态设置为false,但是对于react来说,状态已经更新了。react的第一条经验法则是,如果状态更新发生,组件会重新渲染。
这就是为什么你得到一个无限重渲染。
您的代码遵循以下流程:
- 声明状态变量并传递值为false
- 更新状态为false
- 状态更新,因此组件重新渲染。
- 步骤1。
在第二种情况下,当使用use effect时,你的状态只会在组件被挂载时更新,这意味着,在此之后,任何状态更新都不会触发你的useEffect。
基于React文档:https://reactjs.org/docs/hooks-reference.html#usestate
setState函数用于更新状态。它接受一个新的状态值,并排队重新呈现组件。
还有一个附加:https://reactjs.org/docs/hooks-reference.html#bailing-out-of-a-state-update
如果你将State Hook更新为与当前状态相同的值,React将在不渲染子元素或触发效果的情况下跳出。(React使用Object。是比较算法。)请注意,React在退出之前可能仍然需要再次渲染该特定组件。
这里是重要的部分:React可能仍然需要在退出之前再次渲染该特定组件.
所以,即使值是相同的,组件仍然可以渲染。