描述:
官方建议把ajax写到componentdidmount中,
在render之前,在componentwillmount中执行setState不会重新render
但是如果写在componentwillmount中的setState在render之后执行,比如设置了定时器,setState后,也会造成重新render
写在componentdidmount中的ajax,一定是在第一次render之后再render的
问题:
既然如上所述,那把ajax写在componentwillmount中不是更好吗?
理由:
如果ajax的执行在render之前得到了值,并setState,那就执行一次render。
如果在第一次render之后得到了值,那就如同componentdidmount一样再次render就行,这样有可能还省去一些render。
虽然reactjs的diff算法很快,但两次的render肯定没有一次效率高
为什么不推荐在willMount中调用ajax?
在
componentWillMount
执行ajax
,对ajax
的结果进行setState
,即使ajax
的返回结果在render之前,也会引起新的render
,不会和原来的state
进行合并,进行一次render
,为什么?这就需要了解
JavaScript
的执行机制了,JavaScript
是单线程,分为“当前线程”和任务队列。ajax
的执行结果会放到任务队列中,等主线程执行完后采取读取任务队列中的任务进行执行。虽然
setState
也是异步的,但是他们不在同一个“任务单元”中,执行上下文已发生改变,所以是不可能被合并的。不仅在willmount
中ajax
回调中的setState
不会和外面同步调用的setState
合并,所以异步的回调都不会。这样的话,就没必要在
willmount
中调用ajax
,以避免理解不到位,对state
的结果预计错误。didMount
的执行很明了,不会引起歧义,所以在didMount
中最合理了。