首页 > 其他分享 >class 4: vue.js 3监听器 watch

class 4: vue.js 3监听器 watch

时间:2024-09-08 19:50:33浏览次数:3  
标签:info vue name watch handler 监听器 监听 函数

  • 某些情况下需要监听某个响应式数据的变化,这时就需要使用监听器(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,
     }
 },

标签:info,vue,name,watch,handler,监听器,监听,函数
From: https://blog.csdn.net/roadtohacker/article/details/141817757

相关文章

  • vue3知识总结
    Vue3是Vue.js的最新版本,相较于Vue2,它在性能、API设计、类型支持等多个方面都有显著的改进和创新。以下是对Vue3知识的总结:一、性能优化响应式系统升级:Vue3使用Proxy替代了Vue2中的Object.defineProperty,实现了对对象变化的更广泛监测,包括对象的添加和删除,......
  • 基于Pinia和Compute的持久化localStorage登录态管理Vuejs 源码教学
    piniaPinia是一个专为Vue3设计的状态管理库,它借鉴了Vuex的一些概念,但更加轻量灵活,使得状态管理变得更加简单直观。Pinia通过提供一种基于Vue3响应式API的状态管理机制,让我们可以更加优雅地管理应用程序的状态。computedVue的computed属性是一种特殊的数据属性,它们根据组......
  • Java毕业设计源码 - ssm框架网上服装销售系统+jsp+vue+数据库mysql+毕业论文等
    文章目录前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求/流程分析3、系统功能结构三、系统实现展示1、用户功能模块2、管理员功能模块四、毕设内容和源代码获取总结逃逸的卡路里博主介绍:✌️码农一枚|毕设布道师,专注于大学生项目实战开发、......
  • 基于Vue框架的影院购票APP的设计与实现
     作为“重灾区”之一,电影行业遭受了几乎停摆式的重创——影院关闭、影片堆积、拍摄停滞、资金紧缩、产业链断裂等问题严重影响中国电影行业的疫后重建。现在疫情方开,通过构建一个影院购票系统包含电影购票、用户评价、影片推荐、影片信息、影院信息、排片信息、座位选择的平......
  • 基于django+vue重点实验室通用官方网站设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着科技创新的不断推进,重点实验室作为科研创新体系的核心组成部分,承载着推动学科发展、培养高层次人才、开展前沿技术研究与转化等重要使......
  • 基于django+vue中医学习系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球化与健康意识日益增强的今天,中医作为中华民族的传统医学瑰宝,其独特的理论体系和治疗方法正逐渐受到国际社会的广泛关注和认可。然而......
  • 基于django+vue中医问诊信息管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和中医诊疗模式的现代化转型,传统中医问诊方式面临着效率与标准化管理的双重挑战。中医问诊作为中医诊疗的核心环节......
  • 基于django+vue中医文化展示管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球化与文化多元化的今天,中医文化作为中华民族宝贵的非物质文化遗产,其独特的理论体系、丰富的诊疗方法以及深厚的文化底蕴,正逐渐受到国......
  • 基于vue.js和node.js的在线购物网站设计和实现----附源码83077
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2 数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析3系统总体设计......
  • 基于django+vue中小型制造型企业erp管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,企业信息化管理已成为提升企业竞争力、优化资源配置、提高运营效率的重要手段。中小型制造型企业作为国民经济的重......