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://xiahunao.cn/news/2822225.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

gcd+线性dp,[蓝桥杯 2018 国 B] 矩阵求和

一、题目 1、题目描述 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 &#xfffd;n 行 &#xfffd;n 列&#xff0c;行和列的编号都从 11 算起。 其中第 &#xfffd;i 行第 &#xfffd;j 个元素…

逆序字符串

逆序字符串 题目描述&#xff1a;解法思路&#xff1a;解法代码&#xff1a;运行结果&#xff1a; 题目描述&#xff1a; 输入⼀个字符串&#xff0c;写⼀个函数将⼀个字符串的内容逆序过来。 测试1&#xff1a; 输⼊&#xff1a;abcdef 输出&#xff1a;fedcba 测试2&#x…

《剑指 Offer》专项突破版 - 面试题 62 : 详解前缀树以及实现(C++)

目录 一、前缀树的基础知识 二、实现前缀树 一、前缀树的基础知识 前缀树&#xff0c;又称为字典树&#xff0c;它用一个树状的数据结构存储一个字典中的所有单词。如果一个字典中包含单词 "can"、"cat"、"come"、"do"、"i&qu…

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数&#xff0c;比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类&#xff1a; 离散型随机变量&#xff1a;随机变量的取值为有限个。连续型随机变量&#xff1a;随机变量的取值是连…

物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)

&#x1f60e;&#x1f60e;&#x1f60e;物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 13、Focus模块 13.1 基本流程 原始输入图像的格式为&#xff1a;tensor: float32[1,3,64…

南京观海微电子---如何区分LED显示屏与LED背光源?

LED屏绝对不是常见的LED背光源&#xff0c;LED显示屏也被称为电子显示屏或浮动字。由LED点阵和LEDPC面板&#xff0c;通过红&#xff0c;蓝&#xff0c;白&#xff0c;绿LED的亮灭来显示文字&#xff0c;图像&#xff0c;动画&#xff0c;视频&#xff0c;内容。可根据不同的场…

C++ //练习 10.5 在本节对名册(roster)调用equal的例子中,如果两个名册中保存的都是C风格字符串而不是string,会发生什么?

C Primer&#xff08;第5版&#xff09; 练习 10.5 练习 10.5 在本节对名册(roster)调用equal的例子中&#xff0c;如果两个名册中保存的都是C风格字符串而不是string&#xff0c;会发生什么&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具…

CSP-201912-2-回收站选址

CSP-201912-2-回收站选址 【50分思路-暴力枚举】 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct trashPoint {int x; int y; }; vector<trashPoint>trashList; vector<int>grade(5); int main…

xxl-job异步任务日志打印到调度器任务管理日志

文章目录 1. xxl-job-core模块添加过滤器2. 执行器logback.xml添加过滤器配置3. 测试 1. xxl-job-core模块添加过滤器 package com.xxl.job.core.config;import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ThrowableProxy; import ch.qos.…

Netty之ChannelHandlerMask详解

Netty的ChannelHandlerMask是用于标记ChannelHandler的位掩码。它被用于指示ChannelHandler的事件处理方式。ChannelHandlerMask 定义了ChannelHandler所有事件。 final class ChannelHandlerMask {static final int MASK_EXCEPTION_CAUGHT 1;static final int MASK_CHANNEL_…

SpringBoot多数据源最佳实践

为什么需要spring boot多数据源 最常见的场景就是单体架构系统需要跨库进行业务增删改查,例如一个购车系统可能需要查询用户信息,然后在进行购买汽车的逻辑。而用户表和汽车表可能不在一个数据库中。 如下图所示,可能一个购买汽车的下单流程为: 用户提交请求。 基于id到数…

【InternLM 实战营笔记】浦语·灵笔的图文理解及创作部署、 Lagent 工具调用 Demo

浦语灵笔的图文理解及创作部署 浦语灵笔是基于书生浦语大语言模型研发的视觉-语言大模型&#xff0c;提供出色的图文理解和创作能力&#xff0c;结合了视觉和语言的先进技术&#xff0c;能够实现图像到文本、文本到图像的双向转换。使用浦语灵笔大模型可以轻松的创作一篇图文推…

mybatis原理图,我拿到了梦寐以求的字节跳动和腾讯双offer

Kafka 如何做到支持百万级 TPS &#xff1f; 先用一张思维导图直接告诉你答案&#xff1a; 顺序读写磁盘 生产者写入数据和消费者读取数据都是顺序读写的&#xff0c;先来一张图直观感受一下顺序读写和随机读写的速度&#xff1a; 从图中可以看出传统硬盘或者SSD的顺序读写甚…

MySQL 多表查询 连接查询 外连接

介绍 MySQL 多表查询 连接查询 内连接 外连接分为两种&#xff0c;左外和右外连接&#xff0c; 左外&#xff1a;相当于查询表1(左表)的所有数据 包含 表1和表2交集部分的数据,完全包含左表的数据 右外&#xff1a;相当于查询表2(右表)的所有数据 包含 表1和表2交集部分的数据…

攻防世界例题wp

1.看到_wakeup()函数第一反应要么触发&#xff0c;要么绕过在这里绕过 2.构造payload实例化一个对象后反序列化 3构造脚本如下&#xff1a; 4.因为它是一个绕过的方法所以我们要使用绕过的方法。 5.继续构造payload将上图的1换成2进行绕过 最终的payload为 O:4:"xctf…

消息队列+更新DB极易引发的DB并发修改bug

背景 我们在生产系统中和其他系统进行交互时一般都会通过消息队列来解耦生产者和消费者&#xff0c;然后通过每个使用方消费消息队列的消息的方式来完成消息的消费&#xff0c;并且一般来说我们消费消息后极有可能会操作DB&#xff0c;不过这种方式如果处理不够仔细&#xff0…

[攻防世界]-Web:fileclude解析

查看网页 代码审计&#xff1a; file_get_contents($file2)&#xff1a;读取文件内容并将内容返回 解法一payload&#xff1a; ?file1php://filter/readconvert.base64-encode/resourceflag.php&file2data://text/plain,hello%20ctf 解法二payload&#xff1a;

AI新工具(20240229) Ideogram 1.0先进的文本转图像模型发布;search2ai让 LLM API 支持联网搜索

1: LTX Studio LTX Studio开放测试&#xff0c;用户可以通过输入文本来生成超过25秒的微电影视频 LTX Studio是由著名AI平台Lightricks推出的生成式AI电影制作平台。用户可以通过输入文本来生成超过25秒的微电影视频&#xff0c;并且可以对视频的镜头切换、角色、场景一致性、…

C++的晨曦之旅:开启编程的新篇章

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、 命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0…

继电保护测试仪

武汉凯迪正大继电保护测试仪主要特点 1&#xff0e;满足现场试验要求。本仪器具有标准的四相电压&#xff0c;三相电流输出&#xff0c;既可对传统的各种继电器及保护装置进行试验&#xff0c;也可对现代各种微机保护进行各种试验&#xff0c;特别是对变压器差功保护和备自投装…