Vue3对比Vue2差异
1.组合式API
由原来各个生命周期函数以及computed、methods、data定义为属性,改为将 setup 返回的所有内容都暴露给组件的其余部分 (计算属性、方法、生命周期钩子等等) 以及组件的模板。(实际开发中推荐的是单文件组件Mouse position is at: {{ x }}, {{ y }}
3.Teleport
Teleport 提供了一种干净的方法,允许我们控制在 DOM 中哪个父节点下渲染了 HTML,
4.多根节点
需要显式定义 attribute以及事件监听器应该分布在哪里。注意这里说的是非定位为props属性的attribute.和没有声明的自定义事件监听器。
... ...
5. 自定义事件
自定义事件需要先声明,不声明则为监听原生事件 (如 click) 时,换句话说我们定义了组件的自定义事件则可以覆盖监听原生事件
如果是在模板中子组件可以直接通过$emit()触发父组件自定义事件
如果是在 部分中使用,显式地通过 defineEmits() 宏来声明它要触发的事件,并且手动触发时候不能和模板中使用一样$emit()而是换成通过defineEmits定义后返回的emit()函数触发
如果是使用的setup函数则事件需要通过 emits 选项来定义,emit 函数也被暴露在 setup() 的第二个参数上下文对象上
export default {emits: ['inFocus', 'submit'],setup(props, ctx) {ctx.emit('submit')}
}
6.v-model
v-model不需要在子组件里面进行自定义,默认使用modelValue作为属性,update:modelValue作为事件
子组件
{{modelValue}}
7.单文件组件
是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。
1.在 声明的顶层的绑定 (包括变量,函数声明,以及 import 引入的内容) 都能在模板中直接使用:
{{ msg }}
2.响应式状态需要明确使用响应式 APIs 来创建
3.使用组件
4.递归组件
一个单文件组件可以通过它的文件名被其自己所引用。例如:名为 FooBar.vue 的组件可以在其模板中用 引用它自己。
5.defineProps和defineEmits
在 中必须使用 defineProps 和 defineEmits API 来声明 props 和 emits
6.顶层await
中可以使用顶层 await
8.样式的动态绑定(style中值可以绑定data中的变量)
单文件组件的 标签支持使用 v-bind CSS 函数将 CSS 的值链接到动态的组件状态
hello
且支持 JavaScript 表达式 (需要用引号包裹起来)
hello
9.scoped新增功能
新增针对插槽的样式
:slotted(.foo) {
}
新增针对全局的样式
:global(.foo) {}
10.全局api变为实例api

11.watch侦听reactive对象和ref对象
/* watch函数可以监听一个函数,返回一个值一个 ref一个reactive对象...或是由以上类型的值组成的数组 */// reactive对象let user = reactive({name: "chenjixue",age: 25,address: {city: "武汉",province: "湖北"}})// 直接监听reactive对象 自动开启深度监听,更改后新老值一样watch(user, (oldValue, newValue) => {console.log(oldValue, newValue)}, {// deep:true})//监听reactive对象下某个基本数据类型watch(() => user.name, (oldValue, newValue) => {console.log(oldValue, newValue)}, {// deep:true})//监听reactive对象下某个引用数据类型 可以使用deep控制是否深度监听对象watch(() => user.address, (oldValue, newValue) => {console.log(oldValue, newValue)}, {// deep:true})//ref// watch监听ref时候 第一个参数写法这两者相等即 ref 等于 ()=>ref.value// 监听ref基本数据类型 更改后新老值不一样let testref = ref(1)watch(testref, (oldValue, newValue) => {console.log(oldValue, newValue)}, {// deep:true})// 监听ref引用数据类型 可以使用deep控制是否深度监听对象let testObjRef = ref({name: "chenjixue",age: 25,address: {city: "武汉",province: "湖北"}})watch(testObjRef, (oldValue, newValue) => {console.log(oldValue, newValue)}, {// deep:true})
12.template
没有特殊指令的标记 (v-if/else-if/else、v-for 或 v-slot) 的 现在被视为普通元素,并将渲染为原生的 元素,而不是渲染其内部内容
13.数据的定义方式对比
//vue2 中let a = {data: function () {return {age: 12,name: "chenjixue"}}}//vue3 中 reactive和ref都可以定义响应式数据,// 但是实际开发中更多的还是用reactive模拟vue2中定义方式// 如果使用componentsApi 则还需要toRef或者torefs配置(避免在在模板中经常xxx.xx书写)// toref创建一个对象使其值指向另一个对象中的某个属性// torefs将一个响应式对象转换为一个普通对象,对每个属性都做toRef操作setup(){let data = reactive({age: 12,name: "chenjixue"})return {...toRefs(data)}}
14.移除了 $on、$off 和 $once 方法
实例中完全移除了 $on、$off 和 $once 方法
事件总线模式可以被替换为使用外部的、实现了事件触发器接口的库,例如 mitt 或 tiny-emitter。
// eventBus.js
import emitter from 'tiny-emitter/instance'export default {$on: (...args) => emitter.on(...args),$once: (...args) => emitter.once(...args),$off: (...args) => emitter.off(...args),$emit: (...args) => emitter.emit(...args),
}
14.Suspense
组件有两个插槽:#default 和 #fallback。两个插槽都只允许一个直接子节点。在可能的时候都将显示默认槽中的节点。否则将显示后备槽中的节点。常用于与异步组件搭配使用
稍等正在加载中
15.其余不常用的地方
1.shallowReactive和shallowRef
shallowReactive: 和reactive不同,只处理对象最外层属性的 响应式(浅响应式)
shallowRef:和ref不同,只处理基本数据类型的响应式,不对对象的响应式进行处理,除 非整体替换对象的值。
2.readonly和shallowReadonly
readonly:让一个响应式数据变为只读 (深只读)
shallowReadonly:让一个响应式数据变为只读 (浅只读,只有第一层数据无法修改)
3.toRaw与markRaw
(1)toRaw
作用:将一个reactive生成的响应式对象转为普通对象
使用场景:用于读取响应式对象对应的普通对象,对这个普通对象所有操作不会引起页面更新
(2)markRaw
作用:标记一个对象使其永远不会再成为响应式对象
使用场景:1)有些值不应该设置为响应式的,例如复杂的第三方类库
2) 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
