- 选项API
- 易于学习和使用,写代码的位置已经约定好
- 代码组织性差,相似的逻辑代码不便于复用,逻辑复杂代码多了不好阅读
- 组合API
- 一个功能逻辑的代码组合在一起
- 需要有良好的代码组织能力和拆分逻辑能力
- setup()
- 组合API的起点,基本组合API的代码会在这里
- 可以理解成在beforeCreate钩子执行前执行
- 函数中,不能使用this,因为还没创建好组件实例
- 模板中需要使用的数据和函数,需要在setup中返回
- Vue3生命周期
- setup()创建实例前
- onBeforeMount()挂载DOM前
- onMount()挂载DOM后
- onBeforeUpdate()更新组件前
- onUpdate()更新组件后
- onBeforeUnmount()卸载销毁前
- onUnmount()卸载销毁后
- 可以多次使用同一个钩子函数,执行顺序和书写顺序相同
- reactive()
const obj=reactive({
name:'ls',
age:25
})
- toRef()
- 从响应式数据对象中解构出来的属性数据,不再是响应式数据
- toRef()转换响应式数据包装成对象,value存放值的位置
const name=toRef(obj,'name')
- toRefs()
- 转换响应式对象中所有属性为单独响应式数据,对象成为普通对象
- ref()
- 定义简单数据类型,使其成为响应数据
- 在修改值,获取值的时候需要使用.value
- 在模板中使用ref申明的响应式数据,可以忽略.value
- computed()
- 用来定义计算属性,计算属性不能改变
- 当需要依赖现有的响应式数据,并根据一定逻辑获取新的数据,需要用到computed
const newage=computed(()=>{
return obj.age+1
})
//目的是让计算属性实现数据双向绑定
const newage=computed({
get(){
return obj.age+1
}
set(val){
obj.age.value=obj.age-val
}
})
- watch()
//1.监听一个ref数据
watch(age,(newage,oldage)=>{
console.log(newage,oldage)
})
//2.监听一个reactive数据
watch(obj,(newVal,oldVal)=>{
console.log(newVal,oldVal)
})
//3.监听多个数据的改变
watch([obj,age],()=>{
})
//4.监听对象中某一属性的变化
//需要写成函数返回该属性的方式才可以监听到
watch(()=>obj.name,()=>{
})
//5.监听对象深层
watch(obj,(new,old)=>{
},{
deep:true,//深度监听,用于只监听对象某个属性的属性
immediate:true//默认执行一次
})
- ref
- 先定义一个空的响应式数据(ref)
- setup中返回该数据,并在元素上绑定响应式数据
let domlist=[]
const setDom=(el)=>{
domlist.push(el )
}
- 父向子通讯
setup(props){
//获取父组件数据money
console.log(props.money)
}
- 子向父通讯
//子组件
setup(props,{emit}){
const changeMoney=()=>{
emit('change-money',50)
}
return {changeMoney}
}
//父组件
setup(){
const updateMoney=(newMoney)=>{
console.log(newMoney)
}
}
//父组件书写
<son :money='money' @change-money='updateMoney'>
//父组件语法糖简写
<son v-model:money='money'>
- 依赖注入
- 一个父组件,包含子组件,孙组件等好多后代组件,共享父组件数据
//父组件
setup(){
const money=ref(100)
const changeMoney=()=>{
money+=1
}
provide('money',money)
return {money}
}
//后代组件
setup(){
const money=inject('money')
//不能自己定义修改父组件数据的方法,需要调用父组件方法
const changeMoney=inject('changeMoney')
return {money,changeMoney}
}
- mixin
- 对于相同的逻辑不同的界面,可以使用mixin
- vue3不推荐使用
//局部引入
import {follwoMixin} from './mixin.js'
export default{
mixins:[follwoMixin]
}
//全局
app.mixin({})