Vue.js - 应该使用哪个组件生命周期来获取数据?

Posted

技术标签:

【中文标题】Vue.js - 应该使用哪个组件生命周期来获取数据?【英文标题】:Vue.js - Which component lifecycle should be used for fetching data? 【发布时间】:2019-01-04 08:23:51 【问题描述】:

在阅读了一篇关于 Vue 的 Alligator.io 帖子后,该帖子说挂载的生命周期是使用 http get 的坏地方。我想知道是否有关于如何正确从 Vue.js 中的 API 获取数据的指南?

【问题讨论】:

Which VueJS lifecycle hook must Asynchronous HTTP requests be called in?的可能重复 好吧,我要求更深入的解释,是的,我知道这 3 个挂钩被认为是好的,但为什么在这种情况下,mounted 被认为是坏的。 @kkot 您的问题得到解答还是希望进一步解释? 【参考方案1】:

回答

最好的钩子是 mountedbeforeMounted 预计会有一些边缘情况

为什么?

    Vue 可以缓存组件,created 钩子不保证 Vue 会在下一次挂载时应用它。有时你会发现你的组件已经保存了状态。因此,如果您没有看到组件,并不意味着它还没有被创建。 s-s-r:如果你想获得一个通用组件,将任何 fetch 方法放置到created 挂钩是无效的。您只会在 s-s-r 渲染时收到错误消息。并且挂载的钩子只在客户端工作

如果您关心性能和时间,请不要。无论如何,提取将在createdmounted 钩子之后完成,因为钩子是同步的,而提取不是。 createdbeforeMounted 之间的时间也很短。

如果你不规划 s-s-r 并且你知道 Vue 是如何工作的并且你真的需要把它放到 created 钩子上,你可以把它放到 created

【讨论】:

【参考方案2】:

答案是有道理的,但如果我们使用 mounted() 钩子来调用 API,假设 DOM 已呈现。如果我们在 mounted() 中更新一个状态,它会触发另一个渲染吗?

我确信在 created() 钩子中 DOM 尚未安装。所以,我可能会选择 created()

【讨论】:

这实际上是一个答案还是一个额外的问题/评论?【参考方案3】:

created() 生命周期挂钩满足了获取和处理 API 数据的所有要求。

然而,官方 Vue 文档在示例代码中使用了 mounted() 生命周期钩子,用于与 axios 进行集成 API 调用: https://vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

mounted()created() 两个生命周期钩子都广泛用于获取 API 数据并被认为是良好的做法。

【讨论】:

【参考方案4】:

我更喜欢在创建的钩子中调用 API。来自 alligator.io 的引述:

在 created 钩子中,您将能够访问反应数据并且事件处于活动状态。模板和虚拟 DOM 尚未安装或渲染。

因此,如果需要,您可以轻松访问数据以解析和保存来自服务器的响应。

问候。

【讨论】:

以上是关于Vue.js - 应该使用哪个组件生命周期来获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

在调度过程之后和渲染之前在反应生命周期中调用哪个方法

在 Vue.js2 中使用哪个生命周期钩子在页面加载时调用函数?

vue.js生命周期钩子函数及缓存

Vue.js 子组件生命周期

Vue.js 子组件的异步加载及其生命周期控制

组件的生命周期