Vue全家桶:vue2+vue3全部搞懂:第五篇,Vue的watch监视器

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,不然不好懂

这一专栏知识将一次性将vue、vue2、vue3全部讲明白

一、何为watch监视器

其实我个人理解,就跟原本的表单的input事件一样,实时监视事件发生并同步更新数据,input事件不就是只用输入框输入一个东西,不管摁没摁回车键,后台都会监视触发事件。

那么watch监视器就是这么个玩意,比如实时翻译器就需要监视输入的内容,同时在输入时进行翻译

watch跟data、methods、computed一样,都是同级别的配置项,写法也一样;然后里面你要监视哪个data的元素,你就以这个data的元素设置一个【同名】的函数,这里注意两点:

1、监视data里的对象的成员,函数名要【对象.成员名】

2、因为“.”是特殊字符,函数名带它,编译器会有波浪线报错,那就用''引号包起来即可

例子1:

<div id="app"><input type="text"  v-model="words">
</div><script>new Vue({el: '#app',data: {words: ''},//设置watch配置项watch:{//有两种形式:1、函数名(参数1,参数2),这样的话会自动获取【这次改变的值】和【上一次的值】,参数1就是【这次改变的值】,参数2反之//           2、函数名(参数),一个参数就是自动获取实时更新的值(上一个写法了解就行,没人用)words(value){console.log('变化了', value)}}})
</script>

例子2:对象也一样,就是'对象.成员'就行

<div id="app"><input type="text"  v-model="obj.word">
</div><script>new Vue({el: '#app',data: {obj:{word: '' }},//设置watch配置项watch:{//有两种形式:1、函数名(参数1,参数2),这样的话会自动获取【这次改变的值】和【上一次的值】,参数1就是【这次改变的值】,参数2反之//           2、函数名(参数),一个参数就是自动获取实时更新的值(上一个写法了解就行,没人用)'obj.word'(value){console.log('变化了', value)}}})
</script>

二、用watch尝试实时翻译项目

很简单,就是在watch配置项里设置axios库就行了

先看简单的例子:

<div id="app"><input type="text" v-model="words"><span>{{ translation }}</span>
</div><!-- 引入axios库 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>new Vue({el: '#app',data: {words: '',translation: ''},watch: {//这里用的是async和await函数方法来获取axios返回的结果async words(value){const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: {words: value //words是这个服务器发送get请求必须带的参数}})console.log(res)console.log(res.data.data)this.translation = res.data.data}//上面的写法是等同于这种传统写法的// axios({//     url: 'https://applet-base-api-t.itheima.net/api/translate',//     params: {//         words: value//     }// }).then(res => {//     console.log(res)// }) }})
</script>

但是这样虽然成功获取了,但是因为watch的实时监视,导致没输入一个字都会获得一个翻译结果

但是我们实际翻译的时候希望的是输入一串字符串后,停了一小会没有再输入了,再进行翻译的

那么就要引入【防抖机制】,这个方法可以应用与【用户双十一疯狂乱点订单请求导致发送N多个请求给服务器,淘宝就爆了】、【滚动条往下滑一点就加载一堆数据】、【翻译敲一个字就翻译一次】这些问题

那么简单的方法就是:加个setTimeout,隔一段时间再执行就好了

<div id="app"><input type="text" v-model="words"><span>{{ translation }}</span>
</div><!-- 引入axios库 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>new Vue({el: '#app',data: {words: '',translation: ''},watch: {words(value){//用setTimeout控制发送请求的时间setTimeout(async ()=>{const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: {words: value}})console.log(res)console.log(res.data.data)this.translation = res.data.data},1000)}}})
</script>                  

但是发现还是输入几个字翻译几次,只不过是输出翻译结果的时间间隔了一会再执行的,那么关键来了,我们只需要每次输入的时候【先】【关闭计时器】!!!然后再开启计时器就行了。那么关闭计时器需要有一个具体的【名字】来代表【是哪个计时器】,那就在data里设置一个变量用来代表计时器,然后清理关闭计时器的时候就是指向这个data的变量就行了,看代码:

<script>new Vue({el: '#app2',data: {words: '',translation: '',//这里设置一个timer变量成员,用来代替setTimeout计时器,相当与它就是那个setTimeout的名字timer: null},watch: {words(value){//那就每次监视输入框输入时,第一步是先把计时器关闭了clearTimeout(this.timer)this.timer = setTimeout(async ()=>{const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: {words: value}})console.log(res)console.log(res.data.data)this.translation = res.data.data},1000)}}})
</script>

我画个图给大伙类捋一捋

每一次输入就会触发watch监视,

那这样一来stTimeout计时器已开启,马上又因为下一次输入而导致执行clrearTimeout()关闭掉它,

那么一直输入的情况下就一直没办法执行setTimeout计时器,直到有一段时间不输入了,达到了setTimeout定的时间,那么就足够它完成里面的内容了;

然后直到下一次输入内容从而触发watch监视器,才会再次执行clrearTimeout()把上一次的计时器给清理掉。

三、watch更屌的功能!深度监视对象值改变

按照上面教的方法我们已经可以实时监视表单事件改变了,但是加入我改变的值是多个地方的呢?

比方说我实时翻译的时候,你既要监视我的输入框<input>输入的内容值改变了,还要监视我选择的语言<select><option></option></select>改变了,按照老方法我要在data里设置两个值代表它两,然后再根据它两各自在watch里写两个对应的函数,太麻烦了,要是5、6、100个地方要怎么办?

那就应该在data里用一个【对象】来封装起来这些值,监视的时候直接监视这个对象,其中一个值数据改变了,就是整个对象数据发生改变,那么怎么监视对象的值呢?要按以前说的'对象.成员名'吗?那还是要写很多个函数

watch完整写法是,当监视一个对象时,在watch里直接写一个【同名】的【对象】,然后有两个配置项:

1、deep:true 这个配置项代表开启【深层监视】

2、immediate:true 这个配置项代表初始化立刻执行一次handler函数

至于这个handle函数,watch监视器里对某个变量成员监视,就是设一个【同名字的函数】;而对对象的监视要执行的函数,就是执行【handler函数】,不能改系统自带的,记住是【handler】不要漏了最后的【r】!!!

例子:

<div id="app2"><!-- 这里v-model=""别忘了换成"对象.成员" --><input type="text" v-model="obj.words"><!-- 这里给select表单元素设置了v-model,只要下拉菜单改变,马上把对应的option的value值传给Vue的data --><select v-model="obj.lang"><option value="italy">意大利</option><option value="eglish">英语</option><option value="german">德语</option></select><span>{{ translation }}</span>
</div><!-- 第一步:引入axios库 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>new Vue({el: '#app2',data: {obj: {words: '',lang: 'eglish'},translation: ''},watch: {obj: {//开启深度监视,整个对象都可以监视了deep: true,handler(value){console.log('对象值改变了', value)}}}})
</script>

那么现在优化一下网络请求,把整个两个参数值都给到axios库的params参数里,直接给他value就行了,value就是对象!然后其他操作就是把上面的操作复制粘贴进去就行了

<!-- 第一步:引入axios库 -->
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script>new Vue({el: '#app2',data: {obj: {words: '初始值就翻译',lang: 'eglish'},translation: '',//这里设置一个timer变量成员,用来代替setTimeout计时器,相当与它就是那个setTimeout的名字timer: null},watch: {obj: {//开启深度监视,可以监视整个对象里面的值改变deep: true,//这个是设置一开始还没有改变表单值、也就是没有触发watch监视时,按照data里的初始值直接先执行一次hangler函数immediate: true,handler(value){//那就每次监视输入框输入时,第一步是先把计时器关闭了clearTimeout(this.timer)this.timer = setTimeout(async ()=>{const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: value//这里value就是data那个对象//其实就等于下面这个麻烦的写法// params: {//     words: value.words,//     lang: value.lang// }})console.log(res.data.data)this.translation = res.data.data},1000)}}}})
</script>

总结:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kswapd0挖矿病毒攻击记录

文章目录 一、起因与病毒分析1、起因2、阿里云告警2.1 恶意脚本代码执行12.2 恶意脚本代码执行22.3恶意脚本代码执行32.4 恶意脚本代码执行4 3、病毒简单分析3.1 病毒的初始化3.2 病毒本体执行 4、总结 二、ubuntu自救指南1、病毒清理2、如何防御 一、起因与病毒分析 1、起因 …

3D城市模型可视化:开启智慧都市探索之旅

随着科技的飞速发展&#xff0c;我们对城市的认知已经不再局限于平面的地图和照片。今天&#xff0c;让我们领略一种全新的城市体验——3D城市模型可视化。这项技术将带领我们走进一个立体、生动的城市世界&#xff0c;感受前所未有的智慧都市魅力。 3D城市模型通过先进的计算机…

Android的硬件接口HAL

我一直觉得&#xff0c;现代计算机不是一门科学&#xff0c;起码快算不上一门理科科学。上上下下全是人造&#xff0c;左左右右全是生意&#xff0c;用管理学&#xff0c;经济学去学计算机&#xff0c;也许更看得懂很多问题。HAL就是一个典型例子。 传统Linux绕开了微软的霸权…

图片的处理库Thumbnailator

摘要&#xff1a;最近遇到图片处理的问题&#xff0c;借助了Thumbnailator库&#xff0c;记录下使用步骤如下…… 图片处理&#xff0c;JDK中也提供了对应的工具类&#xff0c;不过处理较麻烦&#xff0c;Thumbnailator 是Google一个 开源Java 图像处理库&#xff0c;用于简化 …

Oracle临时表应用

1.参考 oracle两种临时表的创建及使用方法_oracle 临时表-CSDN博客 【SQL】全局临时表 GLOBAL TEMPORARY TABLE-CSDN博客 2.语句 CREATE GLOBAL TEMPORARY TABLE tablename (columns) [ ON COMMIT PRESERVE | DELETE ROWS ] 3.应用 CREATE GLOBAL TEMPORARY TABLE "SE…

初始Tomcat(Tomcat的基础介绍)

目录 一、Tomcat的基本介绍 1、Tomcat是什么&#xff1f; 2、Tomcat的配置文件详解 3、Tomcat的构成组件 4、Tomcat的顶层架构 5、Tomcat的核心功能 6、Tomcat的请求过程 一、Tomcat的基本介绍 1、Tomcat是什么&#xff1f; Tomcat 服务器是一个免费的开放源代码的Web …

【数据库管理系统】Mysql 8.0.36入门级安装

下载地址 官方网址&#xff1a;MySQL 注意事项 建议不要安装最新版本&#xff0c;一般找mysql5.0或mysql8.0系列版本即可&#xff1b;mysq1官网有.zip和.msi两种安装形式&#xff1b;zip是压缩包&#xff0c;直接解压缩以后使用的&#xff0c;需要自己配置各种东西&#xff…

【递归搜索回溯专栏】前言与本专栏介绍

本专栏内容为&#xff1a;递归&#xff0c;搜索与回溯算法专栏。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;递归搜索回溯专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

分享6个解决msvcp110.dll丢失的方法,全面解析msvcp110.dll文件

msvcp110.dll 是一个动态链接库 (DLL) 文件&#xff0c;属于 Microsoft Visual C 库的一部分&#xff0c;具体来说是 Microsoft Visual C 2012 版本的运行时组件。这个 DLL 文件包含了在 Windows 环境下运行用 C 编写的程序所必需的一些函数和资源。当一个应用程序是使用 Visua…

视频拉流推流技术梳理

概况 视频的整个流程主要分为推流和拉流 摄像头场景&#xff1a; 摄像头捕捉视频画面&#xff0c;推流到服务器&#xff0c;服务器分发到CDN&#xff0c; 客户端从CDN地址拉流&#xff0c;客户端进行播放 直播场景&#xff1a; 主播通过手机&#xff0c;电脑等客户端&…

G8-ACGAN理论

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、对比分析 前面的文章介绍了CGAN&#xf…

java基础(4)注解,集合,

注解 什么是注解&#xff08;Annotation&#xff09;&#xff1f;注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释” // this is a component: Resource("hello") public class Hello {Injectint n;PostConstructpublic void hello(Param String name…

经典文献阅读之--CamMap(基于SLAM地图对不共视相机进行外参标定)

0. 简介 由于多相机之间通常存在有限或无重叠的视场&#xff0c;因此在估计外参相机参数时面临着一定的挑战&#xff0c;为了解决这个问题&#xff0c;本文提出了CamMap&#xff1a;一种新颖的6自由度外参标定流程。根据三个操作规则&#xff0c;使一个多相机系统单独捕捉一些…

【Linux进程】进程状态(运行阻塞挂起)

目录 前言 1. 进程状态 2. 运行状态 3. 阻塞状态 4. 挂起状态 5. Linux中具体的状态 总结 前言 在Linux操作系统中&#xff0c;进程状态非常重要&#xff0c;它可以帮助我们了解进程在系统中的运行情况&#xff0c;从而更好地管理和优化系统资源&#xff0c;在Linux系统中&am…

【Python笔记-设计模式】迭代器模式

一、说明 迭代器模式是一种行为设计模式&#xff0c;让你能在不暴露集合底层表现形式&#xff08;列表、栈和树等&#xff09;的情况下遍历集合中所有的元素。 (一) 解决问题 遍历聚合对象中的元素&#xff0c;而不需要暴露该对象的内部表示 (二) 使用场景 需要对聚合对象…

SpringBoot实现短链跳转

目录 1.背景介绍 2.短链跳转的意义 3.SpringBoot中的代码实现 1.建议短链-长链的数据库表&#xff1a;t_url_map: 2.映射实体 3.Dao层实现 4.Service层实现 5.Controller层实现 3.结果测试 4.问题 1.背景介绍 短链跳转是一种通过将长链接转换为短链接的方式&…

南方电网的能源棋局上,蔚来换电扮演什么角色?

2 月 26 日&#xff0c;南网储能科技与蔚来能源签署协议&#xff0c;将充换电站、储能站、可调负载等聚合资源连接到虚拟电厂平台&#xff0c;推动换电站作为分布式储能在虚拟电厂项目上的应用。 蔚来换电站是国内首个智慧微电网型分布式换电设施&#xff0c;可透过换电订单预…

软考-系统集成项目管理中级-信息系统建设与设计

本章重点考点 1.信息系统的生命周期 信息系统建设的内容主要包括设备采购、系统集成、软件开发和运维服务等。信息系统的生命周期可以分为四个阶段:立项、开发、运维和消亡。 2.信息系统开发方法 信息系统常用的开发方法有结构化方法、原型法、面向对象方法等 1)结构化方法 …

AI智能分析网关V4:抽烟/打电话/玩手机行为AI算法及场景应用

抽烟、打电话、玩手机是人们在日常生活中常见的行为&#xff0c;但这些行为在某些场合下可能会带来安全风险。因此&#xff0c;对于这些行为的检测技术及应用就变得尤为重要。今天来给大家介绍一下TSINGSEE青犀AI智能分析网关V4抽烟/打电话/玩手机检测算法及其应用场景。 将监控…

java项目打包运行报异常:xxxxx-1.0-SNAPSHOT.jar中没有主清单属性

pom.xml中加入这段话即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.4</version><executions><execution><…