我很好奇,爲什麼在這種情況下做出反應的更新的子組件:爲什麼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