我很好奇,为什么在这种情况下做出反应的更新的子组件:为什么React调用未更改组件的渲染方法?
function Inner(props) {
console.log("Render Inner");
return <div>Inner</div>;
}
export class Outer extends React.Component {
constructor(props) {
super(props);
this.state = {
active: false
};
this.onClick = this.rawOnClick.bind(this);
}
render() {
console.log("Render Outer");
return <div onClick={this.onClick} style={{ backgroundColor: this.state.active ? 'red': 'blue'}}><Inner/></div>;
}
rawOnClick(event) {
this.setState({ active: !this.state.active });
}
}
ReactDOM.render(<Outer/>, document.getElementById('app'));
当组件外被点击时,内,外的渲染方法被调用。由于组件应该是“纯”的,所以不需要调用Inner的渲染方法,是吗?我甚至可以让它这样,如果我重写我的代码一点点:
export function Inner(props) {
console.log("Render Inner");
return <div>Inner</div>;
}
export class Outer2 extends React.Component {
constructor(props) {
super(props);
this.state = {
active: false
};
this.onClick = this.rawOnClick.bind(this);
}
render() {
console.log("Render Outer");
return <div onClick={this.onClick} style={{ backgroundColor: this.state.active ? 'red': 'blue'}}>{this.props.children}</div>;
}
rawOnClick(event) {
this.setState({ active: !this.state.active });
}
}
ReactDOM.render(<Outer2><Inner /></Outer2>, document.getElementById('app'));
现在,当我点击该组件只有“Outer2”的渲染方法被调用。这是故意的吗?这是一项任务优化,还是我错过了一些重要的事情?
谢谢。
Peter
查看更多文档后,我发现我想要的东西:我需要:'this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this);'在构造函数中,它具有我期望的行为。我仍然觉得这很奇怪,文档会一直谈论这种“纯粹”渲染,然后忽略它(特别是在“功能”组件中)。但我可以处理。谢谢大家。 – ptriller
对不起,我只需要使用'React.PureComponent'作为基类,并且我有我想要的行为。 – ptriller