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>

总结:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RuoYi-Vue-Plus功能分析-jackson配置

文章目录 前言一、配置文件二、配置类三、注解四、json工具类1. 工具内容2. 使用工具 前言 前端在给我发送请求的时候一般包含三个部分url&#xff0c;header&#xff0c;body。那么就会涉及我们后端如何接收这些请求参数并且我们处理完毕参数后前端又如何接收参数 通过url传…

【python】json转成成yaml中文编码异常显示成:\u5317\u4EAC\u8DEF123\u53F7

姊妹篇&#xff1a;【python】json转成成yaml json数据 {"name": "张三","age": 30,"isMarried": false,"children": [{"name": "小王","age": 5},{"name": "小李",&qu…

装饰器模式 详解 设计模式

装饰器模式 它允许你在不改变对象结构的情况下&#xff0c;动态地将新功能附加到对象上。 结构&#xff1a; 抽象组件&#xff08;Component&#xff09;&#xff1a;定义了原始对象和装饰器对象的公共接口或抽象类&#xff0c;可以是具体组件类的父类或接口。具体组件&…

算法--动态规划(线性DP、区间DP)

这里写目录标题 tip数组下标从0开始还是从1开始 线性DP数学三角形介绍算法思想例题代码 最长上升子序列介绍算法思想例题代码 最长公共子序列介绍算法思想例题代码 编辑距离介绍例题代码 区间DP问题石子合并介绍算法思想例题代码 tip 数组下标从0开始还是从1开始 如果代码中涉…

Topaz Video AI:一键提升视频品质,智能重塑影像魅力 mac/win版

Topaz Video AI是一款革命性的视频智能处理软件&#xff0c;它利用先进的机器学习和人工智能技术&#xff0c;为视频创作者提供了前所未有的视频增强和修复功能。无论您是专业视频编辑师、摄影师&#xff0c;还是热爱视频创作的爱好者&#xff0c;Topaz Video AI都能帮助您轻松…

返回JSON对象

在目前的Java项目中&#xff0c;我们最经常使用的便是JSON&#xff0c;不是传递JSON对象&#xff0c;就是返回JSON对象&#xff0c;甚至还把多个参数封装成JSON对象来进行传递&#xff0c;以便简化代码等&#xff01; 但是&#xff0c;该如何操作代码才能正确的返回一个或者多…

excel导出标准化

虽然标题叫标准化&#xff0c;只不过是我自己的习惯&#xff0c;当一件事情变得流程标准化之后&#xff0c;开发程序就会飞快&#xff0c;开发评估工作总是 搞个1~2天&#xff0c;实则前端后端一起开发&#xff0c;1个小时就可以搞定。 1 前端 const exportXls async () >…

每日一题——LeetCode1556.千位分隔符

方法一 个人方法&#xff1a; 把n转为字符串&#xff0c;逆序遍历n&#xff0c;把n的每个元素加入res&#xff0c;每三次加入.&#xff0c;最后将res翻转再转为字符串即为符合题目要求的结果 var thousandSeparator function(n) {nlet res[],lenn.length-1for(let ilen;i>…

tomcat 搭建博客 及破解数据库密码

一 tomcat 搭建博客 &#xff08;一&#xff09;博客安装包 1&#xff0c; 把博客war包 放到 webapps 文件夹下 2&#xff0c;会自动解压 3&#xff0c;做个软连接 方便后续操作 可以注意到 因为war包 是又tomcat 自己解压的 所以属主数组还是 tomcat &#xff08…

大模型生成,Open API调用

大模型是怎么生成结果的 通俗原理 其实&#xff0c;它只是根据上文&#xff0c;猜下一个词&#xff08;的概率&#xff09;…… OpenAI 的接口名就叫【completion】&#xff0c;也证明了其只会【生成】的本质。 下面用程序演示【生成下一个字】。你可以自己修改 prompt 试试…

LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

电脑休眠之后唤不醒

现象&#xff1a;午休时间电脑休眠了&#xff0c;醒来之后发现在密码输入界面&#xff0c;但鼠标键盘没反应。按重启键或电源机重新开机&#xff0c;结果开不了机。 原因&#xff1a;1、内存条脏了&#xff0c;导致内存条读取失败 2、休眠的时候硬盘休眠了&#xff0c;导致按…

7、Redis-事务、持久化、内存淘汰机制和过期key处理

目录 一、事务 二、持久化 三、内存淘汰机制 四、过期key处理 一、事务 Redis的事务本质上就是一个批量执行命令的操作。分为三个步骤&#xff1a; 开始事务&#xff1a;multi命令入队&#xff1a;正常输入命令即可执行事务&#xff08;依次执行命令&#xff09;&#xf…

linux_day04

大纲&#xff1a;命令&#xff0c;vim&#xff0c;gcc&#xff0c;编译工具&#xff0c;生成代码&#xff0c;调试&#xff0c;库makefile&#xff0c;系统编程 文件系统&#xff1a;文件属性&#xff0c;文件内容&#xff0c;万物皆文件&#xff08;不在内存中的是文件&#…

为什么说?上位机开发有广泛的前景

上位机开发展现了广泛的前景&#xff0c;主要有以下几个方面的原因&#xff1a; 广泛应用的C#语言&#xff1a; C#在软件开发领域得到了广泛应用&#xff0c;拥有丰富的库、工具和社区支持&#xff0c;使得学习和使用C#进行上位机开发更加便捷。与Windows密切相关&#xff1a; …

LeetCode -- 79.单词搜索

1. 问题描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水…

用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告

本篇文章将介绍如何使用开源的测试报告生成框架 Allure 生成规范、格式统一、美观的测试报告。 通过这篇文章的介绍&#xff0c;你将能够&#xff1a; 将 Allure 与 Pytest 测试框架相结合&#xff1b;如何定制化测试报告内容执行测试之后&#xff0c;生成 Allure 格式的测试报…

10.广域网技术

1. PPP实验点这里&#xff08;拓扑代码&#xff09; 2. PPPoE配置实验点这里&#xff08;拓扑代码&#xff09; 目录 一、广域网二、PPP协议三、PPP链路建立过程1-LCP&#xff08;链路协商&#xff09;四、PPP链路建立过程2-PAP/CHAP&#xff08;认证协商&#xff0c;可选&…

微服务间通信重构与服务治理笔记

父工程 依赖版本管理,但实际不引入依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

详解字符串函数<string.h>(上)

1. strlen函数的使用和模拟实现 size_t strlen(const char* str); 1.1 函数功能以及用法 字符串长度 strlen函数的功能是计算字符串的长度。在使用时&#xff0c;要求用户传入需要计算长度的字符串的起始位置&#xff0c;并返回字符串的长度。 #include <stdio.h> #…