reactjs - React:重新渲染行为
问题描述
我对反应有些陌生,我正在尝试了解每次组件何时重新渲染。通常我很擅长自己解决这些问题,但我似乎无法找到其中的逻辑
展品 A
const Science = () => {
console.log('Rendering')
useEffect(() => console.log('Effect ran'))
console.log('Returning')
return <div></div>
}
这输出
Rendering
Returning
Rendering
Returning
Effect ran
我不明白为什么它会重新渲染,以及为什么 useEffect 代码出现在渲染和返回之后。
展品 B
const Science = () => {
console.log('Rendering')
useEffect(() => console.log('First effect ran'))
useEffect(() => console.log('Second effect ran'))
console.log('Returning')
return <div></div>
}
这输出
Rendering
Returning
Rendering
Returning
First effect ran
Second effect ran
我猜为什么它在 Exhibit A 中重新渲染是 useEffect 导致重新渲染,但在这里看到,只有一个 useEffect 会导致重新渲染。不确定这种行为。
展品 C
const Science = () => {
console.log('Rendering')
let numRenders = useRef(0)
console.log(++numRenders.current)
console.log('Returning')
return <div></div>
}
这个真的让我很困惑,因为它输出
Rendering
1
Returning
Rendering
1
Returning
我不明白为什么在第二次渲染时,它不会增加。我知道它确实会永久增加值,而不仅仅是用于日志记录。
谢谢。
解决方案
首先,您的 jsx 被渲染。然后执行生命周期钩子并重新渲染组件。然后每次任何状态更改时都会渲染组件或更改道具。
您的 useEffect 代码没有任何依赖关系,但您没有提及它。这种方式在这种情况下是正确的
useEffect(() => console.log("useEffect was ran") , [])
推荐阅读
- mongodb - Mongodb聚合$或$eq上的条件
- angular - Angular Ngrx - 如何让不同的调用循环数组?
- python - 将列表中的元素与以下元素相除?
- python-3.x - 重试装饰方法 Python Nosetest 的单元测试
- c++ - 将可修改的二维数组作为类参数传递
- android - 当应用程序关闭时,WakefulBroadcastReceiver 不起作用
- react-native - React Native 0.59 -> 0.60 - 无法解析模块“NativeModules”
- mongodb - 数据库(Mongo)卷持久性 Docker Swarm
- python - 考虑到日期和时间值,如何从 csv 中创建 Python 字典?
- swift - 在 Swift 中检查对象是否是给定的泛型类型