import{defineComponent,reactive,ref,toRefs}from'vue';
exportdefaultdefineComponent({
setup(props,context){
letstate=reactive({
name:'test'
});
constage=ref(18)
return{
...toRefs(state),
age
}
}
});
六、computed()
该函数用来创造计算属性,和过去一样,它返回的值是一个ref对象。里面可以传方法,或者一个对象,对象中包含set()、get()方法
6.1创建只读的计算属性
import{computed,defineComponent,ref}from'vue';
exportdefaultdefineComponent({
setup(props,context){
constage=ref(18)
//根据age的值,创建一个响应式的计算属性readOnlyAge,它会根据依赖的ref自动计算并返回一个新的ref
constreadOnlyAge=computed(()=>age.value++)//19
return{
age,
readOnlyAge
}
}
});
6.2通过set()、get()方法创建一个可读可写的计算属性
import{computed,defineComponent,ref}from'vue';
exportdefaultdefineComponent({
setup(props,context){
constage=ref(18)
constcomputedAge=computed({
get:()=>age.value+1,
set:value=>age.value+value
})
//为计算属性赋值的操作,会触发set函数,触发set函数后,age的值会被更新
age.value=100
return{
age,
computedAge
}
}
});
七、watch()函数
watch函数用来侦听特定的数据源,并在回调函数中执行副作用。默认情况是懒执行的,也就是说仅在侦听的源数据变更时才执行回调。
7.1监听用reactive声明的数据源
import{computed,defineComponent,reactive,toRefs,watch}from'vue';
interfacePerson{
name:string,
age:number
}
exportdefaultdefineComponent({
setup(props,context){
conststate=reactive({name:'vue',age:10})
watch(
()=>state.age,
(age,preAge)=>{
console.log(age);//100
console.log(preAge);//10
}
)
//修改age时会触发watch的回调,打印变更前后的值
state.age=100
return{
...toRefs(state)
}
}
});
7.2监听用ref声明的数据源
import{defineComponent,ref,watch}from'vue';
interfacePerson{
name:string,
age:number
}
exportdefaultdefineComponent({
setup(props,context){
constage=ref(10);
watch(age,()=>console.log(age.value));//100
//修改age时会触发watch的回调,打印变更后的值
age.value=100
return{
age
}
}
});
7.3同时监听多个值
import{computed,defineComponent,reactive,toRefs,watch}from'vue';
interfacePerson{
name:string,
age:number
}
exportdefaultdefineComponent({
setup(props,context){
conststate=reactive({name:'vue',age:10})
watch(
[()=>state.age,()=>state.name],
([newName,newAge],[oldName,oldAge])=>{
console.log(newName);
console.log(newAge);
console.log(oldName);
console.log(oldAge);
}
)
//修改age时会触发watch的回调,打印变更前后的值,此时需要注意,更改其中一个值,都会执行watch的回调
state.age=100
state.name='vue3'
return{
...toRefs(state)
}
}
});
7.4stop停止监听
在setup()函数内创建的watch监视,会在当前组件被销毁的时候自动停止。如果想要明确地停止某个监视,可以调用watch()函数的返回值即可,语法如下:
import{set}from'lodash';
import{computed,defineComponent,reactive,toRefs,watch}from'vue';
interfacePerson{
name:string,
age:number
}
exportdefaultdefineComponent({
setup(props,context){
conststate=reactive({name:'vue',age:10})
conststop=watch(
[()=>state.age,()=>state.name],
([newName,newAge],[oldName,oldAge])=>{
console.log(newName);
console.log(newAge);
console.log(oldName);
console.log(oldAge);
}
)
//修改age时会触发watch的回调,打印变更前后的值,此时需要注意,更改其中一个值,都会执行watch的回调
state.age=100
state.name='vue3'
setTimeout(()=>{
stop()
//此时修改时,不会触发watch回调
state.age=1000
state.name='vue3-'
},1000)//1秒之后讲取消watch的监听
return{
...toRefs(state)
}
}
});
八、LifeCycleHooks(新的生命后期)
新版的生命周期函数,可以按需导入到组件中,且只能在setup()函数中使用,但是也可以在setup外定义,在setup中使用
import{set}from'lodash';
import{defineComponent,onBeforeMount,onBeforeUnmount,onBeforeUpdate,onErrorCaptured,onMounted,onUnmounted,onUpdated}from'vue';
exportdefaultdefineComponent({
setup(props,context){
onBeforeMount(()=>{
console.log('beformounted!')
})
onMounted(()=>{
console.log('mounted!')
})
onBeforeUpdate(()=>{
console.log('beforupdated!')
})
onUpdated(()=>{
console.log('updated!')
})
onBeforeUnmount(()=>{
console.log('beforunmounted!')
})
onUnmounted(()=>{
console.log('unmounted!')
})
onErrorCaptured(()=>{
console.log('errorCaptured!')
})
return{}
}
});
九、Templaterefs
通过refs来回去真实dom元素,这个和react的用法一样,为了获得对模板内元素或组件实例的引用,我们可以像往常一样在setup()中声明一个ref并返回它
- 还是跟往常一样,在html中写入ref的名称
- 在steup中定义一个ref
- steup中返回ref的实例
- onMounted中可以得到ref的RefImpl的对象,通过.value获取真实dom
1111