介绍
对比vue2,vue3的性能提升了,更好的支持TS(Typescript),提供了crmpositionAPI。
但是相对应的移除了一些vue2中的
$on方法(eventBus - Vue.prototype.$enventBus=new Vue() ; this.$on(‘事件名’,回调)现有实现模式不在支持,可以使用第三方插件)
filter(过滤器)(插值表达式里{{ msg|format}}不能在使用过滤器filter,可以使用 methods 替代 {{format(msg)}})
.sync语法 (v-bind时不能使用 .sync修饰符了,现在它与v-model语法合并了)
vue2与vue3的钩子函数对比
vue3中的钩子函数有7个
— setup : 创建实例前
— onBeforeMount : 挂载DOM前
— onMounted :挂载DOM后
—onBeforeUpdate :更新组件前
—onUpdated :更新组件后
—onBeforeUnmount :卸载销毁前
—onUnmounted : 卸载销毁后
组合API-setup函数
setup在beforeCreated之前执行——>这就意味着在setup
函数中 this
还不是组件实例,this
此时是 undefined
setup
是一个新的组件选项,作为组件中使用组合API的起点。
- setup 函数是一个新的组件选项,作为组件中组合式API 的起点(入口)
- setup 中不能使用 this, this 指向 undefined
- setup函数只会在组件初始化的时候执行一次
- setup函数在beforeCreate生命周期钩子执行之前执行
参数: // 第1个参数为props。props为一个对象,内部包含了父组件传递过来的所有prop数据
// 第2个参数为一个对象context。context对象包含了attrs,slots, emit属性
setup(props, context) {}
ref函数定义响应式数据
- 从vue框架中导入
ref
函数 - 在setup函数中调用
ref
函数并传入数据(简单类型或者复杂类型) 在setup函数中把ref函数调用完毕的返回值以对象的形式返回出去
<template>
<p>姓名:{{name}}, 公司:{{company}},月薪:{{salary}}</p> // 在模板中不需要加.value
<button @click="double">月薪double</button>
</template>
<script>
import { ref } from 'vue'
export default {
name: 'App',
setup () {
// 定义响应式对象
const company = ref('DiDi')
const name = ref('小王')
const salary = ref(18000)
const double = () => {
// 在代码中修改(或者获取)值时,需要补上.value
salary.value *= 2
}
return {
name,
company,
salary,
double
}
}
}
</script>
组合API-toRefs函数
作用:
定义转换响应式中所有属性为响应式数据,通常用于解构 | 展开reactive定义对象,简化我们在模板中的定义使用
格式:
// 响应式数据:{ 属性1, 属性2 }
let { 属性1, 属性2 } = toRefs(响应式数据)
—-增强版的解构赋值:在解构对象的同时,保留响应式的特点
代码:
<template>
<p>{{name}}, {{company}}</p>
<button @click="jumpToJD">jumpToJD</button>
</template>
<script>
import { reactive, toRefs } from 'vue'
export default {
name: 'App',
setup () {
// 定义响应式对象
const stu = reactive({
company: 'DiDi',
name: '小王'
})
let { name, company } = toRefs(stu)
const jumpToJD = () => {
company.value = 'JD'
name.value = '老王'
console.log('toJD', company)
}
return { name, company, jumpToJD }
}
}
</script>
父传子
在子组件中,通过props接收,在template中可以直接使用,在setup中需要补充(props)属性
子传父
依赖注入
祖先传后代
步骤
- 祖先组件中提供数据:
provide('数据名1', 数据名)
- 后代组件中使用数据:
inject('数据名1')
代码:
祖先:
import { provide, ref } from 'vue'
//...省略
setup () {
const money = ref(100)
// 将数据提供给后代组件 provide
provide('money', money)
return { money }
}
后代:
<h3>孙组件 {{money}} <button @click="fn">消费20</button></h3>
//...省略
import { inject } from 'vue'
//...省略
setup () {
const money = inject('money')
return {money}
}
总结:
—provide函数提供数据和函数给后代组件使用
—inject函数给当前组件注入provide提供的数据函数
后代改祖先
步骤:
- 祖先组件中提供数据&操作数据的函数f:
provide('函数f', 数据名)
- 后代组件中获取操作数据的函数f,并调用数据:
inject('函数f')
代码:
provide要写在需要传递的函数方法的后面,否则会没有效果