反应组件消失时未调用componentWillUnmount方法

皮奇

我有一个问题,为什么在某些情况下componentWillUnmount即使卸载了我期望的组件也未调用method的问题

更具体地说,这是示例。让我们考虑一个带有一个按钮和2个孩子的Parent组件:Child_Odd和Child_Even。如果按钮的点击次数为奇数,则“显示为Child_Odd”,否则为“显示”为Child_Even。

我希望看到componentWillUnmount当组件“消失”时要调用方法,但是相反,这不会发生。在这里,堆栈闪电重现了案例(此堆栈闪电还包括componentWillUnmount实际调用方法的类似案例)。

这是相关代码

export class ChildFlipped extends React.Component {
  render() {
    return (
      <div>
        {this.props.name} - No of clicks ({this.props.numberOfClicks})
      </div>
    );
  }
}

export class ParentFlips extends React.Component {
  constructor(props: any) {
    super(props);
    this.state = {
      clickCounter: 0,
    };
  }
  render() {
    return (
      <div>
        <button
          onClick={() => this.updateState()}
        >
          Click me
        </button>
        {this.state.clickCounter % 2 ? (
          <ChildFlipped
            name={"Even"}
            numberOfClicks={this.state.clickCounter}
          ></ChildFlipped>
        ) : (
          <ChildFlipped
            name={"Odd"}
            numberOfClicks={this.state.clickCounter}
          ></ChildFlipped>
        )}
      </div>
    );
  }
  updateState() {
    this.setState((prevState, _props) => ({
      clickCounter: prevState.clickCounter + 1,
    }));
  }
}
Oblosys

由于组件保持安装状态,因此不会触发。关于和解,条件表达式

this.state.clickCounter % 2
? <ChildFlipped name={"Even"} numberOfClicks={this.state.clickCounter}/>
: <ChildFlipped name={"Odd"} numberOfClicks={this.state.clickCounter}/>

与...没有区别

<ChildFlipped name={this.state.clickCounter % 2? "Even" : "Odd"} 
              numberOfClicks={this.state.clickCounter}/>

因为两个子句都引用相同的ChildFlipped组件。如果添加密钥,则可以使它们与众不同并触发卸载:

his.state.clickCounter % 2
? <ChildFlipped key='even' name={"Even"} numberOfClicks={this.state.clickCounter}/>
: <ChildFlipped key='odd' name={"Odd"} numberOfClicks={this.state.clickCounter}/>

为了试验生命周期方法,我构建了一个React生命周期可视化器StackBlitz),这可能对您有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

UIViewController已经消失时,如何解决调用viewDidScroll的错误?

来自分类Dev

目标c-在视图消失时调用textFieldDidEndEditing

来自分类Dev

将组件调用方法反应到其他组件

来自分类Dev

TouchableHighlight的onPress()方法未调用组件方法

来自分类Dev

未为reactjs 0.13调用componentWillUnMount

来自分类Dev

加载/可见和卸载/消失时的UIView方法

来自分类Dev

从渲染方法中的嵌套函数反应调用组件的方法

来自分类Dev

反应-悬停在动态生成的组件调用渲染方法上

来自分类Dev

子组件未渲染-反应

来自分类Dev

基本反应组件未呈现

来自分类Dev

未调用子组件

来自分类常见问题

视图消失时退出EditMode

来自分类Dev

当视图消失时退出EditMode

来自分类Dev

为什么当“僵尸”消失时,坠机消失了?

来自分类Dev

为什么当“僵尸”消失时,坠机消失了?

来自分类Dev

为什么我的组件未调用其init方法?

来自分类Dev

反应路由器组件出现然后立即消失

来自分类Dev

反应/流星组件未正确传递道具

来自分类Dev

反应useCallback内存泄漏未安装的组件

来自分类Dev

组件未渲染-动态路由反应

来自分类Dev

反应未安装的组件状态更新错误

来自分类Dev

更改值后反应组件未更新

来自分类Dev

子组件未调用父组件函数

来自分类Dev

反应组件内的测试方法

来自分类Dev

反应在子组件中调用函数

来自分类Dev

在导入js中反应本机调用组件

来自分类Dev

如何使用反应按钮调用组件?

来自分类Dev

反应 如何在组件树中调用特定子对象的方法

来自分类Dev

对未监听组件的组件触发反应鼠标事件