ChatGPT解决这个技术问题 Extra ChatGPT

Vue.js 中创建事件和挂载事件的区别

Vue.js 文档描述了 createdmounted 事件,如下所示:

created

创建实例后同步调用。在这个阶段,实例已经完成了对选项的处理,这意味着已经设置了以下内容:数据观察、计算属性、方法、监视/事件回调。但是,安装阶段尚未开始,$el 属性将不可用。

mounted

在实例刚刚挂载后调用,其中 el 被新创建的 vm.$el 替换。如果根实例挂载到文档内元素,则调用 mount 时 vm.$el 也将在文档内。在服务器端渲染期间不会调用此挂钩。

我理解这个理论,但我有两个关于实践的问题:

是否有任何情况下 created 会被过度安装使用?在现实生活(真实代码)情况下,我可以将创建的事件用于什么?

created 被较早调用,因此触发从 API 后端获取数据是有意义的。
可以确认,Fullstack Vue 书中的示例都使用 created() 来调度 api 调用的动作。
@EgorStambakio如果我不在我的组件中使用created并且我只使用mounted,在mounted中调用api几乎不一样?我的意思是created hook将被跳过,因为它不会被调用。
@LastM4N 您可以在已安装的情况下执行此操作,这是您的选择。但是因为钩子是同步运行的,所以你想在正确的地方做。由于 API 调用与 DOM 无关,它属于 created 钩子。
@wittgenstein 好的,我们同意,尽管 Vue 官方文档使用挂载钩子 vuejs.org/v2/cookbook/using-axios-to-consume-apis.html

V
Vamsi Krishna

created() :由于选项的处理已完成,您可以访问响应式 data 属性并根据需要更改它们。在这个阶段 DOM 尚未安装或添加。所以你不能在这里做任何 DOM 操作

mounted():在 DOM 安装或渲染后调用。在这里,您可以访问 DOM 元素并且可以执行 DOM 操作,例如获取 innerHTML:

console.log(element.innerHTML)

所以你的问题:

是否有任何情况下 created 会被过度安装使用?

Created 通常用于从后端 API 获取数据并将其设置为数据属性。但是在 SSR mounted() 钩子中不存在,您需要执行任务,例如在创建的钩子中获取数据

在现实生活(真实代码)情况下,我可以将创建的事件用于什么?

用于从外部 API 获取要呈现的任何初始所需数据(如 JSON)并将其分配给任何反应性数据属性

data:{
    myJson : null,
    errors: null
},
created(){
    //pseudo code
    database.get().then((res) => {
        this.myJson = res.data;
    }).catch((err) => {
        this.errors = err;
    });
}

在创建 api 调用时,它是否会等待所有异步操作完成,然后再进入下一个生命周期阶段?
@Ominus 不,它不会等待,运行这个小提琴 - jsfiddle.net/1k26sqrx/] 并检查控制台日志
我注意到当使用mounted() 而不是created() 时。 Vue 测试反应变量集是否真的作为反应变量存在。如果不是,则抛出错误。在 created() 中不是这种情况“属性或方法“foo”未在实例上定义,但在渲染期间被引用。确保此属性是反应性的。”
@tobiasBora 只要您不需要与 DOM 交互,created 就应该这样做
@tobiasBora 由多个对象表示,如果您的意思是多个到期实例,是的,每个 vuue 实例都会调用它各自的 created 钩子。但是 created 仅在实例化到期对象时调用一次。
M
Muhammad Numan

对于 created() 钩子,在浏览器中操作后的数据在安装之前未显示在 DOM 中。简而言之,数据需要时间来操作浏览器看到的 DOm。

Mounted() 钩子在 DOM 被挂载或渲染后调用,这使您能够访问 DOM 元素并且可以执行 DOM 操作。mounted 钩子的最佳用途是如果您需要在之前或之前立即访问 DOM在初始渲染之后。


您正在重新散列现有答案。
我没有重新散列任何现有的答案