![](/img/trans.png)
[英]React prevent change state in child component when parent component update
[英]how to prevent child component from reload when the parent state is change
在一种情况下,父组件将imgkey
props
发送给子组件。 当子组件加载该图像时,它可以更改img
并通过回调更改其状态以返回到父级。
现在父组件具有其他功能,并且当其他功能更改状态时,子组件(图像)每次都会加载。如何防止在相同的imgkey
道具上重新加载?
总的来说,当父级发送与之前发送的道具相同的imgkey
,子级不应重新加载
我相信,如果孩子需要:
该组件将继续渲染,有时仅在需要时运行一些逻辑。
class Child extends Component {
static getDerivedStateFromProps(props, state) {
if (props.id % 10 === 0) {
return { shouldRunLogic: true };
}
return { shouldRunLogic: false };
}
constructor(props, context) {
super(props, context);
this.state = { shouldRunLogic: false };
}
componentDidMount() {
// Let's do our stuff once DOM mounted
this.handleSomeLogic();
}
componentDidUpdate(prevProps, prevState) {
// Do we need to call our logic again?
if (this.state.shouldRunLogic) {
this.handleSomeLogic();
}
}
handleSomeLogic() {
// do some stuff
this.props.onFinish('Child finished the logic');
}
render() {
// Makes sure we always render for children if any
return <div>{this.props.id}-{this.props.children}</div>;
}
}
该组件仅做一件事,并且在逻辑完成后再也不会重新渲染。
class DispensableChild extends Component {
constructor(props, context) {
super(props, context);
this.state = { isComplete: false };
}
componentDidMount() {
// Let's do our stuff once DOM mounted
this.handleSomeLogic();
}
shouldComponentUpdate(nextProps, nextState) {
return !this.state.isComplete;
}
handleSomeLogic() {
// do some stuff
// ...
// Let's make sure this component never render again
this.setState({ isComplete: true }, () => this.props.onFinish('DispensableChild finished the logic'));
}
render() {
return this.state.isComplete || <div>Doing some logic</div>;
}
}
包含两个子组件,但只有“子”组件将继续渲染。
class Parent extends Component {
constructor(props, context) {
super(props, context);
this.state = { childId: 1 };
this.handleFinish = this.handleFinish.bind(this);
}
componentDidMount() {
// Let's pass the prop every 15 secs
setInterval(() =>
this.setState(({ childId }) => ({ childId: childId + 1})), 15000);
}
handleFinish(message) {
console.log(message);
}
render() {
return (
<div>
<Child id={this.state.childId} onFinish={this.handleFinish} />
<DispensableChild id={this.state.childId} onFinish={this.handleFinish} />
</div>
);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.