Мне любопытно, почему Реагировать обновления Младенец компонентов в этом случае:Почему 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'));
Когда компонент Outer нажата, метод визуализации внутренней и внешней называются. Поскольку компоненты должны быть «чистыми», нет необходимости называть метод визуализации 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