Reactjs React.js拒绝注意更改
在某些情况下,React似乎不会将状态更改传播到子组件中 最小示例 我试图将我观察到的行为归结为我能找到的最小的测试用例,但结果还是相当大。很抱歉Reactjs React.js拒绝注意更改,reactjs,typescript,Reactjs,Typescript,在某些情况下,React似乎不会将状态更改传播到子组件中 最小示例 我试图将我观察到的行为归结为我能找到的最小的测试用例,但结果还是相当大。很抱歉 class Inner extends React.Component<{ value: number }, { value: number }> { constructor(props: { value: number }) { super(props); this.state = { value: props.v
class Inner extends React.Component<{ value: number }, { value: number }> {
constructor(props: { value: number }) {
super(props);
this.state = { value: props.value };
}
render() {
return <span> { this.state.value } </span>
}
}
class Test extends React.Component<{}, { value: number }> {
constructor(props: {}) {
super(props);
this.state = { value: 0 };
setTimeout(() => { this.setState({ value: 1 }); }, 500);
}
render() {
return <span>
<Inner value={ this.state.value } />
</span>;
}
}
React.render(<Test />, document.getElementById('somediv'));
类内部扩展React.Component{
构造函数(props:{value:number}){
超级(道具);
this.state={value:props.value};
}
render(){
返回{this.state.value}
}
}
类测试扩展了React.Component{
构造函数(props:{}){
超级(道具);
this.state={value:0};
setTimeout(()=>{this.setState({value:1});},500);
}
render(){
返回
;
}
}
React.render(,document.getElementById('somediv'));
快速总结
测试在其状态中具有“值”,该值通过传递到内部组件“内部”并由其显示
在测试的构造函数方法中,我将value
on状态设置为0。500毫秒后,我将其设置为1。我希望这会改变Inner的显示,使其也显示1,因为它取决于this.state
中的值,但它不是。为什么不呢
非常奇怪的是,如果我将return{this.state.value}
行更改为this.props.value
insideinside
,那么它实际上会更新。当然,我需要在我的应用程序中使用state,我从中提取了这个示例
我想我在这里遗漏了一些基本的部分。它是什么?当组件实例第一次创建时,内部
的构造函数只运行一次
因此,这只运行一次,而不是每次道具更改时:
this.state = { value: props.value };
因此,如果您将新道具传递到内部
,则this.props.value
的值将更改,但this.state.value
的值不会更改
现在情况就是这样:
超时调用Test
上的setValue
,并更新Test
反应重新呈现测试
作为渲染过程的一部分,Test
将新的prop值传递到internal
内部
重新渲染-其道具已更改,但其状态未更改
当第一次创建组件实例时,internal
的构造函数只运行一次
因此,这只运行一次,而不是每次道具更改时:
this.state = { value: props.value };
因此,如果您将新道具传递到内部
,则this.props.value
的值将更改,但this.state.value
的值不会更改
现在情况就是这样:
超时调用Test
上的setValue
,并更新Test
反应重新呈现测试
作为渲染过程的一部分,Test
将新的prop值传递到internal
内部
重新渲染-其道具已更改,但其状态未更改
当第一次创建组件实例时,internal
的构造函数只运行一次
因此,这只运行一次,而不是每次道具更改时:
this.state = { value: props.value };
因此,如果您将新道具传递到内部
,则this.props.value
的值将更改,但this.state.value
的值不会更改
现在情况就是这样:
超时调用Test
上的setValue
,并更新Test
反应重新呈现测试
作为渲染过程的一部分,Test
将新的prop值传递到internal
内部
重新渲染-其道具已更改,但其状态未更改
当第一次创建组件实例时,internal
的构造函数只运行一次
因此,这只运行一次,而不是每次道具更改时:
this.state = { value: props.value };
因此,如果您将新道具传递到内部
,则this.props.value
的值将更改,但this.state.value
的值不会更改
现在情况就是这样:
超时调用Test
上的setValue
,并更新Test
反应重新呈现测试
作为渲染过程的一部分,Test
将新的prop值传递到internal
内部
重新渲染-其道具已更改,但其状态未更改
啊,啊,啊。非常感谢。这让事情变得更清楚了。非常感谢。这让事情变得更清楚了。非常感谢。这让事情变得更清楚了。非常感谢。这让事情变得更加清楚。