|
这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 zzz 于 2025-9-4 16:28 编辑
watch是什么?
在vue3中,watch函数被重新设计为一个独立的API,用于观察数据变化并执行相应的操作。
watch 函数接受两个参数:
第一个:可以是一个函数或数组。如果是函数,则返回要监听的数据,当数据变化时会触发回调函数;如果是数组,则返回一个数组,包含要监听的多个数据,当任意一个数据变化时都会触发回调函数。
第二个:一个回调函数,用于处理数据变化时的操作。回调函数接收两个参数,第一个参数为新值,第二个参数为旧值。
有两个额外的参数:1.immediate(画面加载后立即执行),2.deep(深度侦听)。
例1:监听单个数据
- <template>
- <h1>数量变化:{{ count }}</h1>
- <a-button @click="addcount">++count</a-button>
- </template>
- <script setup>
- // 声明变量count
- const count=ref(0)
- // count触发方法
- const addcount=()=>{
- count.value++
- }
- // 触发监听器---单个数据监听
- watch(count,(newValue,oldValue)=>{
- console.log(`count变化,旧值:${oldValue},新值:${newValue}`);
- })
- </script>
复制代码 例2:监听单个数据
- <template>
- <h1>数量变化:{{ name }}/{{ count }}</h1>
- <a-button @click="handleChangeName">++count</a-button>
- </template>
- <script setup>
- // 声明变量count
- const name=ref('小明')
- const count=ref(0)
- // 触发方法
- const handleChangeName=()=>{
- count.value++
- name.value='小小明!!!'
- }
- // 触发监听器---多个数据监听
- watch([count,name],([newCount,newName],[oldCount,oldName])=>{
- console.log(`count变化,旧值为:${oldCount},新值为:${newCount}`);
- console.log(`name变化,旧值为:${oldName},新值为:${newName}`);
- })
- </script>
复制代码 例3:监听多个值的变化
- <template>
- <a-form :model="form" label-width="120px">
- <a-form-item label="价格">
- <a-input v-model="form.price" />
- </a-form-item>
- <a-form-item label="数量">
- <a-input v-model="form.count" />
- </a-form-item>
- <a-form-item label="总价">
- <a-input v-model="form.total" />
- </a-form-item>
- <a-form-item>
- <a-button @click="setForm">计算</a-button>
- </a-form-item>
- </a-form>
- </template>
-
- <script setup>
- const form = ref(
- { price: '', count: '', total: '' }
- );
-
- const setForm = () => {
- form.value = {
- price: '24',
- count: '400',
- total: '9600'
- }
- }
-
- // immediate:立刻执行,进入页面就执行一次,一般用于画面的初始化显示。
- watch(form, (newVal, oldVal) => {
- console.log("进入页面执行了")
- console.log("新值:" + newVal + ",旧值:" + oldVal);
- }, {
- immediate: true
- })
-
- // deep:深度监视,如果要监听的响应式对象中有多个属性,默认是浅层监听。
- // 传入的响应式对象,如果是简单类型,可以直接监听,如果是复杂类型,监视不到复杂类型内部属性的变化,按照下面的示例,只有form.value重新设置了一个对象,监听才会触发
- // 只有对象的地址发生了变化,才会触发监听,设置deep为true时,对象及对象中的某个属性发生变化时,也可以监听到
- // 如果对象中的属性过多,会影响使用,一般不建议开深度监听
-
- // 深度监听
- watch(form, (newval, oldVal) => {
- console.log("深度监听触发")
- console.log(newval);
- }, { deep: true })
-
- // 精确侦听对象的某个属性
- watch(
- () => form.value.price,
- (newVal, oldVal) => {
- console.log("精确侦听对象的某个属性");
- console.log(newVal, oldVal);
- }
- )
-
- // 可以侦听某两个属性操作后的值
- watch(
- () => Number(form.value.price) * Number(form.value.count),
- (sum) => {
- console.log("执行了");
- form.value.total = ''
- if (sum) {
- form.value.total = sum.toFixed(2);
- }
- }
- )
- </script>
复制代码
|
|