当前位置: 代码网 > it编程>编程语言>Javascript > Vue实例创建和挂载的详细过程

Vue实例创建和挂载的详细过程

2024年11月25日 Javascript 我要评论
1.vue 实例创建和挂载的过程概述vue 实例的挂载过程涉及多个关键步骤,包括创建实例、编译模板、初始化数据和事件绑定等。它的核心流程大致如下:初始化 vue 实例:在new vue()调用时,vu

1. vue 实例创建和挂载的过程概述

vue 实例的挂载过程涉及多个关键步骤,包括创建实例、编译模板、初始化数据和事件绑定等。它的核心流程大致如下:

  1. 初始化 vue 实例:在 new vue() 调用时,vue 实例会创建并初始化相关的属性,如 datacomputedmethods 等。
  2. 初始化生命周期:vue 会初始化生命周期钩子,包括 beforecreatecreatedbeforemountmounted 等。
  3. 编译模板:vue 会解析传入的模板,生成虚拟 dom(vnode)。
  4. 渲染:将虚拟 dom 转换为真实的 dom,最终将 vue 实例挂载到指定的 dom 节点上。
  5. 更新:在响应式数据变化时,vue 会触发更新,重新渲染组件。

2. 分析源码:vue 实例的创建与挂载过程

我们从 vue 2.x 的源码分析 vue 实例的挂载过程。以下是大致的分析步骤。

2.1 vue 实例的构建函数

首先,我们来看 vue 的构建函数,它通常是通过 new vue(options) 来实例化 vue 对象的。options 对象包含了组件的配置项,比如 eldatatemplate 等。

function vue(options) {
  if (process.env.node_env !== 'production' && !(this instanceof vue)) {
    warn('vue is a constructor and should be called with the `new` keyword');
  }
  this._init(options);
}

在构造函数中,调用了 this._init(options),也就是实例化时 vue 会调用内部的 _init 方法进行初始化。

2.2 vue 的 _init 方法

vue.prototype._init = function (options) {
  const vm = this;

  vm._uid = uid$1++; // 生成唯一 id
  vm._isvue = true; // 标记 vue 实例
  vm.$options = mergeoptions(
    resolveconstructoroptions(vm.constructor),
    options || {}
  ); // 合并构造函数默认选项和用户传入的选项
  vm._renderproxy = vm; // 渲染代理
  vm._self = vm; // 指向自己
  initlifecycle(vm); // 初始化生命周期
  initevents(vm); // 初始化事件
  initrender(vm); // 初始化渲染
  callhook(vm, 'beforecreate'); // 调用生命周期钩子 beforecreate
  initstate(vm); // 初始化数据、计算属性等
  initinjections(vm); // 处理依赖注入
  callhook(vm, 'created'); // 调用生命周期钩子 created
  if (vm.$options.el) {
    vm.$mount(vm.$options.el); // 挂载实例
  }
};
  • 生命周期的初始化:在 _init 方法中,vue 会进行生命周期的初始化,并调用 beforecreate 和 created 钩子。
  • 渲染代理_renderproxy 用于实现模板访问 this 时的代理。
  • $mount:如果传入了 el 选项,vue 会调用 $mount 方法来挂载实例。

2.3 vue 的 $mount 方法

挂载的核心方法是 $mount,它接受一个 dom 元素或选择器字符串,并将 vue 实例与这个 dom 节点进行绑定。

vue.prototype.$mount = function (el, hydrating) {
  el = el && query(el); // 如果传入了 el,进行选择并获取 dom 元素
  if (el === document.body || el === document.documentelement) {
    warn('do not mount vue to <html> or <body> - mount to normal elements instead.');
    return;
  }
  const options = this.$options;
  if (!options.render) {
    let template = options.template;
    if (template) {
      if (typeof template === 'string') {
        // 编译模板
        template = compiletofunctions(template, this);
      }
    } else if (el) {
      // 没有模板时,从 dom 中获取内容作为模板
      template = el.outerhtml;
    }
    options.render = template ? compiletofunctions(template, this) : createemptyvnode;
  }
  return mountcomponent(this, el, hydrating);
};
  • dom 查询:首先,el 被解析成 dom 元素。
  • 模板编译:如果没有传入渲染函数 (render),vue 会尝试从模板字符串中编译生成渲染函数。
  • mountcomponent:最后,调用 mountcomponent 来进行组件的挂载。

2.4 mountcomponent 方法

mountcomponent 是挂载组件的核心方法,它会调用 vm.$el 将实例挂载到指定的 dom 上。

function mountcomponent(vm, el, hydrating) {
  vm.$el = el;
  callhook(vm, 'beforemount');
  let updatecomponent;
  
  // 这里通过 render 函数来渲染视图
  updatecomponent = function () {
    vm._update(vm._render(), hydrating);
  };
  
  // 调用 vue 的渲染函数,执行视图更新
  new watcher(vm, updatecomponent, noop, { before: callhook.bind(vm, 'beforeupdate') }, true);
  callhook(vm, 'mounted');
  return vm;
}
  • 调用 beforemount:在渲染之前,会先执行 beforemount 生命周期钩子。
  • 渲染和更新updatecomponent 会触发 vm._update 方法进行视图更新。_render() 是用于生成虚拟 dom 的方法,它会调用渲染函数。
  • watcher:vue 通过 watcher 来观察响应式数据的变化,并在数据变化时触发更新。

2.5 vue 的 _update 方法

_update 方法会根据虚拟 dom 的变化,重新渲染并更新 dom。

vue.prototype._update = function (vnode, hydrating) {
  const vm = this;
  const prevel = vm.$el;
  const prevvnode = vm._vnode;
  vm._vnode = vnode;
  if (!prevvnode) {
    // 初次渲染
    vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeonly */);
  } else {
    // 更新渲染
    vm.$el = vm.__patch__(prevvnode, vnode);
  }
  // 更新生命周期钩子
  callhook(vm, 'updated');
};
  • 虚拟 dom 比对_update 会执行虚拟 dom 与真实 dom 的比对,更新页面内容。
  • 生命周期钩子:更新后,会调用 updated 生命周期钩子。

3. 总结 vue 实例挂载的过程

vue 实例的挂载过程包含以下几个主要步骤:

  1. 初始化实例:通过 new vue(options) 创建 vue 实例,调用 _init 方法进行初始化。
  2. 编译模板:如果没有传入 render 函数,vue 会通过模板字符串生成渲染函数。
  3. 挂载组件:通过 $mount 方法将 vue 实例挂载到指定的 dom 元素上。
  4. 渲染更新:通过 _update 方法更新 dom,生成新的视图。
  5. 生命周期钩子:在每个阶段会触发相应的生命周期钩子函数(如 beforecreatecreatedbeforemountmounted 等)。

通过以上分析,我们可以理解 vue 实例挂载的完整过程,以及其中涉及的关键函数和生命周期钩子。

到此这篇关于vue实例创建和挂载的详细过程的文章就介绍到这了,更多相关vue实例创建和挂载内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com