【发布时间】:2019-08-14 05:26:16
【问题描述】:
React 是否会在每次调用 setState() 时重新渲染所有组件和子组件?
如果是这样,为什么?我认为这个想法是 React 只在需要时渲染 - 当状态改变时。
在下面的简单示例中,两个类在单击文本时再次呈现,尽管状态在后续单击时不会改变,因为 onClick 处理程序总是将 state 设置为相同的值:
this.setState({'test':'me'});
我原以为只有在 state 数据发生变化时才会进行渲染。
这是示例的代码,as a JS Fiddle 和嵌入的 sn-p:
var TimeInChild = React.createClass({
render: function() {
var t = new Date().getTime();
return (
<p>Time in child:{t}</p>
);
}
});
var Main = React.createClass({
onTest: function() {
this.setState({'test':'me'});
},
render: function() {
var currentTime = new Date().getTime();
return (
<div onClick={this.onTest}>
<p>Time in main:{currentTime}</p>
<p>Click me to update time</p>
<TimeInChild/>
</div>
);
}
});
ReactDOM.render(<Main/>, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.0.0/react-dom.min.js"></script>
【问题讨论】:
-
我有同样的问题,我不知道确切的解决方案。但是我已经从它开始正常工作的组件中清除了不需要的代码。
-
我想指出,在您的示例中 - 因为您的元素的设计方式不仅仅依赖于独特的状态 - 即使使用虚拟数据调用
setState()也会导致元素呈现不同的方式,所以我会说是的。当某些事情可能发生变化时,它绝对应该尝试重新渲染您的对象,否则您的演示 - 假设它是预期的行为 - 将无法正常工作! -
你可能是对的@TadhgMcDonald-Jensen - 但据我了解,React 会第一次渲染它(因为状态从无变为第一次),然后再也不需要渲染.当然,我错了——因为看起来 React 要求你编写自己的
shouldComponentUpdate方法,我假设它的简单版本必须已经包含在 React 本身中。听起来像 react 中包含的默认版本只是返回true- 这会强制组件每次重新渲染。 -
是的,但它只需要在虚拟 DOM 中重新渲染,然后如果组件渲染不同,它只会更改实际的 DOM。对虚拟 DOM 的更新通常可以忽略不计(至少与修改实际屏幕上的内容相比),因此每次可能需要更新时调用渲染然后看到没有发生任何更改,这并不比假设它应该渲染相同的成本和安全性更高。
标签: javascript reactjs