![](/img/trans.png)
[英]How to do it some items or headers should not render multiple time in react native
[英]how many time React should render
我写了一个简单的 react 来测试 React 如何渲染:
import ReactDOM from 'react-dom';
import React, { useState, useEffect } from 'react';
const App = (props) => {
// State
const [trackIndex, setTrackIndex] = useState(1);
const [trackProgress, setTrackProgress] = useState(0);
const clickHandler = () =>{
setTrackIndex((trackIndex)=>trackIndex+1)
}
useEffect(() => {
console.log("effect; trackIndex=",trackIndex)
console.log("effect; trackProgress=",trackProgress)
if(trackIndex<5){
console.log("set trackProgress")
setTrackProgress(trackIndex)
}
});
console.log("render")
return (
<div>
<p>{trackIndex}</p>
<p>{trackProgress}</p>
<button onClick={clickHandler}>Click me</button>
</div>
);
};
ReactDOM.render(
<App />,
document.getElementById('root')
);
以下是控制台output:
render
effect; trackIndex= 1
effect; trackProgress= 0
set trackProgress
render
effect; trackIndex= 1
effect; trackProgress= 1
set trackProgress
render
在我单击按钮之前,React 似乎渲染了三次。 最后的渲染真的让我很困惑。 谁能向我解释为什么会发生这种渲染以及为什么渲染后没有效果? 先感谢您
似乎您的setTrackProgress
在组件的初始渲染上使用useEffect
设置 state 。 这是因为trackIndex
从1
开始,低于 5。(通过if(trackIndex<5)
看到)请注意,您没有将数组依赖项提供给useEffect
作为第二个参数。 根据react-documentation ,这意味着效果只会在组件的第一次初始渲染后发生一次。
另外,我建议将useCallback
添加到您的clickHandler
中,以防止为每个渲染重新定义 function。 (根据反应文档)
你实际上是在做一个无限循环,但 React 可以拯救你。 第一个render
日志是初始渲染,然后执行useEffect
并且您的组件重新渲染,导致第二个render
日志和第一个effect; ...
effect; ...
日志。 现在执行第二个useEffect
。 但是, trackIndex
的值没有改变,因此您的 if 语句将评估 true 并使用相同的 state/value(1) 更新trackProgress
。 这导致另一个重新渲染和第三个log
语句。 现在,您会认为将执行第三个useEffect
,但 React 足够聪明,可以知道 state 何时没有更改,因此不会执行useEffect
。
如上所述,将依赖项添加到您的useEffect
中。 那会解决你的问题。
useEffect(
...
, [trackIndex])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.