【发布时间】:2021-08-05 11:51:11
【问题描述】:
我有一个简单的组件示例,它使用useRef() 来计算我的组件已呈现的次数,并使用useState() 来维持某种状态:
const {useState, useRef} = React;
const App = () => {
const [counter, setCounter] = useState(0);
const renderCount = useRef(0);
const onClick = () => {
setCounter(1);
}
renderCount.current++;
alert("rendering"); // executes 3 times, not twice.
return <div>
<p>Render count: {renderCount.current}</p>
<button onClick={onClick}>{counter}</button>
</div>
}
ReactDOM.render(<App />, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.0/umd/react-dom.production.min.js"></script>
当我运行上面的 sn-p 时,alert 触发并且 ref 计数器由于第一次渲染而增加。当我第一次单击该按钮时,会调用setCounter(1),这会导致组件重新渲染/重新执行(如预期的那样),从而导致警报第二次出现并且引用计数器增加。当我第二次单击该按钮时,setCounter(1) 运行(它不会更新状态,因为它已经是 1)。由于状态没有改变,我希望不需要重新渲染,因此我的 App 组件不会再次执行。但是,我反而看到了第三个警报,表明该组件再次执行,但是 ref 计数器没有增加,第二次单击后呈现的输出也没有改变。进一步单击该按钮不会按预期显示任何警报。我的问题是,当状态没有改变时(即:第二次点击按钮),为什么 React 会再次执行我的 App 组件?
【问题讨论】:
标签: javascript reactjs setstate