为什么 ajax 请求应该在 React 组件的 componentDidMount 中完成?

IT技术 reactjs
2021-05-09 17:50:10

React 文档指出 ajax 请求应该从componentDidMount生命周期事件发起 (参见react 文档)。

为什么要举办这个活动?

在大多数情况下,当使用ajax加载数据时,我想显示某种加载栏,例如:

componentDidMount() {
   this.setState({isLoading: true});
   fetch(...)
      .then(...)
      .then(() => this.setState({isLoading: false})  
}

但这会触发render方法 3 次(初始渲染立即执行,然后设置isLoading = true,然后执行isLoading = false

componentWillMount事件发送ajax请求有什么问题

2个回答

嗯,isLoading: true可能是初始状态的一部分,组件挂载后无需设置 => 只有 2 个渲染,而不是 3 个。

根据https://github.com/reactjs/react-redux/issues/210render调用一次 from 的结果componentWillMount意味着如果setState将在之后异步调用render,它不会有任何影响(如果我正确理解评论)。

不确定回调是否有setState可能在之前执行render,因此不会看到加载屏幕,只有结果,因此有时它会“工作”(最有可能在 DEV 中)但实际上这将是一个竞争条件很难调试...

另见:https : //reactjs.org/docs/faq-ajax.html

重点是让您的react组件以初始状态呈现,以便您看到加载栏(加载:true)。

您可以在 componentWillMount() 中移动 line: this.setState({isLoading: true}) 。因为在 componentWillMount 中设置状态不会触发组件的重新渲染。您的渲染方法将获得更新的组件。