当前位置: 首页 > article >正文

8、watch数据监视

一、监视ref基本类型数据

  1. 监视ref定义的【基本类型】数据

Student.vue

<template>
<div>
    <h1>watch ref类型数据</h1>
    <h1>{{ sum }}</h1>
    <button @click="addSum">sum点我加1</button>
   
</div>
</template>

<script setup lang="ts" name="Student">
    import { ref ,watch} from 'vue';
   let sum=ref(0)

   function addSum(){
    sum.value+=1
   }

//    监听sum数据变化
const stopWatch=watch(sum,(newValue,oldValue)=>{
    console.log('sum变化了',newValue,oldValue)
    if (newValue>3){
        stopWatch()
    }

})


    
</script>

<style scoped>

</style>

二、监视ref对象类型数据

  1. 监视ref定义的【对象类型】数据,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视。

注意:

若修改的是ref定义的对象中的属性,newValueoldValue 都是新值,因为它们是同一个对象。

若修改整个ref定义的对象,newValue 是新值, oldValue 是旧值,因为不是同一个对象了。

Student.vue

<template>
    <div>
        <h1>watch ref对象类型数据监听</h1>
        <h1>学生姓名:{{ sutdentInfo.name }}</h1>
        <h1>学生年龄:{{ sutdentInfo.age }}</h1>
        <button @click="upName">修改学生姓名</button> <br /><br /><br />
        <button @click="upAge">修改学生年龄</button><br /><br /><br />
        <button @click="upStudent">修改整个学生信息</button>


    </div>
</template>

<script setup lang="ts" name="Student">
import { ref, watch } from 'vue';
let sutdentInfo = ref({ name: "张三", age: 18 })


function upName() {
    sutdentInfo.value.name += '~'

}

function upAge() {
    sutdentInfo.value.age += 1
}

function upStudent() {
    sutdentInfo.value = { name: "李四", age: 19 }
}


/* 
    监视,情况一:监视【ref】定义的【对象类型】数据,监视的是对象的地址值,若想监视对象内部属性的变化,需要手动开启深度监视
    watch的第一个参数是:被监视的数据
    watch的第二个参数是:监视的回调
    watch的第三个参数是:配置对象(deep、immediate等等.....) 
  */
watch(sutdentInfo, (newValue, oldValue) => {
    console.log('student变化了', newValue, oldValue)


},{deep:true})



</script>

<style scoped></style>

三、监视reactive对象类型数据

监视reactive定义的【对象类型】数据,且默认开启了深度监视。

Student.vue

<template>
    <div>
        <h1>watch reactive对象类型数据监听</h1>
        <h1>学生姓名:{{ sutdentInfo.name }}</h1>
        <h1>学生年龄:{{ sutdentInfo.age }}</h1>
        <button @click="upName">修改学生姓名</button> <br /><br /><br />
        <button @click="upAge">修改学生年龄</button><br /><br /><br />
        <button @click="upStudent">修改整个学生信息</button>


    </div>
</template>

<script setup lang="ts" name="Student">
import { reactive, watch } from 'vue';
let sutdentInfo = reactive({ name: "张三", age: 18 })


function upName() {
    sutdentInfo.name += '~'

}

function upAge() {
    sutdentInfo.age += 1
}

function upStudent() {
    Object.assign(sutdentInfo,{ name: "李四", age: 19 })
}


/* 
    监视,情况一:监视【ref】定义的【对象类型】数据,监视的是对象的地址值,若想监视对象内部属性的变化,需要手动开启深度监视
    watch的第一个参数是:被监视的数据
    watch的第二个参数是:监视的回调
    watch的第三个参数是:配置对象(deep、immediate等等.....) 
  */
watch(sutdentInfo, (newValue, oldValue) => {
    console.log('student变化了', newValue, oldValue)


})



</script>

<style scoped></style>

四、监视ref和reactive对象里面的属性值

监视refreactive定义的【对象类型】数据中的某个属性,注意点如下:

  1. 若该属性值不是【对象类型】,需要写成函数形式。
  2. 若该属性值是依然是【对象类型】,可直接编,也可写成函数,建议写成函数。

结论:监视的要是对象里的属性,那么最好写函数式,注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视。

Student.vue

<template>
  <div class="person">
    <h1>情况四:监视【ref】或【reactive】定义的【对象类型】数据中的某个属性</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>汽车:{{ person.car.c1 }}、{{ person.car.c2 }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changeC1">修改第一台车</button>
    <button @click="changeC2">修改第二台车</button>
    <button @click="changeCar">修改整个车</button>
  </div>
</template>

<script lang="ts" setup name="Person">
  import {reactive,watch} from 'vue'

  // 数据
  let person = reactive({
    name:'张三',
    age:18,
    car:{
      c1:'奔驰',
      c2:'宝马'
    }
  })
  // 方法
  function changeName(){
    person.name += '~'
  }
  function changeAge(){
    person.age += 1
  }
  function changeC1(){
    person.car.c1 = '奥迪'
  }
  function changeC2(){
    person.car.c2 = '大众'
  }
  function changeCar(){
    person.car = {c1:'雅迪',c2:'爱玛'}
  }

  // 监视,情况四:监视响应式对象中的某个属性,且该属性是基本类型的,要写成函数式
  /* watch(()=> person.name,(newValue,oldValue)=>{
    console.log('person.name变化了',newValue,oldValue)
  }) */

  // 监视,情况四:监视响应式对象中的某个属性,且该属性是对象类型的,可以直接写,也能写函数,更推荐写函数
  watch(()=>person.car,(newValue,oldValue)=>{
    console.log('person.car变化了',newValue,oldValue)
  },{deep:true})
</script>

五、同时监视多个数据

Student.vue

<template>
  <div class="person">
    <h1>情况五:监视上述的多个数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>汽车:{{ person.car.c1 }}、{{ person.car.c2 }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changeC1">修改第一台车</button>
    <button @click="changeC2">修改第二台车</button>
    <button @click="changeCar">修改整个车</button>
  </div>
</template>

<script lang="ts" setup name="Person">
  import {reactive,watch} from 'vue'

  // 数据
  let person = reactive({
    name:'张三',
    age:18,
    car:{
      c1:'奔驰',
      c2:'宝马'
    }
  })
  // 方法
  function changeName(){
    person.name += '~'
  }
  function changeAge(){
    person.age += 1
  }
  function changeC1(){
    person.car.c1 = '奥迪'
  }
  function changeC2(){
    person.car.c2 = '大众'
  }
  function changeCar(){
    person.car = {c1:'雅迪',c2:'爱玛'}
  }

  // 监视,情况五:监视上述的多个数据
  watch([()=>person.name,person.car],(newValue,oldValue)=>{
    console.log('person.car变化了',newValue,oldValue)
  },{deep:true})

</script>


http://www.kler.cn/a/400798.html

相关文章:

  • 【微服务】Spring AI 使用详解
  • React教程第二节之虚拟DOM与Diffing算法理解
  • BERT模型中的多头注意力机制详解
  • Elasticsearch 重建索引 数据迁移
  • Ubuntu22.04 安装mysql8 无法修改端口及配置的问题 坑啊~~~~
  • 《Python 网络爬虫》
  • Vscode离线安装插件的方法
  • ed by: java.lang.NoClassDefFoundError: android
  • 【redis】—— 环境搭建教程
  • CSS基础知识04
  • [C++]:C++11(一)
  • 基于Java的校园便利平台
  • elasticsearch是如何实现master选举的?
  • Matlab信号处理:短时傅里叶变换
  • Spring Boot汽车世界:资讯与技术的交汇
  • vue路由的钩子函数?
  • 离散数学与数据结构是什么关系
  • SLM561A系列60V10-50mA单通道线性恒流LED驱动芯片,为汽车照明、景观照明助力
  • 力扣2298. 周末任务计数
  • Linux系统-redis集群、nacos、nginx、keepalived、mysql开机自启
  • RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)
  • 网络编程 -------- 3、TCP_UDP_UNIX
  • 汽车资讯新动力:Spring Boot技术革新
  • 约克VRF中央空调新天氟地水/天氟热水,做冬日生活的温暖守护者
  • Getx:响应式数据,实现数据的局部刷新
  • Hybird和WebView