当前位置: 首页 > 面试题库 >

我可以在React的componentWillMount中调用API吗?

司徒钱青
2023-03-14
问题内容

我正在研究过去1年的反应。我们遵循的约定是componentDidMount在数据到达后进行API调用,获取数据和setState。这将确保组件已安装并且设置状态将导致重新渲染该组件,但我想知道为什么我们不能在componentWillMount或中设置setState。constructor

官方文件说:

在挂载发生之前立即调用componentWillMount()。在render()之前调用它,因此在此方法中设置状态不会触发重新渲染。避免在此方法中引入任何副作用或订阅。

它说setting state in this method will not trigger a re- rendering,我在进行API调用时不需要。如果我能够获取数据并能够设置状态(假设API调用确实非常快),componentWillMount或在constructor第一个渲染中存在数据,为什么我要完全重新渲染?

如果API调用速度很慢,那么setState它将是异步的并且componentWillMount已经返回,那么我将能够setState并进行重新渲染。

总体而言,我很困惑为什么我们不应该在构造函数或componentWillMount中进行API调用。有人真的可以帮助我了解在这种情况下反应如何起作用吗?


问题答案:

1.componentWillMount并重新渲染

比较这两种componentWillMount方法。
一种导致额外的重新渲染,一种没有

componentWillMount () {
  // This will not cause additional re-render
  this.setState({ name: 'Andrej '});
}

componentWillMount () {
  fetch('http://whatever/profile').then(() => {
    // This in the other hand will cause additional rerender,
    // since fetch is async and state is set after request completes.
    this.setState({ name: 'Andrej '});
  })
}




2.在哪里调用API调用?

componentWillMount () {
  // Is triggered on server and on client as well.
  // Server won't wait for completion though, nor will be able to trigger re-render
  // for client.
  fetch('...')
}

componentDidMount () {
  // Is triggered on client, but never on server.
  // This is a good place to invoke API calls.
  fetch('...')
}

如果要在服务器上进行渲染,并且组件确实需要数据进行渲染,则应在组件外部获取(并等待完成),然后通过prop传递数据,然后将组件渲染为字符串。



 类似资料:
  • 问题内容: 在React的官方文档中,它提到- 如果您熟悉React类的生命周期方法,则可以将useEffect Hook视为componentDidMount,componentDidUpdate和componentWillUnmount的组合。 我的问题是-我们如何在钩子中使用lifecyle方法? 问题答案: 你不能使用任何现有的生命周期方法(,,在钩等)。它们只能在类组件中使用。并且使用挂

  • 在React的官方文件中提到- 如果您熟悉React类生命周期方法,那么可以将useEffect钩子看作componentDidMount、componentDidUpdate和componentWillUnmount的组合。 我的问题是--我们如何在钩子中使用生命周期方法?

  • 问题内容: 好吧,这可能是一个愚蠢的问题,但我想澄清原因。React- Native导入了nodeJS库,因此尽管reactJS包含纯HTML组件,但我认为也可以使用reactJS库。 React Native可以识别包括HTML的reactJS组件吗? 问题答案: 库实际上没有与浏览器DOM HTML相关的任何内容。与它相关的所有内容都被打包。React Native不会也不能使用此库,因为您在

  • 问题内容: 我已经搜索过网络,到目前为止,我所看到的是您可以一起使用和含义: 要么 是有效的,但是当我使用此代码时,得到的是: 对于第一个,除了与相同。对于第二个。 问题是什么?我不能使用和在一起?还是正常?是我可以检查连接是否全部有效的方法吗?() 问题答案: 不,你不能使用和在一起。它们是独立的API,它们创建的资源彼此不兼容。 虽然有一个。

  • 问题内容: 假设我有类,并且其中的类具有可读和可写的属性: 是否可以只使用该方法而只使用该方法? 问题答案: 不可以,无法分配每个类别的访问权限。 考虑将您的类分为单独的接口,以便每个类仅获得一个具有所需接口的对象。例如: 当然,这涉及安全性,但这应该使您朝正确的方向进行思考。

  • 问题内容: 在Python中,我有一个 模块 myModule.py,其中定义了一些函数和一个 main() ,它接受了一些命令行参数。 我通常从bash脚本中调用此main()。现在,我想将所有内容放入一个小 包装中 ,因此我想也许可以将我简单的bash脚本转换为Python脚本并将其放入包装中。 因此,实际上如何 从 MyFormerBashScript.py 的main()函数 调用 myM