React 每次setState()调用都会重新渲染所有组件和子组件吗?
setState()
如果是这样,为什么?我认为这个想法是 React 只在需要时渲染 - 当状态改变时。
在下面的简单示例中,两个类在单击文本时再次呈现,尽管状态在后续单击时不会改变,因为 onClick 处理程序总是将 设置state为相同的值:
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>
每次调用 setState 时,React 是否会重新渲染所有组件和子组件?
默认情况下 - 是的。
有一个方法 boolean shouldComponentUpdate(object nextProps, object nextState) ,每个组件都有这个方法,它负责确定“应该组件更新(运行 渲染 函数)吗?” 每次更改 状态 或从父组件传递新 道具时。
您可以为您的组件编写自己的 shouldComponentUpdate 方法实现,但默认实现总是返回 true - 意味着总是重新运行渲染函数。
引用官方文档http://facebook.github.io/react/docs/component-specs.html#updating- shouldcomponentupdate
默认情况下, shouldComponentUpdate 总是返回 true 以防止在状态发生变化时出现细微的错误,但如果你小心地始终将状态视为不可变的并且在 render() 中从 props 和 state 中读取为只读,那么你可以覆盖 shouldComponentUpdate 与将旧道具和状态与其替代品进行比较的实现。
你问题的下一部分:
我们可以称之为“渲染”的有两个步骤:
虚拟 DOM 渲染:当 render 方法被调用时,它返回组件的一个新的 虚拟 dom 结构。正如我之前提到的,这个 渲染 方法总是在你调用 setState() 时被调用,因为 shouldComponentUpdate 总是默认返回 true。因此,默认情况下,React 中没有优化。
原生 DOM 渲染:React 仅在虚拟 DOM 中更改真实 DOM 节点时才会更改浏览器中的真实 DOM 节点,并且只需少量更改 - 这是 React 的伟大功能,它优化了真实 DOM 突变并使 React 快速运行。