vue2和vue3的不同点

vue2基于defineProperty 的 getter,setter 来实现的
vue3基于es6的proxy(),解决了对象新增属性,数组值变动视图不更新等问题。

选项式api不同点

全局 API 利用实例vue2没有app的概念,有些办法间接放在了全局中,比方Vue.component。vue3引入了app的概念

import{createApp}from'vue'const app =createApp({})app.component("xx")

弃用EventBus$on,$off 和 $once
实例办法已被移除,组件实例不再实现事件触发接口。
所以,eventbus不能用了。改成tiny-emitter。
用法如下:

import emitter from '@ali/act-util/emitter';emitter.emit('xx',()=>{});emitter.on('xx',()=>{});emitter.off('xx')

nextTick
不再能在全局this.$nextTick中取到(undefined is not a function)

import { nextTick } from 'vue'nextTick(() => {  // 一些和 DOM 无关的货色})

Data 选项
不再反对间接用object类型定义属性。只能通过function返回object的形式。此外,当来自组件的 data() 及其 mixin 或 extends 基类被合并时,合并操作当初将被浅层次地执行。不要再用mixin了,改成用组合式api开发。
v-if 与 v-for 的优先级比照
vue2.x里v-for会优先作用,vue3.x里v-if会优先作用。
slot
slot不能放在div上,必须放在template上。

//vue2<div slot="content">  </div>//vue3<template v-slot:content>    </template>

Transition的css名称
v-enter改成v-enter-fromv-leave改成v-leave-from

移除
过滤器filters从 vue 3.x 开始,过滤器已移除,且不再反对。
this.$set()从 vue 3.x 开始,因为有proxy了,所以不能再用this.$set()给对象加kv了。$on,$off和 $once新增emits确保所有组件都应用 emits 选项记录其事件。

<script>  data() {    return {      myNum: 999    }    },  emits: ['submit'],  template: `<div @click="$emit('submit', 89)">    小明    </div>`</script>

组合式api

响应式 API:外围
improt {ref,computed} from 'vue';
ref() 对于data里定义的值js里用须要家xx.value。template间接用xx即可。
computed(()=>{})计算属性
reactive()包一层响应式对象,扭转对象值和ref值都双向扭转
readonly()承受一个对象 (不论是响应式还是一般的) 或是一个 ref,返回一个原值的只读代理watchEffect()做异步操作的

const stop = watchEffect(async (onCleanup) => {  const { response, cancel } = doAsyncWork(id.value)  // `cancel` 会在 `id` 更改时调用  // 以便勾销之前  // 未实现的申请  onCleanup(cancel)  data.value = await response})stop();

<script setup>

<script setup> 是在单文件组件 (SFC) 中应用组合式
API 的编译时语法糖。
<script setup> 范畴里的值也能被间接作为自定义组件的标签名应用

<template>  <Child/></template><script setup>import Child from './Child.vue'</script>

defineProps() 和 defineEmits()
为了在申明 props 和 emits 选项时取得残缺的类型推导反对,咱们能够应用 defineProps 和 defineEmits API,它们将主动地在 <script setup> 中可用

<script setup>const props = defineProps({  foo: String})const emit = defineEmits(['change', 'delete'])// setup 代码</script>

顶层 await
<script setup> 中能够应用顶层 await。后果代码会被编译成 async setup():

<script setup>const post = await service.index().catch(() => false)<script>

参考文档:
vue3官网:https://cn.vuejs.org/api/application.html
从vue2迁徙:https://v3-migration.vuejs.org/
tint-emitter:https://github.com/scottcorgan/tiny-emitter
vue全家桶:https://vue3js.cn/