根据文档横向对比vue2.0与vue3.0(四)

739 阅读5分钟

前言

不知不觉,根据文档横向对比vue2.0与3.0系列到了最后一篇文章啦。

封控了好久,看着窗外的树从光秃秃到绿油油,封控第一次下楼做核酸还要穿羽绒服,前两天惊觉居然已经立夏了,春装还没来得及晒洗,就已经要放到柜子深处。

最后一篇文章,准备写一些零碎的对比部分,用来把vue的横向对比系列进行简单的收尾。老规矩,对比差异部分,使用2️⃣3️⃣分别表示vue2.0与vue3.0,这样就能在通篇翻页时很显眼的看到差异部分。

响应式相关

个人认为,响应式就是A变化,A有关的其它值也都跟着一起变化。

vue里如何追踪变化

2️⃣vue2.0主要通过 Object.definePropert 方式追踪变化。

Object.definePropert 设置遍历得到的property,组件对应watch,渲染将组件需要的property记录为依赖,这些依赖变化的时候,监听到就告诉render重新渲染。

仔细分析一下:

1、设置存储:对象->data 的背后,vue遍历该对象,用Object.defineProperty方法,把遍历得到的property->getter/setter。

2、确定依赖并监听:组件实例对应watcher实例,watcher会把组件渲染过程中的数据记录为依赖,当依赖的property的setter触发,会通知watcher,从而触发render,让关联的组件重新渲染。

3️⃣vue3.0通过 proxy 方式追踪变化。

Proxy 是一个对象,它包装了另一个对象,并允许你拦截对该对象的任何交互。

分析一下:

1、设置存储并确定依赖:当一个值被读取时进行追踪,proxy 的 get 处理函数中 track 函数记录了该 property 和当前副作用。

2、依赖变化时:当某个值改变时进行检测,在 proxy 上调用 set 处理函数。

3、变化后重新渲染:重新运行代码来读取原始值,trigger 函数查找哪些副作用依赖于该 property 并执行它们。

综上所述,vue 实现响应式的方式进行了变化,但万变不离其宗,关键思想还是差不多的:设置存储->确定依赖->依赖变化则重新渲染

3️⃣vue3.0的响应式对象

响应式对象主要为 ref 与 reactive。

其中,使用 reactive 主要为“深度转换”,会影响传递对象的所有嵌套的property。

而 ref 特点为浅层自动解包,深层就需要使用 .value,如果不想访问对象的实例,即不想写 .value,可以使用reactive进行对象的包裹。

单文件组件相关

单文件组件,即 .vue 后缀的文件,vue 组件的模板、逻辑与样式封装在单个文件中。文件由三种类型的顶层代码块组成:<template>、<script> 与 <style>

分析 script 部分

vue2.0中一般使用 <script>,组件被首次引入的时候执行一次。

3️⃣vue3.0中,添加了单文件组件组合式API的语法糖<script setup>,其内部的代码会被编译成 setup()函数内容,和一般的<script>不同在于,其每次组件实例被创建的时候执行。

<script setup>可配合一般的<script>一起使用,比如创建只需要执行一次的对象时,就可配合使用。

简单说明<script setup>的内部使用方法:

1、变量与模板:任何在 <script setup> 声明的顶层的绑定 (包括变量,函数声明,以及 import 引入的内容) 都能在模板中直接使用。

2、响应式:响应式状态,需要使用响应式API来创建(reactive、refs等)。

3、使用组件:普通组件,引入直接使用;动态组件,用:is绑定;递归组件,可引用自己。

4、自定义指令:以vXXXDirective形式命名,在模板中以v-xxx-directive 方式使用自定义指令。

5、props-emits的使用:使用 defineProps 接收与 props 选项相同的值;使用 defineEmits 接收 emits 选项相同的值。

分析 style 部分

<style scoped>

定义在当前组件范围内的样式。子组件的根节点,会被父组件和子组件本身的样式影响。

深度选择器 :deep(xxx),能够影响子组件的样式。

全局选择器 :global(xxx),能让样式应用到全局。

可同时混合无作用域的样式使用。

3️⃣<style module>

vue3.0新增了<style module>,能够将css生成css类,作为$style对象暴露给组件,能够在组件内使用。

<template>
  <p :class="$style.red">
    This should be red
  </p>
</template>

<style module>
.red {
  color: red;
}
</style>

3️⃣状态驱动 v-bind()

vue3.0 新增状态驱动 v-bind(),能把组件中的动态值绑定到样式表中。

<template>
  <div class="text">hello</div>
</template>

<script>
export default {
  data() {
    return {
      color: 'red'
    }
  }
}
</script>

<style>
.text {
  color: v-bind(color);
}
</style>

3️⃣片段

vue3.0 新增了“片段”概念,其实就是组件允许了多根节点。

vue2.0 中,组件内都需要被包裹在唯一的根如 div 内,而现在不需要啦。

可以通过 v-bind="$attrs" ,显式的定义父组件传下来的属性分布在哪个根组件上。

结尾

以上就是根据文档横向对比vue2.0与vue3.0的零碎补充。其他的 “基础-组件-可复用&组合” 部分可以由传送门去到对应文章查看。

因为这一系列对比的最后一篇文章写完了,所以顺便在此处复盘一下。

因为我就是尤大大口中不爱看文档的人,哈哈哈,宁愿花时间在查资料上,也不乐意去看文档。

当我在前段时间完完整整的看完文档后,才发现,原来很多当时要纠结的一些细节问题,可能找五六篇帖子才明白,而文档里原来就清清楚楚的写着。

此外,因为用了很长时间的vue2.0,所以当vue3.0发布后,我的内心还是抗拒(摆烂)的。除了大幅度的增减内容外,很多细节也发生了变化。当我有一天烦躁的连点键盘上的backspace时,我忍不住脱口而出 “到底变了多少啊!!!”

查看了很多帖子想了解其中的区别,但毕竟是别人的思想,相当于经过别人的咀嚼(对不起有点恶心了哈哈哈),所以正如我第一篇文章所言,有的人注重从源码层次分析区别,有的人注重从八股文层次区分,每个人对于“主次内容”的概念都不一样。

所以,我就决定踏踏实实的打开分屏,左边vue2.0文档,右边vue3.0文档,进行苦行僧的横向的对比。

这一对比,我才发现,其实从目录中就能看出很多区别,而更多的细节差异,也在字里行间中显眼起来。

虽然不知道多少人需要横向对比的了解,毕竟每个人的主次概念不一样嘛,但我还是决定把它们写成文章,分享出来,说不定有人需要呢?

写文章真的好麻烦,我习惯性使用xmind进行笔记总结,但要写成文章,就要注重分层格式啥的,有时候真的写得很暴躁!哈哈哈哈哈。

反正!我写完了!也许看的人不是很多(球球大家看一下😥),但我写完啦哈哈哈哈哈!居然还四篇那么多!!我也太棒了吧!!

进一步有一步的欢喜啦~

传送门

vue2.0与vue3.0 基础部分 对比:根据文档横向对比vue2.0与vue3.0(一)

vue2.0与vue3.0 组件部分 对比:根据文档横向对比vue2.0与vue3.0(二)

vue2.0与vue3.0 可复用&组合 对比:根据文档横向对比vue2.0与vue3.0(三)

vue2.0与vue3.0 零碎部分 对比:根据文档横向对比vue2.0与vue3.0(四)