问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

vue DOM中定义的const elm = vnode.elm = oldnode.elm看不懂,求解

发布网友 发布时间:2022-03-25 09:18

我来回答

1个回答

热心网友 时间:2022-03-25 10:47

Vue版本: 2.3.2
virtual-dom(后文简称vdom)的概念大规模的推广还是得益于react出现,virtual-dom也是react这个框架的非常重要的特性之一。相比于频繁的手动去操作dom而带来性能问题,vdom很好的将dom做了一层映射关系,进而将在我们本需要直接进行dom的一系列操作,映射到了操作vdom,而vdom上定义了关于真实dom的一些关键的信息,vdom完全是用js去实现,和宿主浏览器没有任何联系,此外得益于js的执行速度,将原本需要在真实dom进行的创建节点,删除节点,添加节点等一系列复杂的dom操作全部放到vdom中进行,这样就通过操作vdom来提高直接操作的dom的效率和性能。
Vue在2.0版本也引入了vdom。其vdom算法是基于snabbdom算法所做的修改。
在Vue的整个应用生命周期当中,每次需要更新视图的时候便会使用vdom。那么在Vue当中,vdom是如何和Vue这个框架融合在一起工作的呢?以及大家常常提到的vdom的diff算法又是怎样的呢?接下来就通过这篇文章简单的向大家介绍下Vue当中的vdom是如何去工作的。
首先,我们还是来看下Vue生命周期当中初始化的最后阶段:将vm实例挂载到dom上,源码在src/core/instance/init.js
Vue.prototype._init = function () { ...
vm.$mount(vm.$options.el)
...
}

实际上是调用了src/core/instance/lifecycle.js中的mountComponent方法,
mountComponent函数的定义是:
export function mountComponent ( vm: Component, el: ?Element,
hydrating?: boolean
): Component { // vm.$el为真实的node
vm.$el = el // 如果vm上没有挂载render函数
if (!vm.$options.render) { // 空节点
vm.$options.render = createEmptyVNode
} // 钩子函数
callHook(vm, 'beforeMount') let updateComponent /* istanbul ignore if */
if (process.env.NODE_ENV !== 'proction' && config.performance && mark) { ...
} else { // updateComponent为监听函数, new Watcher(vm, updateComponent, noop)
updateComponent = () => { // Vue.prototype._render 渲染函数
// vm._render() 返回一个VNode
// 更新dom
// vm._render()调用render函数,会返回一个VNode,在生成VNode的过程中,会动态计算getter,同时推入到dep里面
vm._update(vm._render(), hydrating)
}
} // 新建一个_watcher对象
// vm实例上挂载的_watcher主要是为了更新DOM
// vm/expression/cb
vm._watcher = new Watcher(vm, updateComponent, noop)
hydrating = false

// manually mounted instance, call mounted on self
// mounted is called for render-created child components in its inserted hook
if (vm.$vnode == null) { vm._isMounted = true
callHook(vm, 'mounted')
} return vm
}

注意上面的代码中定义了一个updateComponent函数,这个函数执行的时候内部会调用vm._update(vm._render(), hyddrating)方法,其中vm._render方法会返回一个新的vnode,(关于vm_render是如何生成vnode的建议大家看看vue的关于compile阶段的代码),然后传入vm._update方法后,就用这个新的vnode和老的vnode进行diff,最后完成dom的更新工作。那么updateComponent都是在什么时候去进行调用呢?
vm._watcher = new Watcher(vm, updateComponent, noop)
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
贵州铜锅洋芋饭的做法 用公共经济学的观点,谈一谈,墙内开花墙外香,这种问题发生后,你是否还愿... 板柱剪力墙结构介绍? 格力空调开机出现88是什么原因 空调显示“88“什么意思? 空调出现“88”什么意思? 白萝卜蒸冰糖有什么功效 白萝卜冰糖止咳效果好吗 萝卜炖冰糖可以止咳吗 天配良缘之商君内容简介 vue 我想要它有动画的渲染出来需要怎么做 jquery和vue效率对比 uniapp和vue有什么区别? vue怎么调视频亮度 vivox27系统更新后怎么没有了微信视频美颜功能 vivo专属美颜功打开了但是没有美颜怎么回事 我vivo x27没有微信视频聊天美颜怎么办,,我更新了也没有?我买回来就没有那个功能,怎么办? vivo手机怎么不能视频美颜 vivox27微信刚开始有美颜,为什么最后没有了呢? VivoX27手机,美颜视频在设置里面没有这一项。 为什么我的vivox27设置中没有微信视频美颜功能? vivo手机自带美颜微信视频怎么没有美颜? vivoX27怎么没有微信视频美颜?微信和版本都升级到最新版本了!太坑了吧。 vivoX27,微信视频没有美颜功能能,什么原因? vivox27 微信视频美颜怎么没了? vivos1有微信美颜功能吗 vivos5微信视频聊天怎么打开美颜? 微信美颜在哪里开启vivo 苹果x如何设置相册密码 苹果x相册怎么加密 vue 怎么在chrome里调式 vue的代码问题 ipadpro(2018)支持二代笔的磁吸功能吗?支持20w的快充吗? ipadpro2020支持快充吗 2018iPadPro支持多少瓦快充? ipadpro支持多少w快充 ipad pro 10.5支持快充吗 20w快充适合ipad型号 ipadpro9.7支持20w快充吗 ipad pro支持多少瓦快充 ipad pro10.5支持快充吗 有什么ipad pro12.9适用的快充充电器 苹果ipad pro 12.9快充是多少瓦 ipadpro可以用华为快充吗 ipadpro2017支持18w快充吗 荣耀30青春版哪个版本值得选? 荣耀30和荣耀30pro区别 荣耀30pro安卓版本是多少? 荣耀30和荣耀30pro有什么区别 荣耀30哪个版本性价比高
  • 焦点