向下兼容,vue3支持大多数vue2的特性
Composition API
新的内置组件
Tree-shaking优化,性能提升
更好的支持TypeScript
vue3支持大多数vue2的特性(可以写vue2的东西 )
ref 和 reactice 都是用来创建响应式对象的
setup执行时机在beforeCreate之前执行;
将
beforeDestroy改名为beforeUnmount,destroyed改名为unmounted
缓存树的一部分,当组件被插入到 DOM 中时调用。 缓存树的一部分,比如从 A 组件,切换到 B 组件,A 组件消失时执行。setup() 函数与vue2中的computed配置功能一致,vue2 计算属性是一个对象 vue3是函数
// computed
const count = ref(1)
const plus = computed(() => count.value ++)
const state = reactive({
title: computed(() => {
return count.value + 1
}),
})
watch 可以接收三个参数 第一个是要监听的对象,第二个是数据处理变化,第三个是配置项(options)
options: immediate:true是刚一进去就监听一次
const num = ref(0)
const msg = ref('watch')
watch(
num,
(newV, oldV) => {
console.log(newV)
},
{ immediate:true }
)
使用reactive定义的数据,无法正确获取oldV;并且强制开启了深度检测(deep配置无效)
const state = reactive({
age: 18,
name: 'fc',
tag: {
a: 3,
}
})
watch(
state,
(newV, oldV) => {
console.log(newV)
},
{ deep: true } // 此配置无效 oldV无法获取
)
//
watch(
state.tag,
(newV, oldV) => {
console.log(newV)
},
{ deep: true } // 此配置有效 因为监视的reactive定义的对象中的某个属性的值依然是个对象
)
watch:既要指明监视的属性,也要指明监视的回调
watchEffect:不用指明监视哪个属性,监视的回调中用到哪个属性,那就监视哪个属性
v-model 用法更改,在一个组件上支持双向绑定多个属性,例如v-model:first-name="first" v-model:last-name="last",还有子组件defineProps(['']) defineEmits([''])来接收和响应事件来更新数据
移除keyCode v-on的修饰符,同时也不再支持config.keyCodes (废除 @keyup.13这种还有 自定义按键别名的)
移除v-on.native 修饰符 vue3之中使用emit 接收自定义事件 接受的vue认为是自定义的 不接受的vue会认为是原生事件
移除过滤器 vue3认为这个有实现成本,官方目前建议用方法调用或计算属性
v-if 与 v-for 的优先级对比
v-bind 合并行为
v-for 中的 Ref 数组
<div v-for="item in list" :key="item" :ref="setItemRef"></div>
//itemRefs 不必是数组:它也可以是一个对象,其 ref 会通过迭代的 key 被设置
export default {
setup() {
let itemRefs = []
const setItemRef = el => {
if (el) {
itemRefs.push(el)
}
}
return {
setItemRef
}
},
}
更少的模板语法
组件只需引入不用注册,属性和方法也不用返回,setup函数也不需要,export default不用写,数据,计算属性和方法,自定义指令都是在template中直接可获取
不写setup函数,props/emit的获取方法
defineProps: 用来接收父组件传来的值propsdefineEmits: 用来声明触发的事件表可以直接写await 组件的setup会自动百年城 async setup
getCurrentInstance(): 用于获取当前组件的实例、上下文来操作router和vuex等
vueuse
toRaw: 将一个由reactive生成的响应式对象转为普通对象markRaw: 标记一个对象,使其永远不会再成为响应式对象一种能够将模板移动到其他位置的组件
应用: modal、toast
等待异步组件时渲染一些额外内容,让应用有更好的用户体验
在 Vue2 中, template中只允许有一个根节点;在 Vue3 中,可以直接写多个根节点
Tree-Shaking带来的bundle体积更小。
在Vue2版本中,很多函数都挂载在全局Vue对象上,比如nextTick、nextTick、nextTick、set等函数,因此虽然我们可能用不到,但打包时只要引入了vue这些全局函数仍然会打包进bundle中。
而在Vue3中,所有的API都通过ES6模块化的方式引入,这样就能让webpack或rollup等打包工具在打包时对没有用到API进行剔除,最小化bundle体积