vlambda博客
学习文章列表

Ajax 请求到底应该放在 created 里还是 mounted 里【Vue小知识】

大家好,我是哈默。

这篇文章我们研究一下 Vue 中的 Ajax 请求到底应该放在 created 里还是 mounted 里。

示例代码

首先,我们先来看一下示例代码,如下:

我们简单介绍一下示例代码。

首先,我们定义了一个数据 list,默认是空数组。

然后,我们定义了一个 API 请求,getData。

最后,我们还定义了两个生命周期钩子 created 和 mounted。

先放在 created 里

首先我们先将请求放在 created 里,如下:

Ajax 请求到底应该放在 created 里还是 mounted 里【Vue小知识】

这个时候,我们是能够成功发送 API 请求获取到数据的,控制台会打印 created,mounted。

再放在 mounted 里

然后我们先将请求放在 mounted 里,如下:

Ajax 请求到底应该放在 created 里还是 mounted 里【Vue小知识】

这个时候,也能够成功发送 API 请求获取到数据的,并且控制台也会打印 created,mounted。

分析在 created 里的情况

在进行深入分析之前,我们首先要知道一点:created 和 mounted 都是同步的,API请求是异步的。

我们可以来分析一下下面的这段代码:

Ajax 请求到底应该放在 created 里还是 mounted 里【Vue小知识】

在这里,首先会打印 created。

然后执行到 this.getData() 的时候,会发送 API 请求出去。注意,仅仅是发送了请求,请求并没有完成。这里可以类比 setTimeout,当我们 setTimeout(fn, 1000) 的时候,定时器 timer 会马上设置,但是 fn 并不会马上执行,而是 1 s 以后才可能执行。

然后,我们打印 mounted,此时通过 ulRef,获取 ul 里的内容,是空字符串,也就是 API 请求数据还没回来。

最后,当 mounted 也执行完了,所有同步代码执行完毕,请求的回调函数才会执行,最终将 data 赋值给 list 数据,并且触发 uptated,重新渲染组件,这部分代码如下:

总结一下,如果将 API 请求放到 created 里的话,实际上是这样一个过程:

created => API请求 => 获取数据 => 组件重新渲染

           => mounted => 组件首次渲染

也就是说,再发送 API 请求以后,就会产生 2 个分支,代码逻辑比较混乱。

再来分析 mounted 里的情况

放在 mounted 里的话,逻辑就会清晰很多,让我们来看一下如下的代码:

解释一下,首先我们会打印 created。

然后,我们会打印 mounted,组件会首次渲染。

接着,我们就会发送 API 请求,获取数据,得到数据以后,就会重新渲染组件。

可以看到整个逻辑是这样的:

created => mounted =>  组件首次渲染 => API请求 => 获取到数据 => 组件重新渲染

可以看到,没有分支,只有一个流程。

总结

总结一下,哈默我是更倾向于放在 mounted 里,因为其实放在哪差别并不大,但是在 mounted 里整体逻辑会更清晰一点。