vue3中watch的使用及一些问题

         在写项目的时候当我们想要实时监听响应式数据的变化时候,难免会用到watch,vue3在watch使用这方面相对于vue2还是做出了一些升级,下面介绍一些注意的点,及一些问题。

(注:这里我用的是setup语法糖)。

① 情况一:监听ref所定义的一个响应式数据

<template> 
<div>
          <!-- watch监听 -->
          <h2>当前求和为:{{ sum }}</h2>
          <button @click="sum++">sum++</button>
        </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'


// watch监听
let sum = ref(0)
// ① 情况一:监听ref所定义的一个响应式数据
watch(sum, (newValue,oldValue) => {
  console.log(newValue,oldValue);
  
},{immediate:true})  // 立即监听 0,undefined
</script>

② 情况二:监听ref所定义的多个响应式数据

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
// watch监听
watch([sum,msg],(newValue,oldValue) => {
  console.log(newValue,oldValue);   // [sum新,msg新],[sum旧,msg旧]
  
}, { immediate: true })  // 立即监听  [0,'你好啊'],[]

</script>

③ 情况三:监听reactive所定义的多个响应式数据(此处无法正确的获取oldValue) ---全部

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
     <h2>姓名:{{ person.name }}</h2>
     <h2>年龄:{{ person.age }}</h2>
     <button @click="person.name += '-'">增长姓名</button>
     <button @click="person.age++">增长年龄</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
let person = reactive({
  name: '张三',
  age:18
})
// watch监听
watch(person, (newValue,oldValue) => {
  console.log(newValue,oldValue);   // 这里的oldValue失效:如果真的需要oldValue的值就把这个值拿出去声明变量
})

</script>

情况三(在多介绍一个)通过ref定义一个对象(此处仍然无法正确的获取oldValue)因为它内部还是会求助reactive的Proxy(注意此处监听ref定义的对象需要.value哦,结构html里不需要)。------全部

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
     <h2>姓名:{{ person1.name }}</h2>
     <h2>年龄:{{ person1.age }}</h2>
     <button @click="person1.name += '-'">增长姓名</button>
     <button @click="person1.age++">增长年龄</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
let person1 = ref({
  name: '张三',
  age:18
})
// watch监听
watch(person1.value, (newValue,oldValue) => {
  console.log(newValue,oldValue);   // 这里的oldValue依然是失效:如果真的需要oldValue的值就把这个值拿出去声明变量
})


</script>

④情况四:监听reactive所定义的一个响应式数据中某个属性(这里oldValue是可以正常输出)--某一个

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
     <h2>姓名:{{ person1.name }}</h2>
     <h2>年龄:{{ person1.age }}</h2>
     <button @click="person1.name += '-'">增长姓名</button>
     <button @click="person1.age++">增长年龄</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
let person1 = ref({
  name: '张三',
  age:18
})
// watch监听
watch(()=>person.age, (newValue, oldValue) => {
  console.log(newValue, oldValue);   // 这里的oldValue好用
})


</script>

⑤情况五:监听reactive所定义的某些响应式数据中某个属性(这里oldValue是可以使用的)----某些

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
     <h2>姓名:{{ person1.name }}</h2>
     <h2>年龄:{{ person1.age }}</h2>
     <button @click="person1.name += '-'">增长姓名</button>
     <button @click="person1.age++">增长年龄</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
let person1 = ref({
  name: '张三',
  age:18
})
watch([()=>person.age,()=>person.name], (newValue, oldValue) => {
  console.log(newValue, oldValue);   // 这里的oldValue好用
})


</script>

特殊情况:(此处由于监视的是reactive定义的对象(必须是对象)的某个属性,所以deep配置有效)

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
     <h2>姓名:{{ person1.name }}</h2>
     <h2>年龄:{{ person1.age }}</h2>
     <button @click="person1.name += '-'">增长姓名</button>
     <button @click="person1.age++">增长年龄</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
let person:any = reactive({
  name: '张三',
  age: 18,
  job: {
    j1: {
      salary: 20,
    }
  }

})
watch(()=>person.job, (newValue, oldValue) => {
  console.log(newValue, oldValue);   // 这里的oldValue又拿不到了
},{deep:true})


</script>

补充ref(.value 的问题):监视简单数据类型不需要.value;

监听ref对象时需要.value。

如果不想.value可以用deep:true(开启深度监听)

<template> 
<div>
     <!-- watch监听 -->
     <h2>当前求和为:{{ sum }}</h2>
     <button @click="sum++">sum++</button>
     <h2>当前信息为:{{ msg }}</h2>
     <button @click="msg+='!'">msg</button>
     <h2>姓名:{{ person1.name }}</h2>
     <h2>年龄:{{ person1.age }}</h2>
     <button @click="person1.name += '-'">增长姓名</button>
     <button @click="person1.age++">增长年龄</button>
 </div>
</template>
<script setup lang="ts">
import { ref, onMounted, reactive,watch} from 'vue'

let sum = ref(0)
let msg: any = ref('你好啊')
let person1 = ref({
  name: '张三',
  age:18
})
// watch监听
watch(person1, (newValue,oldValue) => {
  console.log(newValue,oldValue);   // 这里的oldValue依然是失效:如果真的需要oldValue的值就把这个值拿出去声明变量
},{deep:true})


</script>

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3watch使用方式有所改变Vue 3引入了一个新的API即`watchEffect`,它可以用来监听响应式数据的变化并执行相应的操作。 `Effect`函数接受一个回调函数作为参数,该调函数会在响应式数据发生化时被调用。在回调函数,你可以执行任何需要的操作,比如更新DOM、发送网络请求等。 下面是一个使用`Effect`的示例: ```javascript import reactive, watchEffect } from 'vue'; const state = reactive({ count: 0, }); watchEffect(() => { console.log('count changed:', state.count); }); // 修改count的值 state.count++; // 输出:count changed: 1 state.count++; // 输出:count changed: 2 ``` 在上面的示例,我们创建了一个响应式对象`state`,其包含一个属性`count`。然后,我们使用`watchEffect`来监听`state.count`的变化,并在每次变化时打印出新的值。 除了`watchEffect`,Vue 3还提供了`watch`函数,它可以用来监听指定的响应式数据或计算属性的变化。与Vue 2的`$watch`方法类似,你可以通过传递一个回调函数和可选的配置选项来使用它。 下面是一个使用`watch`的示例: ```javascript import { reactive, watch } from 'vue'; const state = reactive({ count: 0, }); watch( () => state.count, (newValue, oldValue) => { console.log('count changed:', newValue); } ); // 修改count的值 state.count++; // 输出:count changed: 1 state.count++; // 输出:count changed: 2 ``` 在上面的示例,我们使用`watch`来监听`state.count`的变化,并在每次变化时打印出新的值。回调函数的第一个参数是新的值,第二个参数是旧的值。 总结一下,Vue 3watch使用方式有两种:`watchEffect`和`watch`。`watchEffect`用于监听响应式数据的变化,而`watch`用于监听指定的响应式数据或计算属性的变化。 --问题--: 1. Vue 3watch有哪些使用方式? 2 如何使用watchEffect来监听响应式数据的变化? 3. 如何使用watch监听指定的响应式数据或计算属性的变化?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值