Vue3数据监听器

数据监听器

计算属性允许我们声明性地计算衍生值。然而在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数:

  • watch主要用于以下场景:
    • 当数据发生变化时需要执行相应的操作
    • 监听数据变化,当满足一定条件时触发相应操作
    • 在异步操作前或操作后需要执行相应的操作

监控响应式数据(watch):

<script type="module" setup>
  //引入模块
  import { ref,reactive,watch} from 'vue'
 
  let firstname=ref('')
  let lastname=reactive({name:''})
  let fullname=ref('')

  //监听一个ref响应式数据
  watch(firstname,(newValue,oldValue)=>{
    console.log(`${oldValue}变为${newValue}`)
    fullname.value=firstname.value+lastname.name
  })
  //监听reactive响应式数据的指定属性
  watch(()=>lastname.name,(newValue,oldValue)=>{
    console.log(`${oldValue}变为${newValue}`)
    fullname.value=firstname.value+lastname.name
  })
  //监听reactive响应式数据的所有属性(深度监视,一般不推荐)
  //deep:true 深度监视
  //immediate:true 深度监视在进入页面时立即执行一次
  watch(()=>lastname,(newValue,oldValue)=>{
    // 此时的newValue和oldValue一样,都是lastname
    console.log(newValue)
    console.log(oldValue)
    fullname.value=firstname.value+lastname.name
  },{deep:true,immediate:false})
</script>

<template>
  <div>
    全名:{{fullname}} <br>
    姓氏:<input type="text" v-model="firstname"> <br>
    名字:<input type="text" v-model="lastname.name" > <br>
  </div>
</template> 

<style scoped>
</style>

监控响应式数据(watchEffect):

  • watchEffect默认监听所有的响应式数据
<script type="module" setup>
  //引入模块
  import { ref,reactive,watch, watchEffect} from 'vue'
 
  let firstname=ref('')
  let lastname=reactive({name:''})
  let fullname=ref('')

  //监听所有响应式数据
  watchEffect(()=>{
    //直接在内部使用监听属性即可!不用外部声明
    //也不需要,即时回调设置!默认初始化就加载!
    console.log(firstname.value)
    console.log(lastname.name)
    fullname.value=`${firstname.value}${lastname.name}`
  })
</script>

<template>
  <div>
    全名:{{fullname}} <br>
    姓氏:<input type="text" v-model="firstname"> <br>
    名字:<input type="text" v-model="lastname.name" > <br>
  </div>
</template> 

<style scoped>
</style>

watch vs. watchEffect

  • watchwatchEffect 都能响应式地执行有副作用的回调。它们之间的主要区别是追踪响应式依赖的方式:
    • watch 只追踪明确侦听的数据源。它不会追踪任何在回调中访问到的东西。另外,仅在数据源确实改变时才会触发回调。watch 会避免在发生副作用时追踪依赖,因此,我们能更加精确地控制回调函数的触发时机。
    • watchEffect,则会在副作用发生期间追踪依赖。它会在同步执行过程中,自动追踪所有能访问到的响应式属性。这更方便,而且代码往往更简洁,但有时其响应性依赖关系会不那么明确。
  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中,监听器的用法发生了一些变化。Vue2中使用的`$watch`方法已经被废弃,取而代之的是`watch`函数。下面是监听器的基本用法: ```javascript import { watch } from 'vue'; const state = { count: 0, }; watch( () => state.count, // 监听的数据 (newValue, oldValue) => { // 数据改变时执行的回调函数 console.log(`count 从 ${oldValue} 变成了 ${newValue}`); } ); ``` 在上面的例子中,我们使用了`watch`函数来监听`state.count`变量的变化。当`count`发生变化时,我们会在控制台上输出变化前后的值。 我们还可以使用`immediate`选项来立即执行回调函数: ```javascript watch( () => state.count, (newValue, oldValue) => { console.log(`count 从 ${oldValue} 变成了 ${newValue}`); }, { immediate: true } ); ``` `watch`函数的第三个参数可以是一个选项对象,用来设置监听器的一些选项。除了`immediate`之外,还有`deep`、`flush`等选项可供使用。 ```javascript watch( () => state.obj, (newValue, oldValue) => { console.log('obj 变化了'); }, { deep: true, // 是否深度监听对象的变化 flush: 'sync', // 在什么时候执行回调函数,可选值:'pre'、'post'、'sync' } ); ``` 除了使用`watch`函数之外,我们还可以在模板中使用`watch`指令来监听数据的变化。 ```html <template> <div> <p>{{ count }}</p> <button @click="increment">+</button> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const count = ref(0); function increment() { count.value++; } return { count, increment, }; }, watch: { count(newValue, oldValue) { console.log(`count 从 ${oldValue} 变成了 ${newValue}`); }, }, }; </script> ``` 在上面的例子中,我们在组件的`watch`选项中定义了一个监听器,用来监听`count`变量的变化。当`count`发生变化时,我们会在控制台上输出变化前后的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值