首页 > 其他分享 >Vue学习-watch函数的用法

Vue学习-watch函数的用法

时间:2024-12-05 17:00:06浏览次数:8  
标签:count Vue const name ref watch 用法 侦听

1.基本使用--侦听单个元素

1.导入watch函数

2.执行watch函数以及传入需要侦听的响应式数据(ref对象)和回调函数

举个例子:

代码示例:

<script setup>
//导入watch函数
import {ref,watch} from 'vue'
const count = ref(0)

const addcount=()=>{
  count.value++
}
//调用watch函数侦听变化
//ref对象不需要加.value
watch(count,(newValue,oldValue)=>{
  console.log('count变化了','新值为:'+newValue,'老值为:'+oldValue)
})

</script>
<template>
  <div>{{ count }}</div>
  <button @click="addcount">增加</button>
</template>

运行代码,打开浏览器并打开控制台,此时我们不断点击增加按钮,右边控制台就会监视出count的新值和老值。

此时我们就学会了watch最基本的侦听响应式数据了。

2.基础使用-侦听多个数据

说明:同时侦听多个响应式数据的变化,不管哪个数据变化都要执行回调。 

举个例子:

代码示例:

<script setup>
//导入watch函数
import {ref,watch} from 'vue'
const count = ref(0)
const name = ref('HH')
const addCount=()=>{
  count.value++
}

const altName=()=>{
  name.value = 'CC'
}
//watch侦听多个数据源
watch(
  [count,name],(
    //一一对应
    [newCount,newName],[oldCount,oldName])=>{
console.log('count或者name变化了','新值:'+[newCount,newName],'老值:'+[oldCount,oldName])
  }
)
</script>
<template>
  <div>{{ count }}</div>
  <div>{{ name }}</div>
  <button @click="addCount">增加</button>
  <button @click="altName">修改name</button>
</template>

还是老样子运行代码,分别点击增加和修改name,结果如下:

3.immediate

说明:在侦听创建时立即触发回调,响应式数据变化后继续执行回调

举个例子:

代码示例:

<script setup>
//引入ref和watch函数
import { ref, watch } from 'vue'
const count=ref(0)
const addCount=()=>{
  count.value++
}
watch(count,(newValue,oldValue)=>
{
  console.log('count的数值变化:',newValue,oldValue)
},
{
  //加入immedidate,值为true
  immediate:true
})
</script>
<template>
  <div>
  {{ count }}
  </div>
<button @click="addCount">增加</button>
</template>

运行查看控制台:

可以看到,此时我们并没有点击增加按钮,watch函数在创建的时候就触发了回调,在控制台打印出来。

4.deep深度侦听

说明:通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象则不会触发回调执行,需要开启deep:true

举个例子:

代码示例:

<script setup>
import {ref ,watch} from 'vue'
const list=ref({count:0})
watch(list,()=>{
  console.log('数据变化了')
})
const addListCount=()=>{
  //直接修改count
  //这样直接修改属性则不会触发回调
  list.value.count++
}
</script>
<template>
{{ list.count }}
<button @click="addListCount">增加</button>
</template>

我们运行这个代码,发现无论怎么增加也不会触发watch函数里面的打印

此时我们增加 deep:true

再次点击增加就可以看到函数回调,并在控制台打印出了结果:

4.1精确侦听

说明:以上我们用的侦听示例都是基于一个响应式数据或者一个数组中只有一个数据的例子,在现实中一个数组肯定存在多个数据,但是我们侦听的时候会打印出所有的Value,这在实际学习中是是有点麻烦的,使用精确侦听就可以指定数组中的某个数据进行侦听且不显示别的数据,那么怎样才能精确的侦听到你想侦听的内容呢,下面进行举例:

精确侦听对象的某个属性

需求:在不开启deep的前提下,侦听age的变化,只有age变化时候才执行回调

代码示例:

<script setup>
import {ref ,watch} from 'vue'
const info=ref({
  name:'HH',
  age:15
})
//两个回调函数
watch(
  //第一个回调函数:想要监听的对象
  ()=> info.value.age,
  //监听的结果
  (newAge,oldAge)=> console.log('age发生变化了',newAge,oldAge)
)
//修改年龄
const altAge=()=>{
  info.value.age++
}
//修改姓名
const altName=()=>{
  info.value.name = 'YY'
}
</script>
<template>
<ul>
  <li>{{ info.name }}</li>
  <li>{{ info.age }}</li>
</ul>
<button @click="altName">修改姓名</button>
<button @click="altAge">修改年龄</button>
</template>

执行代码,我们在控制台可以看到,当我们点击修改姓名的时候控制台不会打印任何东西,但是我们点击修改年龄的时候,控制台就会打印出年龄的newAge和oldAge

tips:在我们工作的时候,deep尽量不使用,因为deep会进行递归,这样会产生性能损耗,所以尽量不使用deep,精确侦听就是最好的。

标签:count,Vue,const,name,ref,watch,用法,侦听
From: https://blog.csdn.net/qq_62865877/article/details/144244051

相关文章

  • vue学习-组合式API下的父子通信
    1.父传子基本思想:1;父组件给子组件绑定属性2:子组件内部通过props选项接收示例:父组件示例:子组件接收:运行代码打开浏览器,展示结果:这里看到子组件收到了父组件传过来的message成功接收并渲染出来。2.子传父基本思想:1.父组件中给子组件标签通过@绑定事件2.组组件内部......
  • 一文教你用vite创建vue3项目初始化并添加router、axios、Pinia保姆级教程
    文章目录一、什么是vite二、什么是vue3三、什么是router四、什么是axios五、什么是pinia六、详细教程1.查看nodejs版本2.使用vite最新版3.配置@指代src目录(可选)4.安装router5.引入axios6.引入pinia一、什么是viteVite是新一代的前端构建工具,在尤雨溪开发Vue3.0的......
  • 保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录
    文章目录一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面一、什么是PrimeVuePrimeVue是一个用于Vue.js3.x开发的一款高质量、广受欢迎的WebUI组件库。官网地址:https://primevue.org/二......
  • vue3 + TS,使用pinia,实现长连接推送数据的全局更新
    项目中经常会遇到一个长连接推送多个页面数据的情况,针对这种情况,如果每个需要推送数据的页面都写一个长连接,肯定维护起来比较麻烦,那该如何解决呢?话不多说,直接上干活。下载pinia,在maint.ts中进行导入//下载npminstallpinia//main.tsimport{createApp}from"vu......
  • 解决webstorm无法识别@等,无法ctrl跳转问题,vue项目配置
    1.1.配置webpack.config.js文件/*为了webstorm识别vite中设置的别名*/'usestrict'constpath=require('path')module.exports={context:path.resolve(__dirname,'./'),resolve:{extensions:['.js','.vue'......
  • vue3 使用 inject provide 提供全局变量 报错 [Vue warn]: inject() can only be used
    报错:vue3使用injectprovide提供全局变量报错[Vuewarn]:inject()canonlybeusedinsidesetup()orfunctionalfunctionalcomponents.场景main.js//main.js使用provide提供全局变量,做图片的urlapp.provide('imgurl','http://api.baidu.com/')pro.js......
  • VUE-UNI事件转发监听
    VUE以及uni-app如果在项目中事件转发以及监听事件在业务页面a.vue里面,调用了一个第三方接口,这个接口的回调是在项目的app.vue的onShow里面给的回调,那我现在在a.vue里面怎么处理。这个时候就需要做事件的转发,在a页面做事件的监听方法:store下边新建一个jseventBus.jsi......
  • 【SpringBoot+Vue】x-admin管理系统跟做
    技术栈前端技术说明Vue前端框架Vuex全局状态管理框架ElementUI前端UI框架Axios前端HTTP框架vue-element-admin项目脚手架后端技术说明SpringBoot容器+MVC框架MyBatisORM框架MyBatis-plusMyBatis增强工具Redis非关系型数据库Swagger接口文档框架Jwt登录校验令牌根据数据库......
  • 【期末项目】适合大学生的springboot+vue3完成中国铁路12306网站的业务实现【原创】
        ......
  • vue中ref的作用?
    在Vue中,ref是一个用于引用DOM元素的属性,它主要用于以下作用:1.引用DOM元素在Vue组件的模板中,你可以使用ref属性给DOM元素或组件实例添加引用标识。当你使用ref时,Vue会在组件渲染完成后,将DOM元素的引用赋值给组件实例的$refs对象中对应的属性。例如:<template><divref=......