ismounted 反模式,跟踪自己的财产

IT技术 reactjs
2021-05-10 03:55:40

在阅读了文档的这一部分后,我正在学习 reactJs:

对于升级代码以避免 isMounted() 的任何人来说,一个简单的迁移策略是自己跟踪挂载状态。只需在 componentDidMount 中将 _isMounted 属性设置为 true 并在 componentWillUnmount 中将其设置为 false,然后使用此变量检查组件的状态。

这是否意味着该_isMounted值必须存储在state

到目前为止我有这个:

isMounted: function(){
    this.setState({ _isMounted: true });
},

componentDidMount: function() {
    if(this.state._isMounted) {  // This is bad.
        this.setState({...});
    }
},
2个回答

是的,你可以跟踪_isMountedstate,因为:

  1. 不能从 props 计算
  2. 你很可能会在 render()

通过https://twitter.com/dan_abramov/status/749710501916139520

例子

http://codepen.io/mikechabot/pen/GqvyOE

SomeComponent.jsx

class SomeComponent extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      _isMounted: false
    }
  }
  componentDidMount() {
    this.setState({
      _isMounted: true
    })
  }
  render() {
    const { _isMounted } = this.state;
    return (
      <div>
        Mounted? { _isMounted ? 'Yes' : 'No' }
      </div>
    )
  }
}

我也想知道如何解决这个反模式,最终使用了 lux 接受的答案。

后来发现使用状态同样糟糕,甚至导致双重渲染。

预期的反模式解决方法是外汇:

class MyComponent extends React.Component {

    constructor(props) {
        super(props);
        this._isMounted = undefined;
    }

    componentDidMount() {
        this._isMounted = true;
    }

    componentWillUnmount() {
      this._isMounted = false;
    }
}