对 Vue 生命周期的详细总结

Vue.js 生命周期是指 Vue 实例从创建到销毁的整个过程,它包含了一系列的生命周期钩子函数,每个钩子函数在特定的阶段被调用,以帮助开发者在不同的生命周期阶段执行自定义逻辑。以下是对 Vue 生命周期的详细总结,结合模板编译、事件初始化、响应式数据、数据注入等内容。

Vue 生命周期详细总结

1. 实例初始化
  • beforeCreate:

    • 作用: 实例初始化后,数据观测 (data observation) 和事件 (event) 尚未设置。此时 datamethods 还未初始化,事件系统也未建立。
    • 功能: 可以进行一些基本的配置,但无法访问实例的数据、方法或事件。
  • created:

    • 作用: 实例创建完成后调用,此时数据观测和事件系统已经设置。数据、方法和事件系统都已初始化。
    • 功能:
      • 响应式数据初始化: 数据 (data) 被转换为响应式对象,能够自动触发视图更新。
      • 方法注入: 实例的 methods 已经注入到 Vue 实例上,可以使用 this 访问这些方法。
      • 事件系统初始化: 事件监听器 ($on$once$off) 已经设置。
2. 挂载阶段
  • beforeMount:

    • 作用: 在挂载开始之前调用,此时 render 函数尚未被调用。此时 Vue 准备将模板渲染到实际的 DOM 中。
    • 功能: 主要用于做挂载前的准备工作。
  • mounted:

    • 作用: 实例挂载完成后调用,此时 DOM 已经渲染,并被插入到页面中。el 被新创建的 vm.$el 替换。
    • 功能:
      • DOM 操作: 可以直接访问 DOM 元素并进行操作,例如使用 this.$refs
      • 数据获取: 可以在此阶段发起数据请求,以填充页面内容。
3. 更新阶段
  • beforeUpdate:

    • 作用: 数据发生变化、虚拟 DOM 重新渲染之前调用。此时可以在视图更新前进行一些处理。
    • 功能: 可以保存当前状态或执行一些与更新相关的逻辑。
  • updated:

    • 作用: 数据变化导致的虚拟 DOM 更新完成后调用。此时视图已经更新。
    • 功能: 在视图更新后执行逻辑,例如依赖于更新后的 DOM 的操作。
4. 销毁阶段
  • beforeDestroy:

    • 作用: 实例销毁之前调用。此时实例仍然完全可用。
    • 功能: 进行清理工作,如清除定时器、解除事件监听器等。
  • destroyed:

    • 作用: 实例销毁后调用。Vue 实例的所有指令绑定和事件监听器都被解除绑定,所有子实例也被销毁。
    • 功能: 完成销毁后的清理工作,如移除事件监听器和其他必要的清理操作。

模板编译与挂载

  • 模板编译:

    • 当 Vue 实例创建时,Vue 会将 el 指定的 DOM 元素的内容(outerHTML)编译为 Vue 模板。
    • 编译后的模板会生成虚拟 DOM,用于实际的视图渲染。
    • 编译过程包括模板解析、优化和代码生成,使得 Vue 能够高效地渲染视图和处理数据绑定。
  • el 选项:

    • 指定 Vue 实例应挂载的 DOM 元素。如果在创建 Vue 实例时提供了 el 选项,Vue 会自动进行挂载。
    • 如果没有提供 el,可以使用 vm.$mount(el) 手动挂载 Vue 实例到指定的 DOM 元素。

数据注入与事件初始化

  • 数据注入 (props, provide/inject):

    • Vue 允许在实例创建时通过 props 传递数据或通过 provide 提供数据,供子组件使用。
    • 在实例的 created 钩子之前,propsprovide/inject 数据会被注入到实例中。
  • 事件初始化:

    • beforeCreatecreated 阶段,Vue 初始化事件系统,设置事件监听器,确保 Vue 实例能够处理和触发事件。

在 Vue.js 中,createdmounted 钩子函数都是常用的生命周期钩子,用于执行异步请求和其他初始化操作。它们在生命周期中的调用时机不同,因此在这两个钩子函数中发送异步请求会有不同的效果和影响。以下是 createdmounted 钩子函数中的异步请求的区别:

created 钩子函数与mounted钩子函数的使用区别

created 钩子函数:

调用时机:

  • created 钩子函数在 Vue 实例被创建之后、挂载到 DOM 之前调用。此时组件的 datamethodscomputed 属性已经初始化,响应式数据已经设置完成。

异步请求的特点:

  • 数据初始化: 在 created 中发送异步请求通常用于初始化数据。因为此时组件的数据已经响应式,所以可以安全地将异步请求的数据赋值给组件的数据属性。
  • 视图更新: 由于 created 在挂载前调用,所以组件的视图还没有渲染到 DOM 中。如果需要基于请求的数据渲染视图,可能会看到视图在请求完成后才更新。

使用场景:

  • 适用于需要在组件挂载之前完成的数据预取,比如加载初始数据、配置、或从后端获取依赖的数据。

示例:

new Vue({
  data() {
    return {
      items: []
    };
  },
  created() {
    // 在组件创建时发送异步请求
    fetch('/api/items')
      .then(response => response.json())
      .then(data => {
        this.items = data; // 设置响应式数据
      });
  }
});

mounted 钩子函数:

调用时机:

  • mounted 钩子函数在 Vue 实例挂载到 DOM 上之后调用。此时组件的模板已经渲染到实际的 DOM 中。

异步请求的特点:

  • DOM 操作: 如果异步请求涉及到依赖于 DOM 的操作(如需要更新 DOM 结构、进行 DOM 计算),那么在 mounted 中发送异步请求是合适的。因为此时可以安全地操作已渲染的 DOM。
  • 视图更新: 由于 mounted 在组件挂载完成后调用,所以在这个阶段发送异步请求并更新数据会立即影响到已渲染的视图。

使用场景:

  • 适用于需要在组件挂载后执行的操作,比如 DOM 相关的操作或初始化第三方插件。

示例:

new Vue({
  data() {
    return {
      items: []
    };
  },
  mounted() {
    // 在组件挂载到 DOM 后发送异步请求
    fetch('/api/items')
      .then(response => response.json())
      .then(data => {
        this.items = data; // 更新数据
      });
  }
});
  • created 钩子函数: 在组件实例被创建后但在挂载之前调用,适用于需要在组件挂载之前完成的初始化操作,如加载数据。如果在这里发起异步请求,则视图更新会在请求完成后才体现,因为 created 时 DOM 尚未挂载。

  • mounted 钩子函数: 在组件挂载到 DOM 之后调用,适用于需要在 DOM 完全渲染后执行的操作。如果在这里发起异步请求,则可以确保视图已经渲染,适合涉及 DOM 操作的场景。

总结

Vue 生命周期钩子函数提供了在 Vue 实例的不同生命周期阶段执行自定义逻辑的机会。从实例创建、数据初始化、模板编译、视图渲染到销毁,每个阶段都有对应的钩子函数,帮助开发者进行灵活的组件管理和数据处理。通过合理使用这些生命周期钩子,开发者可以更高效地构建和维护 Vue 应用。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值