目录

前言

概览

一、新特性

二、差异

详情

一、vue3新特性

1、组合式API---setup

2、ref创建响应式数据

3、Teleport---“传送门”

4、多根节点

5、style中使用变量

二、区别

1、v-if和v-for的优先级

2、.sync修饰符

3、全局API

4、Vue.prototype 替换为 config.globalProperties

5、生命周期

6、key在template和v-if上的使用

7、$listeners被移除

8、this

9、typescript支持


前言

随着vue3在2022 年 2 月 7 日被提升为新的默认版本,这也将成为一个新的潮流,我们前端开发者也将在未来的工作中更多的使用vue3来搭建以及开发我们的项目。因此了解vue3和vue2的区别也就成为了一件至关重要的事情了。

概览

一、新特性

1、组合式API---setup

2、ref创建响应式数据

3、Teleport---“传送门”

4、多根节点

5、style中使用变量

二、差异

1、v-if和v-for的优先级

2、.sync修饰符

3、全局API

4、Vue.prototype 替换为 config.globalProperties

5、生命周期

6、key在template和v-if上的使用

7、$listeners被移除

8、this

9、typescript支持

详情

一、vue3新特性

1、组合式API---setup

  • 在vue2中:生命周期、methods、data等只能定义一次,并把相关的变量、方法等集中写在一处地方,这导致我们在代码编写及维护的过程中,不可避免的要反复横跳来查找对应的变量、方法等,这种碎片化的编码方式既不利于理解,也不利于维护
  • 在vue3中:setup是一个接收 props 和 content 的函数,允许我们在其内部通过API的方式(如:onMounted(getUserRepositories) // 在 `mounted` 时调用 `getUserRepositories`)多次使用一个相同的生命周期等。

2、ref创建响应式数据

  • 在vue2中:响应式数据的创建必须是写在 data 中的,在vue内部通过Object.defineproperty() 方法 以及 重写Array的方法来达到数据响应式的目的,这种方式是“主动”的,无论此变量有没有改变都会在vue初始化时设置为响应式(效率差,支持性差:你经常会用到$set这个方法)
  • 在vue3中:通过 ref 函数实现数据响应式(vue3中数据响应式的实现是通过proxy代理的方式,这种方式是“被动”的,只有当你去访问改变变量时,才会被处理为响应式数据,并且不需要对数组、对象等进行特殊处理,它是“一视同仁的”,还支持 Set 等较新的数据类型)

3、Teleport---“传送门”

  • 允许我们将指定内容渲染在指定的html标签上

4、多根节点

  • 在vue2中:一旦根节点有多个,vue会发出警告
  • 在vue3中:支持多根节点(减少了DOM元素的嵌套层级)

5、style中使用变量

  • <script setup>
    const theme = {
      color: 'red'
    }
    </script>
    <template>
      <p>hello</p>
    </template>
    <style scoped>
    p {
      color: v-bind('theme.color');
    }
    </style>

二、区别

1、v-if和v-for的优先级

  • 在vue2中:当v-if和v-for同时使用时,v-for的优先级高于v-if(因此我们通常需要计算属性先对数据进行加工处理,以达到性能优化的目的)
  • 在vue3中:当v-if和v-for同时使用时,v-if的优先级高于v-for

2、.sync修饰符

  • vue2中:由于vue中是单向数据流,父子组件在传值时想要实现v-model的效果就要用到.sync修饰符来实现“双向绑定”
  • vue3中:对v-model进行了改造,不再需要 .sync 修饰符即可达到数据双向绑定的效果。在vue3中支持多个 v-model属性,默认使用 modelValue 作为 prop,update:modelValue作为事件,当多个v-model绑定时,书写为例:v-model:title="title",此时 title 作为prop,update:title 作为事件

3、全局API

  • vue2中:有许多的全局API,如:Vue.directive、Vue.component、Vue.config、Vue.mixin等
  • vue3中:提供的是实例API,通过createApp创建vue实例,原来在Vue原型上的API都被挂载到了vue实例上,如:app.directive、app.component、app.config、app.mixin等

4、Vue.prototype 替换为 config.globalProperties

  • vue2中:绑定全局的变量、方法等:Vue.prototype.$ajax = xxxx
  • vue3中:const app = createApp({}); app.config.globalProperties.$ajax = xxxx

5、生命周期

vue2vue3

beforeCreate

setup()

created

setup()

beforeMount

onBeforeMount

mounted

onMounted

beforeUpdate

onBeforeUpdate

updated      

onUpdated

beforeDestroy

onBeforeUnmount
destroyed onUnmounted

6、key在template和v-if上的使用

  • vue2中:在使用v-if、vi-else、v-else-if时,为了保证dom节点渲染的正确性,通常需要在对应的节点添加不同的key,以确保vue在进行虚拟dom对比时是准确的;vue2中template在v-for循环时是不能设置key的,否则会产生警告(需要给子节点设置key)。
  • vue3中:在使用v-if、vi-else、v-else-if时,不用提供唯一的key对dom节点进行区分,因为vue内部会自动生成唯一的key,如果你提供了key,那你就要保证它的唯一性;vue3中template在v-for循环时,key应该设置在template标签上

7、$listeners被移除

  • vue2中:使用$attrs访问传递给组件的属性,使用$listeners访问传递给组件的事件(需要结合inheritAttrs:false)。
  • vue3中:虚拟dom中,事件监听器仅仅是以on为前缀的属性

8、this

  • vue2中:无时无刻都要使用this
  • vue3中:因为setup函数的存在,所有的props、data等都不需要用this进行访问(vue3对vue2绝大多数是兼容的,如果你用了vue2相关的东西,那你还是需要像vue2一样书写)

9、typescript支持

  • vue2中:默认是不支持typescript的。
  • vue3中:支持使用typescript,使用typescript在构建大型项目时,能够很好的提高项目开发的质量。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐