计算属性与监视
computed函数
- 如果传入一个回调,表示是get
const fullName1= computed(()=>{
return user.firstName+'_'+user.lastName
})
- 如果要有get和set,那需要传入一个对象
const fullName2= computed({
get(){
return user.firstName+'_'+user.lastName
},
set(val:string){
const names=val.split('_')
user.firstName=names[0]
user.lastName=names[1]
}
})
watch函数
和vue2的区别可以:监听自身属性了? 可以深度监听是真的方便
const fullName3=ref('')
watch(user,({firstName,lastName})=>{
fullName3.value=firstName+'_'+lastName
},{immediate:true,deep:true})
watch可以监听多个数据,如果监听非响应式数据要加()=>
watch([()=>user.firstName,()=>user.lastName],()=>{
console.log('++++');
})
watchEffect函数
watchEffect(()=>{
fullName3.value=user.firstName+'_'+user.lastName
})
通过watchEffect实现监听改变firstName和lastName
watchEffect(()=>{
const names=fullName3.value.split('_')
user.firstName=names[0]
user.lastName=names[1]
})
完整代码
<template>
<h2>计算属性和监视</h2>
<fieldset>
<legend>姓名操作</legend>
姓氏:<input type="text" placeholder="请输入姓氏" v-model="user.firstName"/><br/>
名字:<input type="text" placeholder="请输入名字" v-model="user.lastName"/>
</fieldset>
<fieldset>
<legend>计算属性和监视的演示</legend>
姓名<input type="text" placeholder="显示姓名" v-model="fullName1"/><br/>
姓名<input type="text" placeholder="显示姓名" v-model="fullName2"/><br/>
姓名<input type="text" placeholder="显示姓名" v-model="fullName3"/><br/>
</fieldset>
</template>
<script lang="ts">
import {computed, defineComponent, reactive,watch,ref, watchEffect} from 'vue'
export default defineComponent({
name:'App',
setup(){
const user=reactive({
firstName:'1',
lastName:'2'
})
const fullName1= computed(()=>{
return user.firstName+'_'+user.lastName
})
const fullName2= computed({
get(){
return user.firstName+'_'+user.lastName
},
set(val:string){
const names=val.split('_')
user.firstName=names[0]
user.lastName=names[1]
}
})
const fullName3=ref('')
watch(user,({firstName,lastName})=>{
fullName3.value=firstName+'_'+lastName
},{immediate:true,deep:true})
watchEffect(()=>{
const names=fullName3.value.split('_')
user.firstName=names[0]
user.lastName=names[1]
})
watch([()=>user.firstName,()=>user.lastName],()=>{
console.log('++++');
})
return{
user,
fullName1,
fullName2,
fullName3
}
}
})
</script>
|