反应:不必要的组件更新
React: unnecessary component update
有 3 个反应组件,其中两个在第一个组件内。第一个组件包含仅在第三个组件中使用的一些状态。当我使用回调反应从第三个组件更新状态时,还会另外更新第二个组件。但第二个组件没有变化。
为什么会发生这种情况以及如何避免这种情况?
这是我的代码:
var app = React.createClass({
displayName: 'app',
settingsChanged: function (value) {
console.log('app.settingsChanged');
this.setState({ settings: { value: value } });
},
getInitialState: function() {
return { settings: { value: 1 } }
},
render: function() {
return (
React.createElement('div', null,
React.createElement(component1),
React.createElement(component2, { settings: this.state.settings, settingsChanged: this.settingsChanged })
)
);
}
})
var component1 = React.createClass({
displayName: 'component1',
render: function () {
console.log('component1.render');
return (
React.createElement('div', null, 'component1')
);
}
})
var component2 = React.createClass({
displayName: 'component2',
tbValueChanged: function(e) {
this.props.settingsChanged(e.target.value);
},
render: function () {
console.log('component2.render');
return (
React.createElement('div', null,
React.createElement('div', null, 'component2'),
React.createElement('input', { value: this.props.settings.value, onChange: this.tbValueChanged })
)
);
}
})
在控制台中,我看到以下内容:
component1.render app.js:27
component2.render app.js:42
app.settingsChanged app.js:5
component1.render app.js:27
component2.render app.js:42
http://jsfiddle.net/67m0z3ts/1/
实际上,
正在发生的事情是一种正常行为,一旦主组件中发生了某些变化,该主组件中的所有组件都将再次渲染。
但是好消息是您可以使用 shouldComponentUpdate()
更改此默认行为,默认情况下这是正确的。查看高级性能中的 react.js 文档。
我希望这有所帮助。
祝你好运
你可以用方法阻止 React 渲染 shouldComponentUpdate.因此,您必须向组件添加以下代码行1:
getInitialState : function(){
return {
shouldUpdate: true
}
},
shouldComponentUpdate: function(nextProps, nextState){
return nextState === this.state.shouldUpdate
},
还有小提琴链接
希望对您有所帮助!
谢谢
我不想在这里详细介绍,但除了其他回复之外,您还可以尝试从 React 启用 PureRenderMixin。从文档中:
在引擎盖下,mixin 实现
shouldComponentUpdate
,其中它将当前的道具和状态与下一个道具和状态进行比较,并在等式通过时返回false
。
相关文章:
- 调度没有'无法立即更新组件
- React js更改状态不会更新组件
- 如何使用JavaScript更新JSP页面的一些组件
- 如何在加载Angular2.RC1子组件时更新它
- ReactJS组件中显示的视频未更新
- 如何创建独立于数组更新的组件列表
- 组件道具更改后更新redux存储
- 如果我不应该在组件WillUpdate中调用setState,如何更新状态(使用ReactJS)
- React 应该组件更新太多的递归
- 在PrimeFaces中的某些组件更新时自动调用javascript
- 反应:不必要的组件更新
- 通过子组件更新父数据
- 余烬子组件通过父组件更新来自查询参数的属性
- 从子组件更新父组件
- 从React组件更新模型/集合
- 通过React Native中的子组件更新父组件
- Angular 2更改检测,ngClass模型由同级组件更新,但模板确实更新了'不要精神抖擞
- 如何从父组件更新子组件的状态
- React - 如何在组件更新后获取真正的 DOM 元素
- 淘汰组件更新未被父视图模型订阅的可观察对象