react异步数据如ajax请求应该放在哪个生命周期?

摘要:
在componentDidMount或componentWillMount周期中请求接口数据更好吗?为什么必须在componentDidMount中调用React数据采集?对于同步状态更改,可以将其放置在componentWillMount中。对于异步状态更改,最好将其放置在componentDidMount中。React异步渲染组件优化

react请求接口数据是在componentDidMount 还是componentWillMount周期好?React数据获取为什么一定要在componentDidMount里面调用?

对于同步的状态改变,是可以放在componentWillMount,对于异步的,最好好放在componentDidMount。但如果此时有若干细节需要处理,比如你的组件需要渲染子组件,而且子组件取决于父组件的某个属性,那么在子组件的componentDidMount中进行处理会有问题:因为此时父组件中对应的属性可能还没有完整获取,因此就让其在子组件的componentDidUpdate中处理。

至于为什么,先看看react的生命周期:

constructor() 》componentWillMount() 》render() 》componentDidMount()

上面这些方法的调用是有次序的,由上而下,也就是当说如果你要获取外部数据并加载到组件上,只能在组件"已经"挂载到真实的网页上才能作这事情,其它情况你是加载不到组件的。

componentDidMount方法中的代码,是在组件已经完全挂载到网页上才会调用被执行,所以可以保证数据的加载。此外,在这方法中调用setState方法,会触发重渲染。所以,官方设计这个方法就是用来加载外部数据用的,或处理其他的副作用代码。

constructor被调用是在组件准备要挂载的最一开始,所以此时组件尚未挂载到网页上。

componentWillMount方法的调用在constructor之后,在render之前,在这方法里的代码调用setState方法不会触发重渲染,所以它一般不会用来作加载数据之用,它也很少被使用到。

一般的从后台(服务器)获取的数据,都会与组件上要用的数据加载有关,所以都在componentDidMount方法里面作。虽然与组件上的数据无关的加载,也可以在constructor里作,但constructor是作组件state初绐化工作,并不是设计来作加载数据这工作的,所以所有有副作用的代码都会集中在componentDidMount方法里。

constructor()中获取数据的话,如果时间太长,或者出错,组件就渲染不出来,你整个页面都没法渲染了。

componentDidMount()中能保证你的组件已经正确渲染。

总结下:

1.跟服务器端渲染(同构)有关系,如果在componentWillMount里面获取数据,fetch data会执行两次,一次在服务器端一次在客户端。在componentDidMount中可以解决这个问题。

2.在componentWillMount中fetch data,数据一定在render后才能到达,如果你忘记了设置初始状态,用户体验不好。

3.react16.0以后,componentWillMount可能会被执行多次。

参考:

segmentfault: React数据获取为什么一定要在componentDidMount里面调用?

React 异步渲染组件优化

免责声明:文章转载自《react异步数据如ajax请求应该放在哪个生命周期?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇经典的CSS代码(转)(1)OracleClient数据库操作(淘汰)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据批量导入HBase

测试数据: datas 1001 lilei 17 13800001111 1002 lily 16 13800001112 1003 lucy 16 13800001113 1004 meimei 16 13800001114 数据批量导入使用mr,先生成HFile文件然后在用completebu...

React全家桶

React全家桶入门Demo http://react-china.org/t/react-demo/22800 最具性价比的一套就看react_home吧,从react出来就有的开源项目,react脚手架 https://github.com/aiyuekuang/react_home...

unity_数据结构(常见数据结构及适用场景)

常见的数据结构: 1.Array: 最简单的数据结构 特点:数组存储在连续的内存上。数组的内容都是相同类型。数组可以直接通过下标访问。优点:由于是在连续内存上存储的,所以它的索引速度非常快,访问一个元素的时间是恒定的也就是说与数组的元素数量无关,而且赋值与修改元素也很简单。缺点:由于是连续存储,所以在两个元素之间插入新的元素就变得不方便。声明一个新的数组时...

RN app打包

最近使用React Native做起了移动应用,之前做过一点react,有一点react基础,后来听说RN还不错,就做起了RN项目。为了让辛辛苦苦开发的项目想在手机端运行,就涉及到发布打包。 防止自己长时间不用忘记了,这里做一下笔记,在记录点滴的同时,希望可以帮助正在奋斗的你。 好啦,不多说了,直接说详细的步骤,请认真读完,相信你,也可以轻轻松松发布你的a...

Confluence 6 数据导入和导出

Confluence 管理员和用户可以从各种方法向  Confluence 中导入数据。针对不同的导入方式,有关权限的要求也是不相同的。请参考页面 Import Content Into Confluence 中内容。 你也可以将你 Confluence 中的内容导出成各种不同的格式,请参考页面 Export Content to Word, PDF, H...

如何用R来处理数据表的长宽转换(图文详解)

不多说,直接上干货! 很多地方都需用到这个知识点,比如Tableau里。 通常可以采取如python 和 r来作为数据处理的前期。 Tableau学习系列之Tableau如何通过数据透视表方式读取数据文件(图文详解)如何用Python来处理数据表的长宽转换(图文详解) 数据长宽转换是很常用的需求,特别是当是从Excel中导入的汇总表时,常常需要转换成一维表...