Vue : 监视属性

目录

一个案例

监听属性

handler

immediate 

vm.$watch('xxx')

 深度监视

监视的简写

computed和watch之间的区别


一个案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="../js/vue.js"></script><title>Document</title><style>.classdiv {border: 1px solid green;margin: 5px;}</style>
</head>
<body><div id="app"><div class="classdiv"><p>{{count}}</p><p>{{user.name}}</p><input type="button" value="增加count" @click="addCount"><input type="button" value="修改user.name" @click="updateName"></div></div>
</body>
<script>var vue = new Vue({el: '#app',data: {count : 1,user : {id : 1,name : '博子妹妹'}},methods: {addCount() {this.count ++;},updateName () {this.user.name = '张三';}},// 定义监听器watch : {count :{handler(newValue, oldValue) {console.log(newValue, oldValue);}},'user.name' : function(newVal,oldVal) {console.log(newVal,oldVal);}}});
</script>
</html>

        点击 '增加count', 上面的数字一次一次的在增加至9, 后台:

 

监听属性

        想要监听上述的count的值的修改, 就要在vm中加入监听属性:

        var vue = new Vue({el: '#app',data: {count : 1,user : {id : 1,name : '博子妹妹'}},methods: {addCount() {this.count ++;},updateName () {this.user.name = '张三';}},// 定义监听器watch : {count :{handler(newValue, oldValue) {console.log(newValue, oldValue);}},'user.name' : function(newVal,oldVal) {console.log(newVal,oldVal);}}});

        下面的watch 即为Vue的监听器, 监听器里面的内容是一个一个对象, 对象的名字就是我们要监视的data中的对象.

handler

        监听器中的一个方法, 为handler, 这个是用来处理件监听的事件, newValue为新的值, oldValue为旧的值, 监听器会获取被修改的状态, 然后将新旧值赋值给newValue和oldValue.

        监听前置条件, 监听的属性被修改了, 就会执行handler.

        是否可以监听到计算属性?

        计算属性同样可以被监听, 例如有一个监听属性为info, 那么使用watch监听:

        var vue = new Vue({el: '#app',data: {count : 1,user : {id : 1,name : '博子妹妹'}},computed : {computedCount : {get() {return this.count + 1;}}},methods: {addCount() {this.count ++;},updateName() {this.user.name = '张三';}},// 定义监听器watch : {count :{handler(newValue, oldValue) {console.log('监听了count属性');console.log(newValue, oldValue);}},computedCount : {handler(newValue, oldValue) {console.log('监听了computedCount计算属性');console.log(newValue, oldValue);}},'user.name' : function(newValue,oldValue) {console.log(newVal,oldVal);}}});

 

immediate 

        上述的count, 还是computedCount都是在被修改的时候被监听, 但是可以设置immediate, 然后data中的对象在第一次初始化的时候也被监听.

        使用watch时有一个特点,就是当data中的属性进行第一次绑定时,不会执行监听器,只有值发生改变时才会执行handler监听。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。

                watch : {count :{immediate: true,handler(newValue, oldValue) {console.log('监听了count属性');console.log(newValue, oldValue);}}}

        true表示初始化也要执行监听, false反之

vm.$watch('xxx')

        除了在创建vm实例的时候去定义watch, 还可以在创建vue实例之后去实现一个监听器, 就如标题那样 :

        var vm= new Vue({el: '#app',data: {count : 1,user : {id : 1,name : '博子妹妹'}},computed : {computedCount : {get() {return this.count + 1;}}},methods: {addCount() {this.count ++;},updateName() {this.user.name = '张三';}},// 定义监听器// watch : {//     count :{//         immediate: true,//         handler(newValue, oldValue) {//             console.log('监听了count属性');//             console.log(newValue, oldValue);//         }//     },//     computedCount : {//         handler(newValue, oldValue) {//             console.log('监听了computedCount计算属性');//             console.log(newValue, oldValue);//         }//     },//     'user.name' : function(newValue,oldValue) {//         console.log(newVal,oldVal);//     }// }});vm.$watch('count', {immediate: true,handler(oldValue, newValue) {console.log(newVal, oldVal);}});

        如果你在创建vue实例的时候就知道要监视什么属性, 那么你可以在创建实例的时候定义监视器, 反之如果你不知道要监视什么属性, 那么你就可以在创建实例之后, 去个性的选择自己需要监视的属性.

扩展点


 深度监视

        如果监视的是对象的一个属性, 例如:

        我要监视user中的id, 该如何监视, 最简单的方法, 就是直接监视user, 

    vm.$watch('user', {immediate: true,handler(oldValue, newValue) {console.log(newVal, oldVal);}});
<body><div id="app"><div class="classdiv"><p>我是user的id</p><input type="button" value="修改user.id" @click="updateId"></div></div>
</body>
<script>var vm = new Vue({el: '#app',data: {user: {id: 1,name: '博子妹妹'}},methods: {updateId() {this.user.id++;}}});vm.$watch('user', {immediate: true,handler(oldValue, newValue) {console.log(oldValue, newValue);}});
</script>

点击之后, 发现后台并不会打印oldValue和newValue,

        分析:  因为他监视的是这个user的内存地址, 修改user的id里面的value并不会对其地址造成影响, 只有在替换掉整个user的时候才会触发监视, 例如将data中的user改为:

        user = {id = 2, name = '博子妹妹'}

        解决, 可以写成user.id来监视:

    vm.$watch('user.id', {immediate: true,handler(oldValue, newValue) {console.log(newValue, oldValue);}});

        这就是监视某个属性的某个值.

        但是这种方法只针对于id这一个变量有用, 假设我的user中包含很多个键值对, 例如:

a : 1,

b : 2,

c : 3,

d : 4

        data: {user: {id: 1,name: '博子妹妹',a: 1,b: 2,c: 3,d: 4}}

        假设我要监视这里面的所有数据, 只要这里面的键值对发生了修改, 就需要去监听他, 该如何操作:

        解决: 在监听器中添加deep属性:

    vm.$watch('user', {deep : true,immediate: true,handler(oldValue, newValue) {console.log(newValue, oldValue);}});

深度监视:
(1).Vue中的watch默认不监测对象内部值的改变 (一层)
(2).配置deep:true可以监测对象内部值改变(多层)。
        备注:
(1).Vue自身可以监测对象内部值的改变,但vue提供的watch默认不可以!
(2).使用watch时根据数据的具体结构,决定是否采用深度监视。

监视的简写

        如果监视里面是没有immediate还有deep属性的时候, 就可以使用简写, 简写也就是把对应要监听的属性写成方法的形式, 假设我们要监听data中的count属性:

        watch: {count(newValue, oldValue) {console.log(newValue, oldValue);}}

         如果是创建vue实例之后:

正常写法:

    vm.$watch('count', {deep: true,immediate: true,handler(oldValue, newValue) {console.log(newValue, oldValue);}});

简写:

    vm.$watch('user', function (newValue, oldValue) {console.log(newValue, oldValue);});

computed和watch之间的区别

1.computed能完成的功能,watch都可以完成。
2.watch能完成的功能,computed不一定能完成,例如: watch可以进行异步操作。
        两个重要的小原则:
1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等》,最好写成箭头函数,
这样this的指向才是vm 或 组件实例对象。



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

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

相关文章

RO-NeRF论文笔记

RO-NeRF论文笔记 文章目录 RO-NeRF论文笔记论文概述Abstract1 Introduction2 Related Work3 Method3.1 RGB and depth inpainting network3.2 Background on NeRFs3.3 Confidence-based view selection3.4 Implementation details 4 Experiments4.1 DatasetsReal ObjectsSynthe…

OpenCV 笔记(14):图像的轮廓和轮廓的基础特征

Part11. 图像的轮廓 在该系列第三篇文章中&#xff0c;曾经简单地介绍过轮廓和轮廓发现。 11.1 轮廓的基本概念 图像的轮廓是指图像中具有相同颜色或灰度值的连续点的曲线。轮廓和边缘是有联系的&#xff0c;边缘是轮廓的基础&#xff0c;轮廓是边缘的连续集合。 轮廓和边缘的…

Java进阶(第八期): Java中递归的的使用和递归解决一些算法问题 Java中的异常机制、异常的处理逻辑 自定义异常

文章目录 一、递归1.1 递归的介绍1.2 递归的简单练习1.3 图解递归执行流程&#xff1a;1.4 使用递归完成悲波那契数列1.5 猴子吃桃子问题 二、异常三 、异常的处理逻辑3.1 try catch 捕获异常3.2 throws抛出异常 四、自定义异常 Java进阶&#xff08;第八期&#xff09; 一、递…

java三种注释方式

Java 中的注释有三种&#xff1a; 单行注释&#xff1a;通常用于解释方法内某单行代码的作用。 多行注释&#xff1a;通常用于解释一段代码的作用。 文档注释&#xff1a;通常用于生成 Java 开发文档。

re:Invent 2023技术上新|Amazon DynamoDB与OpenSearch Service的Zero-ETL集成

Amazon DynamoDB 与 Amazon OpenSearch Service 的 Zero-ETL 集成已正式上线&#xff0c;该服务允许您通过自动复制和转换您的 DynamoDB 数据来搜索数据&#xff0c;而无需自定义代码或基础设施。这种 Zero-ETL 集成减少了运营负担和成本&#xff0c;使您能够专注于应用程序。这…

Redis事务悄然而至:命令的背后故事

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis事务悄然而至&#xff1a;命令的背后故事 前言redis事务概述redis事务基础事务中的命令事务的一致性与隔离性事务的异常处理并发环境下的事务结语 前言 在数字化时代&#xff0c;数据处理的要求…

[C#]opencvsharp进行图像拼接普通拼接stitch算法拼接

介绍&#xff1a; opencvsharp进行图像拼一般有2种方式&#xff1a;一种是传统方法将2个图片上下或者左右拼接&#xff0c;还有一个方法就是融合拼接&#xff0c;stitch拼接就是一种非常好的算法。opencv里面已经有stitch拼接算法因此我们很容易进行拼接。 效果&#xff1a; …

Jmeter 性能测试 —— 评估一个系统TPS与并发数!

问题&#xff1a;性能压测&#xff0c;如何评估一个系统的TPS和并发数&#xff1f; 1、对于新系统 由业务部门或开发人员预估交易量和TPS指标 可以参考公式&#xff1a;并发用户 在线用户数 * 10%。 当一个系统还没有上线时&#xff0c;我们可以预判的是这个系统准备要给多…

一篇五分生信临床模型预测文章代码复现——Figure 10.机制及肿瘤免疫浸润(九)——ssGSEA——倒数第三节

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

车牌识别技术,如何用python识别车牌号

目录 一.前言 二.运行环境 三.代码 四.识别效果 五.参考 一.前言 车牌识别技术&#xff08;License Plate Recognition, LPR&#xff09;在交通计算机视觉&#xff08;Computer Vision, CV&#xff09;领域具有非常重要的研究意义。以下是该技术的一些扩展说明&#xff1…

VSCODE 修改Test模式下的的java jvm堆内存大小

在settings.json中添加如下语句 "java.test.config": {"vmArgs": ["-Xmx12G"]},

swing快速入门(三十二)消息对话框

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.自定义对话框前列图标 2.消息对话框的若干种形式 package swing21_30;import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent;public class swing_test_30 {// 定义一个JFrameJFrame jFrame n…

macos下转换.dmg文件为 .iso .cdr文件的简单方法

为了让镜像文件在mac 和windows平台通用, 所以需要将.dmg格式的镜像文件转换为.iso文件, 转换方法也非常简单, 一行命令即可 hdiutil convert /path/to/example.dmg -format UDTO -o /path/to/example.iso 转换完成后的文件名称默认是 example.iso.cdr 这里直接将.cdr后缀删…

自动驾驶学习笔记(二十三)——车辆控制模型

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 运动学模型 动力学模型 总结…

gradle下载太慢不用再烦恼了

编辑gradle-wrapper文件 使用腾讯镜像 https://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip 来代替原来的 https\://services.gradle.org/distributions/gradle-7.5-all.zip

C#调用(python通过excel坐标生成的曲面地形图)案例

效果图: 文件图: 详解一:环境和python库问题 1.python 中只需要下载 matplotlib3.8.2和scipy1.11.4 2.我安装的python版本 详解二:解释器问题 python解释器这里有两种形式 第一种形式 1.调用 pycharm项目下的解释器,需要安装python必须的包(命令安装或者搜索安装)。 2.修改…

对“企业数据资源相关会计处理暂行规定“的个人理解

附&#xff1a;2023年数据资源入表白皮书下载&#xff1a; 关注WX公众号&#xff1a; commindtech77&#xff0c; 获得数据资产相关白皮书下载地址 1. 回复关键字&#xff1a;数据资源入表白皮书 下载 《2023数据资源入表白皮书》 2. 回复关键字&#xff1a;光大银行 下载 光…

Java项目:100SpringBoot图书管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 图书管理系统基于SpringBootMybatis开发&#xff0c;系统分为两种角色&#xff0c;分别是管理员和普通用户。 管理员功能如下&#xff1a; 书籍类别管理…

前端优化 - 防抖和节流

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

驾驭AI助手,开启高效创作之旅:一篇文章,轻松搞定!

在信息爆炸的时代&#xff0c;内容创作已成为个人和企业的核心竞争力。但撰写一篇高质量的文章需要大量时间和精力。现在&#xff0c;有了AI助手&#xff0c;这些烦恼全部消失 首先&#xff0c;我们要进入首助编辑高手主页面&#xff0c;并在上方的板块栏里选择“AI文章创作”…