vue是怎么初始化数据并挂载的?

本文详细解析Vue初始化时的模板渲染(挂载)流程,包括查找DOM元素、生成render函数、创建渲染Watcher以及虚拟DOM的创建和更新。重点讨论了直接使用render函数相对于template的性能优势以及Vue如何进行DOM更新。
摘要由CSDN通过智能技术生成

vue初始化流程----模板渲染(挂载)

  1. $mount() 方法

    工程源码: src/platforms/web/entry-runtime-with-compiler.js

    1. 如果传入的 el 是字符串就查找 DOM 元素, 如果有就返回, 没有就警告并返回一个新创建的 div
    2. 如果传入的 el 不是字符串就直接返回 el (可以测试传入真实 DOM 元素 box)
    3. 然后调用了 mount() 方法并返回
    Vue.prototype.$mount = function (el) {
         
      // 根据用户传入的 el 属性获取节点
      el = el && query(el)
      let vm = this;
      //把节点放在 vm.$el 上方便后面使用
      vm.$el = el;
      let options = vm.$options;
      let template
      /**
       * 编译权重:
       * 优先看有没有 render 函数, 如果有就直接用
       * 如果没有 render 函数就看有没有 template 模板
       * 如果都没有就直接获取 el 的 outerHTML 作为渲染模板
       */
      if (!options.render) {
         
          if (!options.template) {
         
              template = el.outerHTML
          } else {
         
              template = vm.$options.template
          }
      }
      if (template) {
         
          //用 template 生成 render 函数
          let render = compileToFunctions(template)
          options.render = render
      }
      //调用 mount 方法开始渲染页面。
      return mount(this, el)
    }
    
    • 上面代码主要实现了 Vue 渲染过程中很重要的一步: 生成 render 函数
    • 如果我们使用的 template 进行编写 HTML 代码, Vue 内部会把模板编译成 Vue 可识别的 render 函数, 如果有写 render 则省去编译过程
    • 总结: 直接写 render 函数比在 template 中写代码的编译效率更高

    query 方法

    function query (el) {
          // 传入了 `#box` 字符串
      if (typeof el === 'string') {
         
        var selected = document.querySelector(el);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史蒂文·月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值