vue为什么要用虚拟dom机制_从源码上理解vue的渲染机制

Vue渲染机制

1.var app = new Vue({

2. el: '#app',

3. data: {

4. message: 'Hello Vue!'

5. }

6.})

初始化新建一个vue对象,那么这里会执行构造方法中的绑定值和方法

23b2599ee245fc543aa0dc3e3bc85b9a.png

可以看到初始化方法_init,而_init是原型上的方法

1ee7f2a4b5ac0b8f96e866c4c1dd3192.png

这里可以看到最后执行了初始化的渲染,initRender,而该方法呢就是对已经挂载的el进行渲染,至此完成了初始化的渲染

849e858be9a600135a6ad98783cc1672.png

093838bfb52f831d02983c923e5c085c.png

故最后其实都到了render函数这里

那当data里面的数据改变了视图又应该怎么改变呢?

1.vm._watcher = new Watcher(vm, () => {

2. vm._update(vm._render(), hydrating)

3.}, noop);

从这里可以知道watcher一直在监听vm中的数据,当其状态改变的时候会执行update函数,而_render函数作为其参数被优先执行,watcher这里就相当于es5中的Object.defineproperty()当状态获取新的值是就调用set(),则可知状态改变

25bb128a9edeb0adea76356d0fe5851c.png

可知render会返回vnode也就是虚拟dom

可以看下vnode的数据结构

那么vnode和dom有什么关系呢

把Vue的实例挂载到#app, 会调用实例里面的render方法,生成虚拟DOM。来看看什么是虚拟节点

new Vue({
 render: h => {
  let root = h(App)
  console.log('root:', root)
  return root
 }
}).$mount('#app')

c192897e3dbed5185373b1cb1f55ce1f.png

可知vnode中的elm属性指向真实dom的节点,故虚拟dom和dom进过比较之后可以直接替换

vue渲染过程的{{xxx}}显示的解决办法

出现这个问题的原因是渲染时为执行到js的赋值代码故其值无法正常显示

解决办法 通过自定义指令

<div id="wrap" v-cloak>

添加选择器

[v-cloak]{

display:none

}

vue实例创建完成后会把v-cloak去掉,在赋值代码未解析到时,会被隐藏

为什么template里面只有一个div,做为根元素,只有一个,入口文件里面挂在el,只有一个可以找到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值