【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期

博客主页:@丘比特惩罚陆

欢迎关注:点赞收藏⭐留言✒
系列专栏:web前端、嵌入式、笔记专栏
人生格言:选对方向,每走一步都是进步!
✒️欢迎大佬指正,一起学习!一起加油!

希望大家能小手一动,帮忙点个赞!

资源邮箱:[email protected];微信:lss0901lili1130

目录

1.双向绑定和单向绑定

2.理解虚拟 DOM 及 key 属性的作用

3.如何触发组件的更新

4.合理应用计算属性和侦听器

5.生命周期的应用场景和函数式组件


1.双向绑定和单向绑定

在我们的vue里面,双向绑定和单向绑定是不冲突;

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第1张图片

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第2张图片

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第3张图片

Vue 是 如 何 是 进 行 双 向 绑 定 的 ? 其 实 并 不 是 通 过 defineProperty 这个 API;如下带代码同样的内容,第一种就是所谓的双向绑定,第二种是手写实现的双向绑定也是 v-model 最终编译出来的样子,所以 v-model 仅仅是一个语法糖而已。



当然有时候组件可能需要多个属性的双向绑定则可以通过.sync 对其它属性做双向绑定,编译后就是@update 去改变值即可。 personalInfo 组件内部;


我们发现为什么绑定的名字不一样,其实是因为我们组件内部是用修改了其名字(props 和 event 那个)。最终语法糖的形式(v-model 对应前两个,.sync 对应后两个);

//语法糖




2.理解虚拟 DOM 及 key 属性的作用

 事件操作 DOM

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第4张图片

 但是事件太多的话:

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第5张图片

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第6张图片

Vue 的话是通过引入一个数据中间层,然后事件不再直接操作 DOM 而是改变数据再映射到 DOM 上。当然由于操作 DOM 非常耗费性能,所以这里是希望尽可能的复用之前的 DOM,于是引入虚拟 DOM。

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第7张图片

查找两棵树的时间复杂度是 O(n3),很差,所以只是比较相同层级的 DOM 节点。

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第8张图片

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第9张图片

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第10张图片

场景 2 比较到第二层节点的时候算法(同层节点比较,其实已经是比较好的了,虽然理想是直接移动 C 节点)是将 C 节点删除而不是移动,第三层的时候新建一个 C 节点,第四层新建 EF,所以说 CEF 都是不能复用的。

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第11张图片

场景 4 要注意,B 是属于同一组件,而且理想状态下是直接移动 B1B2,但是这个时候其实是不知道我们要更新还是移动 B1B2 所以只是把 B1 更新成 B2,B2 更新成 B1,EF 就无法复用了,只能新建。所以我们可以加上 key 来优化(与场景 1 相同):

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第12张图片 场景四:更新删除新建(没有key)

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第13张图片 场景五:移动(有key)

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第14张图片 场景六:插入(有key)

场景 6 也是需要注意,如果无 key 的话则可能是 B2 更新 B4,B3 更新成 B4,新建 B3,但是有的话就只需要插入 B4 就行。 


3.如何触发组件的更新

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第15张图片 任何直接更改DOM的行为都是在作死

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第16张图片

 状态data VS属性props;
●状态是组件自身的数据;
●属性是来自父组件的数据;
●状态的改变末必会触发更新;
●属性的改变未必会触发更新。


上图可以看到前两个方法点击了是改变数据但是不会触发组件的变化,因为 name 没有做响应式,而 info 下面的数据并没有做响应式,所以改变 info 下面的字段是没有用(除非是下面的字段有定义在 data 里面就是响应式了)。

这个时候 name 和 number 在 vue 实例化的时候就有响应式了。这个 list 要注意,其实我们

push 的话是没有改变 list 的(因为没有 this.list 等于改变后的数组),但是却能更新组件。




触发点击事件的时候更改 b 但是组件并没有更新,那是因为组件没有用到 b,所以不会提示组件更新。

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第17张图片

Vue 如何做响应式更新,哪些需要依赖收集哪些不需要。Vue实例化的时候会对 data 下面的数据做一个 getter 和 setter 的转化也就是对数据做一个中间的代理层,不管是做什么操作都会经过这个代理层再去进行相应的操作(可以在代理层做任何事情)。而组件在渲染的时候即 render,如果需要用到data 里面的一些数据则把这些数据放到 watcher 里面,没有用到就不会放进去(所以 b 没有用到,更新了不会去通知watcher 也不会去更新组件).


4.合理应用计算属性和侦听器

【Vue五分钟】 五分钟了解Vue绑定、虚拟DOM、侦听器和声明周期_第18张图片

计算属性就是可以在里面写一些诸如计算的逻辑等等,同时如果数据没有变化它也不会触发是为缓存,当然这个数据必须是放到 data 里面也就是响应式数据而不能是传来的全局数据!!数据量巨大的时候可以很好的提高性能,毕竟变化时才会计算。

Reversed message1: "{{ reversedHessage1 }}"

Reversed ressage2: "{{ reversedMessage2() }}"

{{ now }}


你可能感兴趣的:(web,JavaScript,VUE,vue.js,javascript,前端)