为什么不推荐在willMount中调用ajax?
在componentWillMount
执行ajax
,对ajax
的结果进行setState
,即使ajax
的返回结果在render之前,也会引起新的render
,不会和原来的state
进行合并,进行一次render
,为什么?
这就需要了解JavaScript
的执行机制了,JavaScript
是单线程,分为“当前线程”和任务队列。
ajax
的执行结果会放到任务队列中,等主线程执行完后采取读取任务队列中的任务进行执行。
虽然setState
也是异步的,但是他们不在同一个“任务单元”中,执行上下文已发生改变,所以是不可能被合并的。不仅在willmount
中ajax
回调中的setState
不会和外面同步调用的setState
合并,所以异步的回调都不会。
这样的话,就没必要在willmount
中调用ajax
,以避免理解不到位,对state
的结果预计错误。didMount
的执行很明了,不会引起歧义,所以在didMount
中最合理了。
在willMount中调用ajax不是错误,只是不推荐。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…