在 React 中,parent 中道具的变化会导致 child 中的相应更新吗?
In react, will change in props in parent result in a corresponding updation in the child?
react ( https://reactjs.org/docs/react-component.html ) 的官方文档说 props 中的更新会导致 child 被更新,但它不会发生在我的代码中。我错过了什么吗?
我创建了一个 parent 组件 (Y) 和一个 child 组件 (X)。 parent 将 currentTime 作为道具传递给 child。即使在 3 秒后 parent 中的道具发生变化(由于 setTimeout),child 中 h2 标签中的值也不会改变。
我在 React 的官方页面 (https://reactjs.org/docs/react-component.html ) 上发现 "An update can be caused by changes to props or state." (我在下面的官方网站上附上了截图以及文本)此外,我发现那里"These methods are called when a component is being re-rendered:"
componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()
但在我的例子中,道具的变化不会导致 child 中 h2 标签的值发生变化。官方文档说 props 的更新会导致 child 被更新,但它不会发生在我的代码中。我错过了什么吗?
我把我的代码贴在这里以供参考。
const Y = () => {
let currentTime="09:00";
setTimeout(()=> {
currentTime = "10:00:"
}, 3000);
return (
<X time={currentTime}/>
);
};
class X extends Component {
time = "11:00";
render = () => {
return (
<h2>{this.props.time}</h2>
);
};
}
更新:
Shubham Khatri "The props for the child will only change if the parent re-renders" 的评论确实帮助我理解了。 :)
即使在组件 Y 中更改了道具值 currentTime,它也不会再次重新渲染,因此子道具不会更新。如果将 currentTime 存储在父状态中,然后使用 setState 设置 Y 组件的状态,它会触发组件的重新渲染,因此子组件 X
会收到新的道具
class Y extends Component {
state = {
currentTime: "9:00 AM"
};
componentDidMount() {
setTimeout(() => {
this.setState({currentTime: "10:00"}
}, 3000);
}
render() {
return (
<X time={currentTime}/>
);
}
};
class X extends Component {
render = () => {
return (
<h2>{this.props.time}</h2>
);
};
}
父组件中的setTimeout只是改变currentTime变量的值。父函数中的渲染函数不会重新渲染,因此它会更新子函数。
您需要在父组件中为 currentTime 设置状态。
this.state = {
currentTime:"09:00"
}
现在你可以做
componentDidMount() {
setTimeout(() => {
this.setState({ currentTime: "10:00" }
}, 3000);
}
这将使父级重新渲染,子级将使用新属性进行更新。
react ( https://reactjs.org/docs/react-component.html ) 的官方文档说 props 中的更新会导致 child 被更新,但它不会发生在我的代码中。我错过了什么吗?
我创建了一个 parent 组件 (Y) 和一个 child 组件 (X)。 parent 将 currentTime 作为道具传递给 child。即使在 3 秒后 parent 中的道具发生变化(由于 setTimeout),child 中 h2 标签中的值也不会改变。
我在 React 的官方页面 (https://reactjs.org/docs/react-component.html ) 上发现 "An update can be caused by changes to props or state." (我在下面的官方网站上附上了截图以及文本)此外,我发现那里"These methods are called when a component is being re-rendered:"
componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()
但在我的例子中,道具的变化不会导致 child 中 h2 标签的值发生变化。官方文档说 props 的更新会导致 child 被更新,但它不会发生在我的代码中。我错过了什么吗?
我把我的代码贴在这里以供参考。
const Y = () => {
let currentTime="09:00";
setTimeout(()=> {
currentTime = "10:00:"
}, 3000);
return (
<X time={currentTime}/>
);
};
class X extends Component {
time = "11:00";
render = () => {
return (
<h2>{this.props.time}</h2>
);
};
}
更新: Shubham Khatri "The props for the child will only change if the parent re-renders" 的评论确实帮助我理解了。 :)
即使在组件 Y 中更改了道具值 currentTime,它也不会再次重新渲染,因此子道具不会更新。如果将 currentTime 存储在父状态中,然后使用 setState 设置 Y 组件的状态,它会触发组件的重新渲染,因此子组件 X
会收到新的道具class Y extends Component {
state = {
currentTime: "9:00 AM"
};
componentDidMount() {
setTimeout(() => {
this.setState({currentTime: "10:00"}
}, 3000);
}
render() {
return (
<X time={currentTime}/>
);
}
};
class X extends Component {
render = () => {
return (
<h2>{this.props.time}</h2>
);
};
}
父组件中的setTimeout只是改变currentTime变量的值。父函数中的渲染函数不会重新渲染,因此它会更新子函数。
您需要在父组件中为 currentTime 设置状态。
this.state = {
currentTime:"09:00"
}
现在你可以做
componentDidMount() {
setTimeout(() => {
this.setState({ currentTime: "10:00" }
}, 3000);
}
这将使父级重新渲染,子级将使用新属性进行更新。