Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React.js拒绝注意更改_Reactjs_Typescript - Fatal编程技术网

Reactjs React.js拒绝注意更改

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

在某些情况下,React似乎不会将状态更改传播到子组件中

最小示例

我试图将我观察到的行为归结为我能找到的最小的测试用例,但结果还是相当大。很抱歉

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
inside
inside
,那么它实际上会更新。当然,我需要在我的应用程序中使用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
  • 内部
    重新渲染-其道具已更改,但其状态未更改

  • 啊,啊,啊。非常感谢。这让事情变得更清楚了。非常感谢。这让事情变得更清楚了。非常感谢。这让事情变得更清楚了。非常感谢。这让事情变得更加清楚。