重学vue之vue3中compositionAPI
程序员文章站
2022-03-08 08:06:55
一、ref, reactive, toRef,toRefs, readonly响应式的引用1.1ref的使用1.2reactive的使用1.3toRefs的使用1.4toRef的使用1.5readonly的使用二、setup函数的参数三、计算属性四、监听器4.1基本使用4.2watchEffect使用五、生命周期函数六、Provide,Inject传递值,Ref获取dom的用法6.1Provide与Inject使用6.2 获取dom一、ref, react....
- 一、ref, reactive, toRef,toRefs, readonly响应式的引用
- 二、setup函数的参数
- 三、计算属性
- 四、监听器
- 五、生命周期函数
- 六、Provide,Inject传递值,Ref获取dom的用法
一、ref, reactive, toRef,toRefs, readonly响应式的引用
- ref 处理基础类型的数据
- reactive 处理数组、对象数据
- toRefs 处理对象结构之后的数据,无默认值
- toRef 处理对象结构之后的数据,有默认值
- readonly 只能读的响应式数据
1.1ref的使用
setup(props, context) {
//处理基本类型
const { ref } = Vue;
//现在name就是响应式的数据,2秒后改变,依然会更新视图
let name = ref('123');
setTimeout(() => {
name.value = '456'
}, 2000)
return {name}
}
1.2reactive的使用
setup(props, context) {
//处理对象,数组类型
const { reactive } = Vue;
//现在people就是响应式的数据,2秒后改变,依然会更新视图
const people = reactive({name: '张三', gender: '男'});
setTimeout(() => {
people.name = '李四'
}, 2000)
return {people}
}
1.3toRefs的使用
setup(props, context) {
//处理对象,数组类型解构之后
const { reactive, toRefs } = Vue;
//现在people就是响应式的数据,2秒后改变,依然会更新视图
const people = reactive({name: '张三', gender: '男'});
setTimeout(() => {
people.name = '李四'
}, 2000)
//把people里面的单个属性变为响应式
const { name, gender } = toRefs(people);
return { name, gender }
}
1.4toRef的使用
setup(props, context) {
//处理对象,数组类型解构之后
const { reactive, toRef } = Vue;
//现在people就是响应式的数据,2秒后改变,依然会更新视图
const people = reactive({name: '张三', gender: '男'});
setTimeout(() => {
people.name = '李四'
}, 2000)
//把people里面的单个属性变为响应式
//注意age一开始是没有哒
const { name, gender, age} = toRef(people,'age');
return { name, gender,age }
}
1.5readonly的使用
setup(props, context) {
//处理对象,数组类型解构之后
const { reactive, readonly } = Vue;
//现在people就是响应式的数据,2秒后改变,依然会更新视图
const people = readonly({name: '张三', gender: '男'});
setTimeout(() => {
//会报错
people.name = '李四'
}, 2000)
return { people }
}
二、setup函数的参数
setup(props, context) {
//attrs第一个参数是None-Props属性
//slot是一个方法,调用default方法会返回一个VNODE
//emit是各种事件
const { attrs, slots, emit } = context;
//获取属性
//console.log(attrs.属性名)
//渲染函数
//const { h } = Vue;
//渲染父组件传递过来的插槽
//return ()=>h('div',{},slots.default())
//触发消息事件
//function handleClick() { emit('change'); }
//return { handleClick }
}
三、计算属性
- 仍然使用computed关键字,写法并没有太多的出入。
const app = Vue.createApp({
setup() {
//要引用进来这个computed
const { reactive, computed } = Vue;
const countObj = reactive({ count: 0});
const handleClick = () => {
countObj.count += 1;
}
//和以前一样,使用get与set
let countAddFive = computed({
get: () => {
return countObj.count + 5;
},
set: (param) => {
countObj.count = param - 5;
}
})
setTimeout(() => {
countAddFive.value = 100;
}, 3000)
return { countObj, countAddFive, handleClick }
},
四、监听器
- 与computed一样,新的watch与老版本没有太多出入。
4.1基本使用
- 1、监听基本类型
setup() {
const { ref, watch } = Vue;
//基本类型
const age = ref(18)
//监听age
watch(age,(oldValue,newValue)=>{
console.log("oldValue:",oldValue,"newValue:",newValue,)
})
return {age}
}
- 2、监听对象
setup() {
const { reactive, watch,toRefs} = Vue;
//对象
const people = reactive({age:18})
//监听age
watch(()=>people.age,(oldValue,newValue)=>{
console.log("oldValue:",oldValue,"newValue:",newValue,)
})
//结构一下,直接把这个age转化为响应式,可以直接使用
const {age} = toRefs(people);
return {age}
}
4.2watchEffect使用
setup() {
const { ref,watchEffect,toRefs,reactive} = Vue;
//基本类型
const age = ref(18)
//对象
const people = reactive({name:'张三'})
//监听
watchEffect(() => {
console.log(age);
console.log(people.name);
})
return {age}
}
五、生命周期函数
过渡
- beforeMount => onBeforeMount
- mounted => onMounted
- beforeUpdate => onBeforeUpdate
- beforeUnmount => onBeforeUnmount 页面移除时候触发
- unmouted => onUnmounted
- beforeCreate与created直接写在setup函数中
新增
- onRenderTracked 页面渲染之后,vue会收集一下响应式依赖
- onRenderTriggered 每一次页面重新渲染时候
六、Provide,Inject传递值,Ref获取dom的用法
6.1Provide与Inject使用
父组件setup函数中
setup() {
const { provide} = Vue;
//给后代传递age变量,值为18
provide('age', 18);
return { }
}
后代组件setup函数中
setup() {
const { inject } = Vue;
//接收age变量,默认值为20
const name = inject('age', 20);
return { }
}
6.2 获取dom
<div>
<div ref="a">a</div>
</div>
setup() {
const { ref, onMounted } = Vue;
//这里的a一定是和标签中的ref值对应,然后给ref传null
const a = ref(null);
onMounted(() => {
//注意这里是ref转化的响应式数据,a.value才是dom哈
console.log(a.value);
})
return { a }
}
本文地址:https://blog.csdn.net/qq_45549336/article/details/111034107