【问题标题】:React Native: make API request, set State, and THEN render?React Native:发出 API 请求,设置状态,然后渲染?
【发布时间】:2017-10-22 14:54:38
【问题描述】:

对不起,如果这在文档中的某处很明显,但我试图等到我的状态设置在父组件上,然后再渲染子组件:

释义:

class Parent extends Component {

  componentWillMount() {
    firestack.database.ref()
      .then((snapshot) => {
        this.setState({myVal: snapshot.val})
      })
  }

  render() {
    // Renders before request finishes setting state,
    // Child component receives an undefined val
    return (
      <ChildComponent
        myVal={this.state.myVal}
      />
    )
  }
}

我的渲染在请求完成之前命中,所以我无法将新状态传递给子组件的构造函数。我怎样才能正确地做到这一点? 希望这对某人来说是唾手可得的成果。

【问题讨论】:

    标签: reactjs react-native async-await


    【解决方案1】:

    如果ChildComponent 需要myVal 参数,您只需在父级中执行此操作:

    return (
      {this.state.myVal !== undefined &&
        <ChildComponent
          myVal={this.state.myVal}
        />
      }
    )
    

    然后 react 会在第一次渲染空字符串,在改变状态后它会再次渲染填充 myVal 值。

    另外,正如另一个答案中提到的那样,使用componentDidMount 会更好。

    【讨论】:

      【解决方案2】:

      首先,我建议将您的异步请求移至componentDidMount。不是强制性的,但它是生命周期中更好的一点。无论如何,您的组件都需要能够处理myVal == undefined

      那么,在myVal 可用之前不要渲染子组件:

      render() {
        return (
          <div>
            { this.state.myVal && <ChildComponent myVal={this.state.myVal} /> }
          </div>
        )
      }
      

      或者,也可以渲染一个微调器:

      render() {
        return (
          <div>
            { this.state.myVal 
              ? <ChildComponent myVal={this.state.myVal} />
              : <Spinner />
            }
          </div>
        )
      }
      

      注意:

      • 你不能在 JSX 中使用if,所以为了保持语法紧凑,&amp;&amp; 的这种不太合理的使用是必需的。一种常见的模式。

      • 您可以使用 this.state.isReady 布尔值,而不是询问是否存在特定值。另一种常见的模式。

      • 如果 ChildComponent 是您要渲染的唯一元素,您可能不需要 &lt;div /&gt; 包装器,但您通常出于某种原因这样做。

      【讨论】:

      • this.state.myVal &amp;&amp; 构造有两个微妙之处。起初,它忽略了0 或其他虚假的非未定义值。它还为0 值输出0
      【解决方案3】:

      建议您在 componentDidMount 内进行 API 调用,而不是在 componentWillMount 内。 https://facebook.github.io/react/docs/react-component.html#componentdidmount

      在此方法中设置状态将触发重新渲染。

      【讨论】:

      • 是的,除了,这不会在我的子组件中设置状态,因为子组件的构造函数最初只被命中一次。
      • 您可以在constructor 中设置默认状态,在您的父母的渲染方法中检查值的初始化(如@lunochkin 的建议)或在您的孩子的渲染方法中检查值的初始化。跨度>
      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2021-06-02
      • 2021-06-25
      相关资源
      最近更新 更多