vue3 watch属性
鹏程933 人气:0- 是Vue3的 composition API中2个最重要的响应式API
- ref用来处理基本类型数据, reactive用来处理对象(递归深度响应式)
- 如果用ref对象/数组, 内部会自动将对象/数组转换为reactive的代理对象
- ref内部: 通过给value属性添加getter/setter来实现对数据的劫持
- reactive内部: 通过使用Proxy来实现对对象内部所有数据的劫持, 并通过Reflect操作对象内部数据
- ref的数据操作: 在js中要.value, 在模板中不需要(内部解析模板时会自动添加.value)
<template> <div>ref与</div> <div>msg1:{{msg1}}</div> <div>msg2:{{msg2}}</div> <div>msg3:{{msg3}}</div> <button @click="updata">改变</button> </template> <script lang="ts"> import {reactive, ref} from "vue"; export default { setup(){ const msg1=ref('hello') const msg2 = reactive({ name: 'jack', wife: { name:'rose' } }) const msg3 = ref({ // ref中如果是一个对象,那么经过了reactive处理,形成了Proxy对象 name: 'jack', wife: { name: 'rose' } }) function updata(){ msg1.value += '++' msg2.wife.name += '++' msg3.value.wife.name += '++' } return { msg1, msg2, msg3, updata } } } </script>
计算属性与监视
computed函数:
- 与computed配置功能一致
- 有getter/setter
与watch配置功能一致
- 监视指定的一个或多个响应式数据, 一旦数据变化, 就自动执行监视回调
- 默认初始时不执行回调, 但可以通过配置immediate为true, 来指定初始时立即执行第一次
- 通过配置deep为true, 来指定深度监视
watchEffect函数
- 不用直接指定要监视的数据, 回调函数中使用的哪些响应式数据就监视哪些响应式数据
- 默认初始时就会执行第一次, 从而可以收集需要监视的数据
- 监视数据发生变化时回调
<template> <h1>计算属性与监视</h1> <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 {reactive, ref, computed, watch, watchEffect} from "vue"; export default { setup() { const user=reactive({ firstName:'东方', lastName: '不败' }) /* * Vue3中的计算属性 * 计算属性如果只传入一个回调函数,那么表示get * 返回的是一个ref对象 * */ const fullName1=computed(()=>{ return user.firstName + '-' + user.lastName }) const fullName2=computed({ get(){ return user.firstName + '-' + user.lastName }, set(val){ const name=val.split('-') user.firstName=name[0] user.lastName=name[1] } }) // 监视属性 let fullName3=ref('') watch(user,({firstName,lastName})=>{ // user里面对象解构赋值 fullName3.value=firstName + '-' +lastName },{immediate:true}) // immediate 开始时执行一次 还可以加deep 深度监视 // watchEffect(()=>{ // fullName3.value=user.firstName + '-' +user.lastName // }) // 更智能,开始就自动执行一次 /* * wathc可以监视多个属性,监听非响应式数据时,需要()=> * */ watch([()=>user.firstName,()=>user.lastName],()=>{ console.log("watch执行了") }) return { user, fullName1, fullName2, fullName3 } } } </script>
加载全部内容