当前位置:首页 > VUE

vue生命周期实现

2026-02-24 00:39:16VUE

Vue 生命周期实现

Vue 的生命周期钩子函数是 Vue 实例在创建、挂载、更新和销毁过程中自动调用的函数。以下是 Vue 生命周期的核心实现方式:

初始化阶段

在 Vue 实例初始化时,会调用 _init 方法,该方法内部会依次触发以下生命周期钩子:

vue生命周期实现

  • beforeCreate:实例刚创建,数据观测和事件配置尚未完成。
  • created:实例创建完成,数据观测和事件配置已完成,但 DOM 还未挂载。
function Vue(options) {
  this._init(options);
}

Vue.prototype._init = function(options) {
  // 合并配置
  const vm = this;
  vm.$options = mergeOptions(options);

  // 触发 beforeCreate 钩子
  callHook(vm, 'beforeCreate');

  // 初始化数据观测
  initState(vm);

  // 触发 created 钩子
  callHook(vm, 'created');

  // 如果有 el 选项,自动调用 $mount
  if (vm.$options.el) {
    vm.$mount(vm.$options.el);
  }
};

挂载阶段

挂载阶段通过 $mount 方法实现,涉及以下钩子:

  • beforeMount:模板编译完成,但尚未挂载到 DOM。
  • mounted:实例挂载到 DOM 后触发。
Vue.prototype.$mount = function(el) {
  const vm = this;
  el = document.querySelector(el);

  // 触发 beforeMount 钩子
  callHook(vm, 'beforeMount');

  // 编译模板并生成渲染函数
  const updateComponent = () => {
    vm._update(vm._render());
  };

  // 创建 Watcher 实例(渲染 Watcher)
  new Watcher(vm, updateComponent, () => {
    // 触发 mounted 钩子
    callHook(vm, 'mounted');
  });
};

更新阶段

数据变化时触发更新,涉及以下钩子:

vue生命周期实现

  • beforeUpdate:数据变化后,虚拟 DOM 重新渲染之前触发。
  • updated:虚拟 DOM 重新渲染并应用到 DOM 后触发。
// Watcher 的更新逻辑
class Watcher {
  constructor(vm, expOrFn, cb) {
    this.vm = vm;
    this.getter = expOrFn;
    this.cb = cb;
    this.value = this.get();
  }

  get() {
    pushTarget(this);
    const value = this.getter.call(this.vm);
    popTarget();
    return value;
  }

  update() {
    // 触发 beforeUpdate 钩子
    callHook(this.vm, 'beforeUpdate');

    // 重新渲染
    this.run();

    // 触发 updated 钩子
    callHook(this.vm, 'updated');
  }

  run() {
    const value = this.get();
    if (value !== this.value) {
      this.cb.call(this.vm, value, this.value);
    }
  }
}

销毁阶段

调用 $destroy 方法时触发以下钩子:

  • beforeDestroy:实例销毁前触发,此时实例仍完全可用。
  • destroyed:实例销毁后触发,所有绑定和监听器被移除。
Vue.prototype.$destroy = function() {
  const vm = this;

  // 触发 beforeDestroy 钩子
  callHook(vm, 'beforeDestroy');

  // 移除所有 Watcher
  vm._watchers.forEach(watcher => watcher.teardown());

  // 移除所有事件监听器
  vm.$off();

  // 触发 destroyed 钩子
  callHook(vm, 'destroyed');
};

辅助函数

生命周期钩子的调用通过 callHook 函数实现:

function callHook(vm, hook) {
  const handlers = vm.$options[hook];
  if (handlers) {
    handlers.forEach(handler => handler.call(vm));
  }
}

关键点

  • 生命周期钩子通过合并选项后存储在 vm.$options 中。
  • 钩子调用时机与 Vue 实例的关键操作(如数据初始化、挂载、更新、销毁)紧密绑定。
  • 异步操作(如 mounted)通过 Watcher 的回调实现。

标签: 生命周期vue
分享给朋友:

相关文章

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue评分实现

vue评分实现

Vue 评分组件实现方法 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 引入并注册组件: import Vue from…

vue实现素材

vue实现素材

Vue 实现素材的方法 使用 Vue 组件管理素材 在 Vue 项目中,可以通过组件化的方式管理素材。创建一个专门的组件来加载和显示素材,例如图片、视频或音频文件。组件可以接收素材的路径或 URL 作…

vue实现颜色

vue实现颜色

Vue 实现颜色的方法 在 Vue 中实现颜色管理可以通过多种方式,以下是一些常见的方法: 使用 CSS 变量动态绑定颜色 在 Vue 组件的样式中定义 CSS 变量,并通过 Vue 的数据绑定动态…

vue 实现回复

vue 实现回复

Vue 实现回复功能 在 Vue 中实现回复功能通常涉及表单提交、数据绑定和列表渲染。以下是实现步骤和代码示例: 数据绑定与表单 <template> <div>…

vue 实现分屏

vue 实现分屏

Vue 实现分屏的方法 使用 CSS Flexbox 或 Grid 布局 通过 CSS Flexbox 或 Grid 布局可以轻松实现分屏效果。在 Vue 组件中定义两个或多个区域,并使用 CSS 控…