Vue 基础之侦听器

news2024/11/15 13:33:27

Vue 基础之侦听器

  • 描述
  • 侦听器
      • 侦听器的创建
      • 侦听器的应用
  • 选项
      • immediate 选项
      • deep 选项
          • 未使用 deep 选项
          • 使用 deep 选项
          • 侦听目标对象中的单个属性

描述

项目描述
IDEVScode
操作系统Windows 10 专业版
Vue.js2.6.12

侦听器

侦听器允许开发者对数据进行监视,并指定数据发生变化时需要执行的操作。

侦听器的创建

侦听器需要定义在 watch 节点中,侦听器可以定义为一个函数为一个对象。其函数名或对象名需要与被监听数据的名称(该数据在 data 节点中对应的名称)相同。

侦听器的处理函数接受提供两个实参,请使用相同数量的形参对其进行接收。其中,第一个实参为数据变化后的值,第二个参数为数据变化前的值。

如果通过创建对象的方式创建监听器,则处理函数需要定义在 handler 方法名之中。

侦听器的应用

侦听器在实际开发中,常用于 检测用户名是否已经被使用。我将使用一个 users 列表来代替存放用户名的数据库。具体实现代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 基础之侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 被侦听的目标元素 input -->
        <input id="name" type="text" v-model:value="username" placeholder="请输入您的用户名">
    </div>

    <!-- 导入 Vue.js -->
    <script src="../lib/vue-2.6.12.js"></script>
    <script>
        // 创建 ViewModel 对象
        const vm = new Vue({
            el: '#app',
            data: {
                username: '',
                users: ['redheart', 'yjh', 'twomoons']
            },
            watch: {
                username(after, before){
                    // 先将变化后的值转换为小写字符,再通过 includes 方法
                    // 判断该值是否存在于 users 数组之中。
                    if(vm.users.includes(after.toLowerCase())){
                        // 若该用户名已存在于 users 中,我们将更改输入框
                        // 中的文本颜色为红色。
                        document.querySelector('#name').style.color = 'red'
                    }else{
                        // 当输入的文本不存在于 users 中时,我们将更改输入
                        // 框中的文本颜色为黑色。
                        document.querySelector('#name').style.color = 'black'
                    }
                }
            }
        })
    </script>
</body>
</html>

执行效果:

执行效果

选项

Vue 中的侦听器为开发者提供了多个选项来满足各位的特殊需求。

immediate 选项

immediate 选项可以使侦听器在创建后立即执行相关的处理函数,要设置 immediate 选项需要通过对象字面量的形式创建监听器。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 基础之侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 被侦听的目标元素 input -->
        <input id="name" type="text" v-model:value="username" placeholder="请输入您的用户名">
    </div>

    <!-- 导入 Vue.js -->
    <script src="../lib/vue-2.6.12.js"></script>
    <script>
        // 创建 ViewModel 对象
        const vm = new Vue({
            el: '#app',
            data: {
                username: ''
            },
            watch: {
                username: {
                    handler: (after, before) => {
                        alert(before + ' ' + after)
                    },
                    immediate: true
                }
            }
        })
    </script>
</body>
</html>

在执行上述代码后,首次进入页面可能会立即弹出弹窗(在创建侦听器后立即执行处理函数)。

立即执行

deep 选项

当监听的目标数据为一个对象时,对象中的属性的值发生变化并不会触发侦听器。

未使用 deep 选项
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 基础之侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 被侦听的目标元素 input -->
        <input id="name" type="text" v-model:value="info.username" placeholder="请输入您的用户名">
    </div>

    <!-- 导入 Vue.js -->
    <script src="../lib/vue-2.6.12.js"></script>
    <script>
        // 创建 ViewModel 对象
        const vm = new Vue({
            el: '#app',
            data: {
                info: {
                    username: ''
                },
                users: ['redheart', 'yjh', 'twomoons']
            },
            watch: {
                info: {
                    handler: (target) => {
                        // 先将变化后的值转换为小写字符,再通过 includes 方法
                        // 判断该值是否存在于 users 数组之中。
                        if(vm.users.includes(target.username.toLowerCase())){
                            // 若该用户名已存在于 users 中,我们将更改输入框
                            // 中的文本颜色为红色。
                            document.querySelector('#name').style.color = 'red'
                        }else{
                            // 当输入的文本不存在于 users 中时,我们将更改输入
                            // 框中的文本颜色为黑色。
                            document.querySelector('#name').style.color = 'black'
                        }
                    }
                }
            }
        })
    </script>
</body>
</html>

执行结果:

执行结果

注:

  1. 由执行结果可以发现,侦听器无法检测到被侦听对象内属性的变化。
使用 deep 选项

使用 deep 选项后可以侦听到目标对象中属性的变化。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 基础之侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 被侦听的目标元素 input -->
        <input id="name" type="text" v-model:value="info.username" placeholder="请输入您的用户名">
    </div>

    <!-- 导入 Vue.js -->
    <script src="../lib/vue-2.6.12.js"></script>
    <script>
        // 创建 ViewModel 对象
        const vm = new Vue({
            el: '#app',
            data: {
                info: {
                    username: ''
                },
                users: ['redheart', 'yjh', 'twomoons']
            },
            watch: {
                info: {
                    handler: (target) => {
                        // 先将变化后的值转换为小写字符,再通过 includes 方法
                        // 判断该值是否存在于 users 数组之中。
                        if(vm.users.includes(target.username.toLowerCase())){
                            // 若该用户名已存在于 users 中,我们将更改输入框
                            // 中的文本颜色为红色。
                            document.querySelector('#name').style.color = 'red'
                        }else{
                            // 当输入的文本不存在于 users 中时,我们将更改输入
                            // 框中的文本颜色为黑色。
                            document.querySelector('#name').style.color = 'black'
                        }
                    },
                    deep: true
                }
            }
        })
    </script>
</body>
</html>

正常执行

注:

  1. 请注意,在该示例中,我仅使用了一个参数。这是因为侦听目标为对象,参数接收到的数据并不为数据变化前后的数据值,参数将接收到的是一个对象。在本示例中,参数接收到的内容为:
    接收内容
  2. 由于实参为一个对象,所以我们将 username 转换为小写字符需要使用 target.username.toLowerCase() 而不是 target.toLowerCase(),否则你将收到如下错误信息:

错误信息3. 利用 deep 选项,我们可以使得多个数据共同使用同一个侦听器(使用 deep 选项后,监听的目标对象中的属性值发生变化都将触发侦听器)。

  1. 使用多个形参接收实参,得到的实参均为一个相同的对象。
侦听目标对象中的单个属性

即使不适用 deep 选项,我们同样也可以侦听对象中的属性的值的变化,只不过不能使得目标对象中的多个属性触发监听器,仅目标对象中的目标属性可以触发侦听器。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue 基础之侦听器</title>
</head>
<body>
    <div id="app">
        <!-- 被侦听的目标元素 input -->
        <input id="name" type="text" v-model:value="info.username" placeholder="请输入您的用户名">
    </div>

    <!-- 导入 Vue.js -->
    <script src="../lib/vue-2.6.12.js"></script>
    <script>
        // 创建 ViewModel 对象
        const vm = new Vue({
            el: '#app',
            data: {
                info: {
                    username: ''
                },
                users: ['redheart', 'yjh', 'twomoons']
            },
            watch: {
                // 需要使用引号对表达式进行包裹
                'info.username': {
                    handler: (after, before) => {
                        // 先将变化后的值转换为小写字符,再通过 includes 方法
                        // 判断该值是否存在于 users 数组之中。
                        if(vm.users.includes(after.toLowerCase())){
                            // 若该用户名已存在于 users 中,我们将更改输入框
                            // 中的文本颜色为红色。
                            document.querySelector('#name').style.color = 'red'
                        }else{
                            // 当输入的文本不存在于 users 中时,我们将更改输入
                            // 框中的文本颜色为黑色。
                            document.querySelector('#name').style.color = 'black'
                        }
                    }
                }
            }
        })
    </script>
</body>
</html>

注:
使用该方法时,需要在使用引号包裹表达式:
需要使用引号对表达式进行包裹

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

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

相关文章

数据分析-深度学习 Pytorch Day4

一&#xff1a;概述当你想训练好一个神经网络时&#xff0c;你需要做好三件事情&#xff1a;一个合适的网络结构&#xff0c;一个合适的训练算法&#xff0c;一个合适的训练技巧&#xff1a;合适的网络结构&#xff1a;包括网络结构和激活函数&#xff0c;你可以选择更深的卷积…

打工人必学的法律知识(四)——《中华人民共和国劳动法》

中华人民共和国劳动法http://www.npc.gov.cn/npc/c30834/201901/ffad2d4ae4da4585a041abf66e74753c.shtml 目录 第一章 总  则 第二章 促进就业 第三章 劳动合同和集体合同 第四章 工作时间和休息休假 第五章 工  资 第六章 劳动安全卫生 第七章 女职工和未…

大数据技术之Hadoop(HDFS)——超详细

第1章 HDFS概述 1.1 HDFS产出背景及定义 1&#xff09;HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文…

误删照片音视频文件不要担心 几种方法解救慌乱的你 别再病急乱投医啦 [附软件]

误删照片音视频文件不要担心 几种方法解救慌乱的你 方法1&#xff1a;从手机相册中恢复手机删除的照片 这里以vivo手机为例,其他手机也是差不多的 相册->右上角三个点->设置->云空间 进入云存储空间 点击云盘->我的备份->就能看到你自动上传的照片 相册-&…

【Linux】共享内存

目录 一、共享内存 1.1 申请共享内存块 1.2 释放共享内存块 1.3 挂接共享内存 二、共享内存的使用 2.1 Server端与Client端 2.2 挂接与运行 三、共享内存总结 3.1 共享内存的特点 3.2 共享内存实现访问控制 一、共享内存 共享内存是最快的IPC形式。一旦这样的内存映…

xxl-job原理(版本2.3.1)

一、xxl-job架构图 1、调度中心 ​ 负责管理调度信息&#xff0c;按照调度配置发出调度请求&#xff0c;自身不承担业务代码。调度系统与任务解耦&#xff0c;提高了系统可用性和稳定性&#xff0c;同时调度系统性能不再受限于任务模块。 2、执行器 负责接收调度请求并执行任…

CSS注入 2.0

看过CSS注入1.0的朋友&#xff0c;不相信对CSS注入有了一个概念性的理解&#xff0c;在上一篇文章中我只是简单复现了一下波兰老哥的CSS注入过程&#xff0c;阐述了其大致原理。对于其中很大一部分技术细节&#xff0c;代码细节并未做深入的理解(当时我也看不懂&#xff0c;哈哈…

什么是分布式事务

上一篇文章已经讲完分布式了&#xff0c;那暖男说要讲分布式事务那就一定会讲&#xff0c;只是我估计大家没料到暖男这么快就肝好了吧&#xff1f; 事务想必大家并不陌生&#xff0c;至于什么是 ACID&#xff0c;也是老生常谈了。不过暖男为了保证文章的完整性确保所有人都听得…

uniapp-微信小程序分包操作步骤详解

1、在原来的pages的同级下新建一个目录&#xff1a;package1 &#xff08;名字自己随便起。想分几个包就建几个新目录。比如package2、package3……&#xff09; 结构是并列的&#xff1a; 2、把想要放进分包里去的模块都剪切在新目录里面去。 &#xff08;就是以前全都放在…

移动端 - 搜索组件(suggest篇)

这一篇博客是和 search-input篇 衔接的, 需要的可以看上文 移动端 - 搜索组件(search-list篇) 这里我们需要去封装这么一个组件 先说一下大致的方向: 1. 根据父组件传入的关键字数据发送请求获取后端数据, 进行模板渲染 2. 处理一些边界情况(后端返回数据为空, 初次加载数据…

《小猫猫大课堂》三轮3——字符函数和字符串函数及其模拟实现

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重…

C语言——自定义类型详解(结构体,联合体,枚举,位段)

专栏&#xff1a;C语言 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些C语言的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 结构体前言一、结构体1.结构体类型的声明2.结构体…

黑马学ElasticSearch(十)

目录&#xff1a; &#xff08;1&#xff09;自动补全-安装品分词器 &#xff08;2&#xff09;自动补全-自定义分词器 &#xff08;3&#xff09;自动补全-DSL实现自动补全查询 &#xff08;4&#xff09; 自动补全-修改酒店索引库结构 &#xff08;5&#xff09;自动补全…

测试开发——用例篇(如何设计一个测试用例,设计测试用例的一些具体方法)

目录 一、测试用例的基本要素 二、设计测试用例的万能公式 (在没有需求文档的情况下&#xff09; 1、水杯的测试用例 2、一个网站的登录测试用例 三、基于需求进行测试用例的设计 四、测试用例的具体设计方法 1、等价类 2、边界问题 3、判定表&#xff08;因果图&#…

协程和线程的区别、协程原理与优缺点分析、在Java中使用协程

文章目录什么是协程协程的优点与缺点协程实现原理.协程与线程在不同编程语言的实现在Java中使用协程Kilim介绍Kilim整合Java,使用举例小总结什么是协程 相对于协程&#xff0c;你可能对进程和线程更为熟悉。进程一般代表一个应用服务&#xff0c;在一个应用服务中可以创建多个…

源码看CAF的线程调度框架

序 本篇文章带着大家来看下CAF&#xff08;C Actor Framwwork&#xff09;的调度框架&#xff0c;也是算现阶段C比较成熟的调度框架&#xff0c;大家如果自己完成一个比较大型的项目&#xff0c;任务调度也可以参照CAF。 鉴于篇幅较长&#xff0c;大家如果学习使用如何使用CAF…

修改jupyter notebook默认路径

修改jupyter notebook默认路径jupyter notebook默认打开C:\Users\你的用户名&#xff0c;用户名是你的电脑用户名&#xff0c;upload文件又会在C盘生成一堆文件&#xff0c;很乱&#xff0c;用notebook打开文件还要跳转到目录&#xff0c;很麻烦&#xff0c;那有没有办法呢&…

【PYTHON】如何配置集成开发环境Geany

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【笔记】大话设计模式17-20

【笔记】大话设计模式17-20 文章目录【笔记】大话设计模式17-2017 适配器模式17.1 Example17.2 定义17.3 Show me the code17.4 总结18 备忘录模式18.1 Example18.2 定义18.3 Show me the code18.4 总结19 组合模式19.1 Example19.2 定义19.3 Show me the code19.4 总结20 迭代…

基于python的人工智能数据处理常用算法

文章目录二分法求解最小二乘法曲线拟合最小二乘法的来历最小二乘法与曲线拟合多项式曲线拟合SciPy内置最小二乘法应用泰勒级数背景引入泰勒公式泰勒级数展开与多项式近似二分法求解 机器学习过程中往往会用到很多变量&#xff0c;而这些变量之间的复杂关系一般用非线性方程来&…