class 4: vue.js 3监听器 watch

news2024/11/15 15:30:26
  • 某些情况下需要监听某个响应式数据的变化,这时就需要使用监听器(watch)来实现了

watch的使用语法如下

  • 选项:watch
  • 类型:{ [key: string]: string | Function | Object | Array}
  • 详解:watch属性是一个对象,该对象的键(key)是需要观察的表达式, 值(value)可以是回调函数、方法名等。Vue.js 3实例会在实例化时调用$watch来遍历watch对象的每个属性

下面通过一个案例来演示watch的基本使用

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
    <div id="app"></div>
    <template id="my-app">
        请输入问题:<input type="text" v-model="question">
        <div> {{ answer }}</div>
    </template>
    <script src="./js/vue.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    question: '',
                    answer: '',
                }
            },
            watch: {
                question: function (newValue, oldValue) {
                    console.log(`新value值: ${newValue}, 旧value值: ${oldValue}`)
                    this.questionAnswer()
                }
            },
            methods: {
                questionAnswer() {
                    this.answer = `你的问题是${this.question}? 答案: ahahahaha`
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>
</body>
</html>
  • 上面使用的是watch的function语法,下面展示了一个对象语法的使用
watch: {
    question: {
        handler(newValue, oldValue) {
            console.log(`新value值: ${newValue}, 旧value值: ${oldValue}`)
            this.queryAnswer()
        }
    }
},
  • watch对象语法的常见配置选项有以下几种
  1. handler:要监听的回调函数,当监听属性发生变化时会调用该函数
  2. deep:是否深度监听对象或数组中每个属性的变化,默认是false
  3. immediate:是否立即执行回调函数,默认值是false

handler选项

  • 这是Vue.js 3中监听属性变化时的回调函数。当属性发生变化时,该函数会被调用
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app"></div>
    <template id="my-app">
        <h2>{{ info.name }}</h2>
        <h2>{{ info.book.name }}</h2>
        <button @click="changeInfo">改变info</button>
        <button @click="changeInfoName">改变infoName</button>
        <button @click="changeInfoBookName">改变infoBookName</button>
    </template>
    <script src="./js/vue.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    info: {
                        name: "clarence",
                        age: 18,
                        book: {
                            name: "harry potter"
                        }
                    }
                }
            },
            watch: {
                info: {
                    handler(newInfo, oldInfo) {
                        console.log(`newValue: ${newInfo}, oldValue: ${oldInfo}`)
                    }
                }
            },
            methods: {
                changeInfo() {
                    this.info = {
                        name: "liu",
                        age: 100,
                        book: {
                            name: "One hundred years of loneliness"
                        }
                    }
                },
                changeInfoName() {
                    this.info.name = "rose"
                },
                changeInfoBookName() {
                    this.info.book.name = "Vue"
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>
</body>
</html>
  • 效果如下图,点击"改变info"之后,发现watch函数打印出结果,这说明调用到了watch函数,而当点击"改变infoName"和改变"infoBookName"按钮之后并没有调用到watch函数
    在这里插入图片描述
  • 这是因为默认情况下watch函数仅监听对info对象引用的变化,而不会监听其内部属性的变化,如果需要监听内部属性的变化,需要使用deep进行深度监听

deep

  • deep选项用于配置是否深度监听对象中属性的变化,修改watch函数如下
 watch: {
     info: {
         handler(newInfo, oldInfo) {
             console.log(`newValue: ${newInfo}, oldValue: ${oldInfo}`)
         },
         // 深度监听info对象的更新, info内部属性的改变均可被监听到
         deep: true
     }
 },

immediate

  • immediate选项可以让handler中定义的函数立即执行一次,默认情况下,该函数只在监听的数据发生变化时才会回调,像下面这样
 watch: {
     info: {
         handler(newInfo, oldInfo) {
             console.log(`newValue: ${newInfo}, oldValue: ${oldInfo}`)
         },
         // 深度监听info对象的更新, info内部属性的改变均可被监听到
         deep: true,
         // handler中定义的函数立即执行一次
         immediate: true,
     }
 },
  • 可以实现的效果是每次刷新页面都会立即执行一次handler中定义的函数

此外,watch还可以只监听对象中的某个属性,比如上面的例子中,我只希望监听info中的name属性,那么watch可以这样写

 watch: {
     "info.name": {
         handler(newInfo, oldInfo) {
             console.log(`newValue: ${newInfo}, oldValue: ${oldInfo}`)
         },
         // 深度监听info对象的更新, info内部属性的改变均可被监听到
         deep: true,
         // handler中定义的函数立即执行一次
         immediate: true,
     }
 },

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

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

相关文章

Unity (编辑器)数据持久化 之 ScriptableObject初识与创建

1.什么是ScriptableObject ScriptableObject - Unity 手册 如题&#xff0c;一个可以在Unity编辑器中方便编辑数据的工具 一个脚本继承该类&#xff0c;并且序列化或者有公共变量&#xff0c;即可在Inspector窗口看到它们 其特点&#xff1a; Q:是否可以将 ScriptableObject…

Nodejs的详细安装过程与步骤

目录 一、下载node.js 二、安装程序 三、检查是否安装成功 四、新建文件夹 五、配置环境变量 一、下载node.js 下载地址&#xff1a;Node.js — Run JavaScript Everywhere 选择想要下载的版本&#xff0c;点击Download Node.js 二、安装程序 &#xff08;1&#xff0…

食家巷桃酥,一口酥脆,满是幸福

在美食的世界里&#xff0c;总有一些味道能瞬间勾起我们的回忆&#xff0c;食家巷桃酥便是其中之一。初见食家巷桃酥&#xff0c;那金黄的色泽便让人眼前一亮。每一块桃酥都像是一件小小的艺术品&#xff0c;边缘微微隆起&#xff0c;中间微微凹陷&#xff0c;散发着诱人的香气…

文产数字化,古迹存久远——福永街道凤凰古村RV数字全景在线游览平台上线

深圳宝安区宣传文化体育发展专项资金资助、福永街道党建服务中心指导的“凤凰古村文物抢救性挖掘与传承现实虚拟&#xff08;RV&#xff09;数字化工程”项目自从2024年6月份正式启动以来&#xff0c;经紧锣密鼓地调研、采集和制作&#xff0c;目前&#xff0c;该项目已正式完工…

【HarmonyOS 4.0】应用级变量的状态管理

组件级变量的状态管理装饰器仅能在页面内&#xff0c;即一个组件树上共享状态变量。 如果开发者要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级变量的状态管理。 1. LocalStorage&#xff08;LocalStorageProp/LocalStorageLink&#xff0…

软考有哪些科目一年考两次?

软考高级【系统分析师】及【系统架构设计师】是一年考两次的。 软考中级【软件设计师】和【网络工程师】也是一年考两次的。 其他科目一年都只开考一次&#xff0c;或者上半年开考&#xff0c;或者下半年开考&#xff0c;具体考试时间可看下图。 软考考题类型/数量/考试方式&…

西安运营服务体系完善的产业园在哪里?

在西安这片充满历史底蕴与创新活力的土地上&#xff0c;有一处运营服务体系完善的产业园正熠熠生辉&#xff0c;成为众多企业追逐梦想、实现发展的理想之地。 这个产业园坐落在 [西安市长安区东长安街481号]的西安国际数字影像产业园&#xff0c;园区正以其卓越的运营服务体系吸…

为什么音视频SDK成为线上招投标不可或缺的技术支持?

随着信息技术的飞速发展和数字化转型的深入&#xff0c;线上招投标已成为现代商业活动中不可或缺的部分。这一过程不仅提高了招投标的效率&#xff0c;还增强了透明度和公平性。在这个过程中&#xff0c;音视频SDK&#xff08;软件开发工具包&#xff09;作为关键技术之一&…

nvm管理node版本解决node版本冲突问题

nvm管理node版本解决node版本冲突等乱七八糟的问题 说明一、node环境检查二、安装nvm三、node安装说明 本文主要内容为nvm的安装,包括node环境的检查,nvm下载安装以及不同版本的node安装 更新时间:2024/09/01 16:39 本文仅为记录学习轨迹,如有侵权,联系删除 一、node环…

webros机器人控制软件

一、可显示轨迹。 二、可显示机器人状态&#xff0c;如速度、位置等。 三、可以对机器人进行多点导航设置并下发导航点。 技术栈&#xff1a;rosbrige_server ,vue3,ros1,robotwebtool

美畅物联丨智能安防新趋势:IPC规格参数详解与选型建议

在畅联AIoT开放云平台的应用生态中&#xff0c;"端-边-网-云-用"这一核心理念始终是我们构建视频及AIoT底座平台的基石。其中&#xff0c;网络摄像机&#xff08;IPC&#xff0c;即Internet Protocol Camera&#xff09;&#xff0c;作为端侧设备的核心成员&#xff…

2024-09-02 Ubuntu固定USB串口名(包括1拖N的USB串口)

在运行Ubuntu系统的开发板上,如果使用可插拔的USB串口,有时候程序正在运行时,如果突然连接传感器的USB串口设备被插拔了一下,这时,会发现系统中的USB串口名发生了改变。例如,插拔之前是/dev/ttyUSB0,插拔之后变成了/dev/ttyUSB3。发生这种情况的时候,有时候会导致程序无…

Harbor部署docker私人仓库

1、新建虚拟机rhel9 2、配置网络 #修改内核参数使网卡名称为ethxxx grubby --update-kernel ALL --args net.ifnames0reboot #配置网络 vim /etc/NetworkManager/system-connections/eth0.connection 内容为&#xff1a;[connection] ideth0 typeethernet interface-nameeth0…

Git创建项目

方法一 1.在gitee中新建仓库demo01&#xff0c;并勾选开源许可证&#xff0c;完成后gitee上面的项目demo01里只包含一个LICENSE文件 2.直接在本地电脑中新建项目文件夹demo01&#xff0c;双击进入这个文件夹&#xff0c;右键Git bash here&#xff0c;输入 git clone https:…

git commit添加emoji表情

先看样板&#xff1a; 完整表情见&#xff1a;gitmoji | An emoji guide for your commit messages 中文解释见&#xff1a;https://github.com/liuchengxu/git-commit-emoji-cn 示例&#xff1a; git commit -m :wrench: 修改supervisor配置 git commit -m :zap: 使用C扩展…

24.9.1(康托展开)

上星期三: 补 24牛客多校 二 C 牛客传送门 思路: 赛时写模拟写的很臭,如果用dp写就很方便 代码如下: const int N2e610; const int mod1e97; ll n; char s[N][2]; int dp[N][2]; void solve(){cin >> n;for(int i1;…

别再被假WiFi坑!正规品牌教你如何慧眼识珠!随身wifi哪些才是正规品牌?全网最靠谱的随身wifi推荐!

如今的随身 WiFi 市场&#xff0c;可谓是热闹非凡。各种品牌如雨后春笋般涌现&#xff0c;让人眼花缭乱。然而&#xff0c;当流量告急时&#xff0c;我们也不能病急乱投医&#xff0c;随便购买随身 WiFi。毕竟&#xff0c;市场上的随身 WiFi 品牌五花八门&#xff0c;质量参差不…

活动系统开发之采用设计模式与非设计模式的区别-需求设计及拓展

通过活动系统流程图拆分成5个业务流程图 1、签到与滚动抽奖业务流程图 2、签到与答题领取奖品业务流程图 3、签到与抽奖业务流程图 4、答题与组团业务流程图 5、答题与美图分享业务流程图 6、总结 因业务流程相互嵌套&#xff0c;所以将每个系统模板化后可以动态组合目前的子业…

【卷起来】VUE3.0教程-02-模板语法

&#x1f341; 项目目录结构 在上面的案例中&#xff0c;我们创建出了一个vue项目&#xff0c;项目结构如下&#xff1a; .vscode&#xff1a;vscode工具的配置文件node_modules&#xff1a;Vue 项目的运行依赖文件public&#xff1a;资源文件夹&#xff08;浏览器图标&#x…

Leetcode Day18 堆

Python中关于堆的操作 注意, python默认的是最小堆 什么时候想到用堆 A: 流!或者我们只关心k个元素 373 查找和最小的前k对数字 给定两个以 非递减顺序排列 的整数数组 nums1 和 nums2 , 以及一个整数 k 。 定义一对值 (u,v)&#xff0c;其中第一个元素来自 nums1&#xff…