【问题标题】:ComponentWillMount and ComponentDidMount not syncedComponentWillMount 和 ComponentDidMount 未同步
【发布时间】:2018-04-13 21:07:34
【问题描述】:

我正在制作一个反应应用程序。我需要调用ajax 从服务器获取数据并将这些数据填充到组件表的行中。我在componentWillMount 中调用ajax 并将响应存储在状态中。现在我的渲染获取了这个状态并填充它。不过我有几个问题:

  1. ajax 放入componentWillMount 中是否正确?
  2. 我的componentDidMount 没有得到在componentWillMount 中设置的state 的值。这意味着当componentDidMount 试图访问它时异步未完成。如何解决这个问题?设置async:false 确实是个糟糕的选择。

  3. componentWillMount中可以使用什么东西?

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    在 componentWillMount 中放置 ajax 是否正确?

    推荐的方法是将修改状态的初始网络请求放在 componentDidMount 内,因为理论上您的 ajax 请求可能会在 React 完成安装过程之前返回,这可能会导致您的状态被覆盖。

    但是,实际上人们会同时使用这两种方法,因为上述情况绝不应该发生。

    我的 componentDidMount 没有得到设置的状态值 组件WillMount。这意味着异步未完成,而 componentDidMount 正在尝试访问它。

    这是正确的行为。

    如何解决这个问题?环境 async:false 确实是个糟糕的选择。

    如果你停止它,那么它就不再是异步的了。

    这里的最佳做法是显示加载指示器:

    1. loading 属性添加到state
    2. 将其设置为true,就在您的fetch 请求上方
    3. .then.catch 内部将loading 设置为false
    4. render 内部检查您的data 是否已到达 - 如果没有显示loading 指示符

    如果您在请求返回之前不想显示任何内容

    您可以在render 中使用return null,这将阻止您的组件被添加到DOM。然后,您可以将其与标志状态属性结合使用,以确保一旦您的请求返回,组件就会被挂载,例如:

    render() {
       if (!this.state.initialRequestHasCompleted) return (null);
       return (
          <div>
             ...
          </div>
       );
    }
    

    componentWillMount 中可以使用哪些东西?

    What is the purpose of having functions like componentWillMount in React.js?

    【讨论】:

      【解决方案2】:
      1. 是的,componentWillMount 在渲染之前被调用一次。这是获取数据的地方。

      2. 可能在组件完成渲染时,虽然异步操作尚未完成,但调用了componentDidMount,因此您得到空结果。

      你可以使用componentWillUpdate

      componentWillUpdate() 在新渲染之前立即调用 正在接收道具或状态。以此为契机 在更新发生之前进行准备。不调用此方法 用于初始渲染。

      shouldComponentUpdate

      shouldComponentUpdate() 在渲染新道具时被调用 或状态正在接收。默认为真。这种方法不 在初始渲染或使用 forceUpdate() 时调用。

      1. 这是一个宽泛的问题,基本上是从操作中获取数据、调用 api 等。

      更多信息docs

      【讨论】:

      • 那么我在哪里可以执行使用在componentWillMount中设置的状态的操作?是否应该在 componentWillUpdate 中执行操作?
      • 是的,在componentWillUpdate() 中插入一个条件来检查异步操作的结果是否在状态内,如果是,您可以继续执行您的逻辑。
      • 实际上没有“如果是这样”的空间。我需要以任何方式执行该操作。最好的方法是什么?
      • 什么意思? componentWillUpdate(nextProps, nextState) {if (nextState.dataFromAsync) {doSomething()}}
      猜你喜欢
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多