Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 我应该发出哪个生命周期钩子请求并立即设置状态?_Performance_Reactjs_React Lifecycle - Fatal编程技术网

Performance 我应该发出哪个生命周期钩子请求并立即设置状态?

Performance 我应该发出哪个生命周期钩子请求并立即设置状态?,performance,reactjs,react-lifecycle,Performance,Reactjs,React Lifecycle,当我的组件挂载时,我需要从API请求它的内容。在: componentDidMount()在创建组件后立即调用 安装。需要DOM节点的初始化应该在这里进行。如果你 需要从远程端点加载数据,这是一个好地方 实例化网络请求 其内容如下: 在此方法中调用setState()将触发额外的呈现(…) 请谨慎使用此图案 因为它经常导致性能问题 向API发出请求并立即使用响应设置状态的最佳做法是什么?每当触发setState时,组件都将被重新呈现(无论生命周期事件如何) 请谨慎使用此模式 例如,如果您在组件中

当我的组件挂载时,我需要从API请求它的内容。在:

componentDidMount()在创建组件后立即调用 安装。需要DOM节点的初始化应该在这里进行。如果你 需要从远程端点加载数据,这是一个好地方 实例化网络请求

其内容如下:

在此方法中调用setState()将触发额外的呈现(…) 请谨慎使用此图案 因为它经常导致性能问题


向API发出请求并立即使用响应设置状态的最佳做法是什么?

每当触发
setState
时,组件都将被重新呈现(无论生命周期事件如何)

请谨慎使用此模式

例如,如果您在
组件中触发
setState
将接收道具
,并且您没有正确处理未来的道具,那么您可能会进入一个无休止的循环

我的建议是坚持使用
componentDidMount
,并在满足api请求后立即设置状态:

componentDidMount() {
  fetch('api-endpoint')
    .then(response => response.json())
    .then(result => this.setState({ stateProp: result }))
}

在收到响应后调用API并更新状态的最佳方法是使用
componentDidMount()
componentWillMount()

哪一个可能取决于您希望如何处理来自API调用的数据。如果需要访问组件DOM,则必须使用
componentDidMount()
。也就是说,除非您的数据不需要设置为
状态
,否则这两个选项都不会使您免于进行额外的重新渲染,在这种情况下,您可以将其保存到

《公约》甚至在以下文件中指出了这一点:

componentDidMount()
在安装组件后立即调用。需要DOM节点的初始化应该在这里进行如果需要从远程端点加载数据,这是实例化网络请求的好地方。


在呈现以调用api之前:

  componentWillMount(){
     fetch(api)
        .then((response)=>{
         this.setState({data:response.data});
   })
  componentDidMount(){
     fetch(api)
        .then((response)=>{
         this.setState({data:response.data});
   })}
}

渲染后调用api:

  componentWillMount(){
     fetch(api)
        .then((response)=>{
         this.setState({data:response.data});
   })
  componentDidMount(){
     fetch(api)
        .then((response)=>{
         this.setState({data:response.data});
   })}
在渲染以调用道具数据之前:

  componentWillReceiveProps(){         
         this.setState({data:this.props.data});

}

componentDidMount()
中调用api,并在
componentWillReceiveProps()中收到响应时更新状态。
我没有收到响应。我在哪里存储API的响应?发出请求的组件与接收响应的组件是相同的,因此,如果我没有错的话,这个钩子永远不会被调用,因为我的组件永远不会收到prop。如果你能告诉我你正在进行什么类型的API调用,我可以扩展我的答案,并给你一个更精确的解决方案。您正在获取数据吗?如果是这样,您将在React应用程序中使用什么样的数据?ComponentWillMount很快就会被弃用,它现在是不安全的。因此,请使用componentDidMount