当前位置:首页 > 网站源码 > 正文内容

vue源码解析图(vue30源码解析)

网站源码2年前 (2023-04-13)512

本篇文章给大家谈谈vue源码解析图,以及vue30源码解析对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

【手把手教你搓Vue响应式原理】(五) Watcher 与 Dep

【手把手教你搓Vue响应式原理】(一)初识Vue响应式

【手把手教你搓Vue响应式原理】(二)深度监测对象全部属性

【手把手教你搓Vue响应式原理】(三)observe 以及 ob

【手把手教你搓Vue响应式原理】(四) 数组的响应式处理

之前已经将数据劫持已经全部完成了。

那么,接下来,主要的要点就是在于两点,依赖收集和触发依赖更新。

它的意义主要在于控制哪些地方使用了这个变量,然后,按照最小的开销来更新视图 。

首先,要先明白,依赖是什么,比方说在我们的模板中有 {{a}} ,那么,这棚指个地方就有对于变量 a 的依赖。

在模板编译的时候,就会触发 a 变量的 getter 。

然后,当我们执行 a++; 的时候,那么,我们就要触发依赖的更新,当初模板中 {{a}} 的地方,就要更新,是吧!

所以,我们都是 在 getter 中收集依赖,在 setter 中触发依赖更新 。

这一节的内容,主要就是用来专门讲清楚这两件事情。

依赖收集和触发依赖更新主要由两个类来完成, Dep 和 Watcher 。

Dep 和 Watcher 在设计模式中,就是 发布-订阅者 的模式。

而依赖,你可以理解为所谓的订阅者。

Dep 说白了就是发布前晌者,它的工作就是依赖管理,要知道哪些地方用到了这个变量,可能用到这个变量的地方有很多,所以,它会有多个订阅者。

然后,每个变量都应该有属于自己的 Dep ,因为每个变量所在的依赖位置是不一样的,所以他们的订阅者也不一样。

然后在变量更新之后,就去通知所有的订阅者(Watcher),我的变量更新了,你们该触发视图更新了。

Watcher 说白了就是订阅者,它接受 Dep 发过来的更新通知之后,就去执行视图更新了。

它其实就是所谓的 watch 监听器,变量改变之后,执行一个回调函数。

我们先按照图例来创建我们的 Dep 类

根据我们的需求:

Dep 我们在前面也说了,每个属慧和锋性都应该有它自己的 Dep ,用来管理依赖。

所以,首先,如果我们在 Observer 中创建 Dep,那不就可以了。毕竟 Observer 会遍历到每一个对象。

所以,很明显,我们可以在 defineReactive 的 get 中收集依赖

因为有了 if(Dep.target) 的判断,所以, 只有绑定 Watcher 的变量触发 getter 时,才会添加依赖 。

这个 Dep.target 其实就是 Watcher 的实例

所以,很明显,我们可以在 defineReactive 的 set 中收调用 notify() 方法告知 Watcher 实例,数据更新了。

至此, Dep 的所有职责,我们已经帮它完成了。

其实照道理应该有一个删除依赖,我们这里就不再扩展了。

首先, Watcher 实例应该大家会相对而言更加好理解点,因为,我们有一个 watch 侦听器,大家一定都很熟悉,这两个其实一样。

我们先按照图例来创建我们的 Watcher 类

根据我们的需求:

这个 parsePath 需要单独拎出来说一下,比方说我们现在有这么一个对象

我们要监听到 a.b.c.d ,所以,我们需要下面的这种格式

所以,这个 get 很明显就有点难度了。 我们需要通过循环 拿到 a.b 然后 .c 然后 .d。

我们将这个方法命名为 parsePath 。

入参接受我们的 b.c.d ,我们可以看到 第一句执行之后 segments=['b','c','d'] ,然后进行第二层,这是返回了一个方法,按照循环,那就是 obj=obj.b = obj=obj.c = obj=obj.d ,所以,就是返回一个对象的 obj.b.c.d,相当于是遍历字符串中的属性树。

在执行 a.b.c.d=55; 的同时,我们的控制台就会输出 ok 55 10 。

【尚硅谷】Vue源码解析之数据响应式原理

vue源码分析三 -- vm._render()如何生成虚拟dom

我们在上一篇的最后讲解了vm._render是生成虚拟dom的关键,那么我们山铅来看看他是如何生成的,下面是他的源码

createElement在文逗历好件../vdom/create-element里面,下面是他的源码

new Vnode 创烂山建的是一个虚拟dom,其实就是一个装有很多属性的对象,和真实的dom做一个映射,目的是去渲染真实的dom,那么为什么不直接去渲染dom,因为vue中dom不仅有create的过程,还有diff,patch的过程。为了使得diff的过程花费的时间更短,虚拟dom就出来了,下面我们来看看new Vnode的源码

面试中的网红Vue源码解析之虚拟DOM,你知多少呢?深入解读diff算法

众所周知,在前端的面试中,面试官非常爱考dom和diff算法。比如,可能会出现在以下场景

滴滴滴,面试官发来一个面试邀请。接受邀请📞

我们都知道, key 的作用在前端的面试是一道很普遍的题目,但是呢,很多时候我们都只浮于知识的表面,而没有去深挖其原理所在,这个时候我们的竞争力就在这被拉下了。所以呢,深入学习原理对于提升自身的核心竞争力是一个必不可少的过程。

在接下来的这篇文章中,我们将讲解面试中很爱考的虚拟DOM以及其背后的diff算法。 请认真阅读本文~文末有学习资源免费共享!!!

虚拟DOM是用JavaScript对象描述DOM的层次结构。DOM中的一切属性都在虚拟DOM中有对应的属性。本质上是JS 和 DOM 之间的一个映射缓存。

要点:虚拟 DOM 是 JS 对象;虚拟 DOM 是对真实 DOM 的描述。

diff发生在虚拟DOM上。diff算法是在新虚拟DOM和老虚拟DOM进行diff(精细化比对),实现最小量更新,最后反映到真正的DOM上。

我们前面知道diff算法发生在虚拟DOM上,而虚拟DOM是如何实现的呢?实际上虚拟DOM是有一个个虚拟节点组成。

h函数用来产生虚拟节点(vnode)。虚拟节点有如下的属性:

1)sel: 标签类型,例如 p、div;

2)data: 标签上的数据,例如 style、class、data-*;

3)children :子节点;

4) text: 文本内容;

5)elm:虚拟节点绑定的真实 DOM 节点;

通过h函数的嵌套,从而得到虚拟DOM树。

我们编写了一个低配版的h函数,必须传入3个参数,重载较弱。

形态1:h('div', {}, '文字')

形态2:h('div', {}, [])

形态3:h('div', {}, h())

首先定义vnode节点,实际上就是把传入的参数合成对象返回。

[图片上传失败...(image-7a9966-1624019394657)]

然后编写h函数,根据第三个参数的不同进行不同的响应。

当我们尺明粗进行比较的过程中,我们采用的4种命中查找策略:

1)新前与旧前:命中则指针同时往后移动。

2)新后与旧后:命中则指针同时往前移动。

3)新后与旧前:命中则涉及节点移动,那么新后指向的节点,移到 旧后之后 。

4)新前与旧后:命中则涉及节点移动,那么新前指向的节点,移到 旧前陵镇之前 。

命中上述4种一种就不在命中判断了,如果没有命中,就需要循环来寻找,移动到旧前之前。直到while(新前=新后旧前=就后)不成立则完成。

如果是新节点先循环完毕,如果老节点中还有剩余节点(旧前和旧后指针中间的节点),说明他们是要被删除的节点。

如果是旧节点先循环完毕,说明新节点中有要插入的节点。

1.什么是Virtual DOM 和Snabbdom

2.手写底层源码h函数

3.感受Vue核心算法之diff算法

4.snabbdom之核心h函数的工作原理

1、零基础入门或者有一定基础的同槐悉学、大中院校学生

2、在职从事相关工作1-2年以及打算转行前端的朋友

3、对前端开发有兴趣人群

vue-lazyload 源码解析

/src/lazy.js

定义变量接收实例化参数。

lazy.js 默认导出一个函数,该函数返回一个 Lazy 类,形成闭包,保持对 Vue 的引用。

判断是否支持Webp图片

/src/listener.js

定义变量接收实例化参数。

filter 方法将配置的 filter 对象中的方法执行,接收两个参数,一个为 ReactiveListener 实例,一个为 options 参数对象。

initState 方法给元素添加 data-set 属性,值为图片地址 src,并且定义了图片状态对象 state 。在 Lazy 中已经根据像素比选择了最适配屏幕的图片,顾这里不需要考虑 srcset 属性。另外,我们自定义指令是 v-lazy,到目前为止,还没有给图片的 src 属性锋升赋值。

render 方法,是在 Lazy 中实例化 ReactiveListener 时传递过来的参数。

回过头再来结合 lazy.js 中的 lazyLoadHandler 方法与 ReactiveListener 暴露的方法来看。

/src/lazy-container.js

LazyContainer 的核心是 container 下的选择器selector(默认 img 标签)遍历后调用 lazy 的 add 方法进行绑定,自定义指令 v-lazyload-container。

/src/lazy-component.js

上述实现元素绑定主要是通过自定义指令 v-lazy , v-lazy-container 。那么 LazyComponent 则是通过注册的 lazy-component 组件,完成绑定,默认渲染成为 div 标签,作为 img 的容器。

/src/lazy-image.js

通 LazyComponent 组件,只不过 LazyImage 注册的 lazy-image 组件,渲染成的是 img 标签,多了 src 属性。

通过自逗尘定义指令 v-lazy 将设置背景图的元素或者 img元素,通过 _addListenerTarget 方法收集与数组 TargetQueue 中,并遍历触发懒加载的方法, addEventListener 绑定在该元素上,触发的事件为 lazyLoadHandler ;

在需要懒加载的元素上银指老设置属性 data-src ,这是期望的图片地址(filter 配置项可以预先过滤赋值),元素上自定义 lazyLoad 表示图片状态(状态变更后,adapter 中触发回调);

ListenerQueue 数组中收集的是 ReactiveListener 类的实例,主要是用于懒加载不同状态下的图片加载,loading - loaded - error;

当触发 EventListener 了,执行 lazyLoadHandler 方法,根据算法,进入 viewport 后, ReactiveListener 元素如果与触发元素匹配,则进行图片的加载及渲染。

关于vue源码解析图和vue30源码解析的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

扫描二维码推送至手机访问。

版权声明:本文由我的模板布,如需转载请注明出处。


本文链接:http://390c.top/post/9207.html

分享给朋友:

“vue源码解析图(vue30源码解析)” 的相关文章

怎么获取别人的个人信息(怎样获取别人的个人信息)

怎么获取别人的个人信息(怎样获取别人的个人信息)

今天给各位分享怎么获取别人的个人信息的知识,其中也会对怎样获取别人的个人信息进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、学计算机的是否可以通过手机号看到这...

Vue响应式原理(vue响应式原理简书)

Vue响应式原理(vue响应式原理简书)

今天给各位分享Vue响应式原理的知识,其中也会对vue响应式原理简书进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、Vue3.0采用新特性Proxy来实现数据...

沪佳装饰客服电话(沪佳装潢联系方式)

沪佳装饰客服电话(沪佳装潢联系方式)

今天给各位分享沪佳装饰客服电话的知识,其中也会对沪佳装潢联系方式进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、怎样加入沪佳装饰公司 2、上海沪佳装修公司...

js代码怎么写(js代码怎么写优雅)

js代码怎么写(js代码怎么写优雅)

今天给各位分享js代码怎么写的知识,其中也会对js代码怎么写优雅进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、JS 5秒倒计时的代码怎么写?时间要实时显示在...

微信恶搞代码生成器下载(微信趣味生成器下载)

微信恶搞代码生成器下载(微信趣味生成器下载)

本篇文章给大家谈谈微信恶搞代码生成器下载,以及微信趣味生成器下载对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、微信聊天编辑生成器(微信编辑文件用什么软件) 2、网警监...

手机qq浏览器私密空间删除恢复(浏览器隐私空间误删了怎么恢复)

手机qq浏览器私密空间删除恢复(浏览器隐私空间误删了怎么恢复)

今天给各位分享手机qq浏览器私密空间删除恢复的知识,其中也会对浏览器隐私空间误删了怎么恢复进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、QQ浏览器私密空间里...