每次setState
调用时,React都会重新渲染所有组件和子组件吗?
如果是这样,为什么?我以为这个想法是,当状态改变时,React只渲染所需的内容。
在下面的简单示例中,尽管onClick处理程序始终将设置state
为相同的值,但是在随后的单击中状态不会改变,这两个类在单击文本时都再次呈现。
this.setState({'test':'me'});
我曾希望只有在state
数据更改的情况下才会进行渲染。
这是示例代码,例如JS Fiddle和嵌入式代码段:
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>
[1]: http://jsfiddle.net/fp2tncmb/2/
每次调用setState时,React都会重新渲染所有组件和子组件吗?
默认情况下-是。
有一个方法 boolean shouldComponentUpdate(object nextProps,object nextState)
,每个组件都有此方法,它负责确定“组件应该更新(运行 渲染 功能)吗?”。每次更改 状态 或从父组件传递新的 道具时 。
您可以为组件编写自己的 shouldComponentUpdate 方法实现,但是默认实现始终返回 true- 意味着始终重新运行渲染函数。
默认情况下,在状态发生适当变化时,shouldComponentUpdate始终返回true以防止细微的错误,但是如果您始终将状态视为不可变并在render()中对props和state进行只读处理,则可以使用比较旧道具和状态及其替换的实现。
问题的下一部分:
如果是这样,为什么?我认为这个想法是,当状态改变时,React只渲染所需的内容。
我们可以将“渲染”分为两个步骤:
虚拟DOM渲染:调用 render 方法时,它将返回组件的新 虚拟dom 结构。如前所述,此 渲染 方法总是在调用 setState() 时调用,因为默认情况下 shouldComponentUpdate 始终返回true。因此,默认情况下,React中没有优化。
原生DOM渲染:只有在虚拟DOM中更改了真实DOM节点后,React才更改浏览器中的真实DOM节点,并且需要的次数很少-这就是React的强大功能,它可以优化真实的DOM变异并使React更快。
问题内容: 每次调用时,React都会重新渲染所有组件和子组件吗? 如果是这样,为什么?我以为这个想法是,当状态改变时,React只能渲染所需的内容。 在下面的简单示例中,尽管onClick处理程序始终将设置为相同的值,但是在随后的单击中状态不会改变,这两个类都在单击文本时再次呈现。 我曾希望只有在数据更改的情况下才会进行渲染。 这是示例代码,例如JS Fiddle和嵌入式代码段: 问题答案: 每
React是否在每次调用时重新呈现所有组件和子组件? 如果是,为什么?我认为这个想法是,当状态改变时,只会根据需要提供少量的反应。 我希望只有在数据发生更改时才会出现呈现。 下面是示例的代码,作为JS Fiddle和嵌入的代码片段:
问题内容: 我正在使用 PhoneGap 开发移动应用程序,并且必须 从另一个项目 访问某些 服务 。我正在使用 jquery-2.0.0.js 和 jquery-mobile-1.3.2.js 。 这个ajax调用每次都会失败。在 config.xml中, 我有以下几行: 我可能在哪里错了! 问题答案: 问题在于您的phonegap应用程序正在从非网络服务器请求本地文件。本地文件交付时没有HTT
部分也很好,当我提交表单时,它会更新。 更改的函数是: 并且是这样称呼的: 例
问题内容: 我正在尝试使用setState()方法将容器中的React状态变量重置为默认值。但是出现以下错误 最后:超出最大调用堆栈大小。 我的代码如下: 当Redux状态的变量为true时,我正在调用resetMsg()。 我在其中调用resetMsg的代码(resetMessages的值最初为false,当它为true时,我需要重置React状态): 问题答案: 您可能要研究功能。根据官方文档
我正在为Kafka的客户librdkafka工作。lib在这里https://github.com/edenhill/librdkafka/blob/master/examples/rdkafka_example.cpp.每次调用Producer类中的product()时,是否调用dr\u cb()函数(请参见以下代码)?