vue项目中的数据变化被watch监听并处理
作者:看门猫 发布时间:2024-04-27 16:11:53
vue数据变化被watch监听处理
监听当前vue文件数据
例如,当前的vue文件的data中有如下属性:
data() {
return {
dialogFormVisible: false,
}
}
要监听dialogFormVisible变量的数据变化,则代码如下:
watch: {
dialogFormVisible: function(newVal, oldVal) {
alert(newVal);
alert(oldVal);
}
}
监听vuex中的数据
如果vuex中声明的数据如下:
export default new Vuex.Store({
state: {
avatar: "",
},
mutations: {},
actions: {},
modules: {}
});
则监听的代码如下:
watch: {
"$store.state.avatar": function(newValue, oldValue) {
...
}
},
如何正确使用watch监听属性变化
Vue中可以使用 * 监听属性的变化,并根据属性变化作出响应。但一旦涉及到复杂数据的监听(如Object,但数组一般不需要,因为Vue针对数组做了特殊处理)时就比较复杂了,本文解释了使用watch监听属性变化的方法,包括复杂数据。
基本用法
Vue watch最重要的使用场景是根据某属性的变化执行某些业务逻辑:
<template>
<input type="number" v-model.number="counter" />
</template>
<script>
export default {
name: "Counter",
data: function() {
return {
counter: 0,
};
},
watch: {
counter: function(newV, oldV) {
console.log('counter change to %d from %d', newV, oldV);
},
}
};
</script>
watch的基本用法很简单:针对需要监听的属性定义个同名的函数即可,函数的第一个参数为变化后的值,第二个参数为变化前的值。
监听object
首先我们回顾一个JavaScript中的概念:复杂数据变量。“复杂”的原因在于变量只是一个引用,和C++中的指针类似,其保存的不是真实的数据,而是数据的地址。比如对于一个object变量来说,添加属性、删除属性、修改属性的值都不会改变这个地址,这也可以说这个object变量没有变化。不管所用的框架如何,基本定理肯定是生效的,所以Vue中监听object也是一难题,特别是嵌套数据的监听。
这里的变化指的是地址的变化,能够触发变化最简单的方式就是重新赋值。
<template>
<div>
<label>up trigger {{ counter.up }} times</label>
<button @click="onTrigger('up')">Trigger Up</button>
<br>
<label>down trigger {{ counter.down }} times</label>
<button @click="onTrigger('down')">Trigger down</button>
</div>
</template>
<script>
export default {
name: "Counter",
data: function() {
return {
counter: {
up: 0,
down: 0,
},
};
},
methods: {
onTrigger: function(type) {
this.counter[type] += 1;
}
},
watch: {
counter: function(newV, oldV) {
// 不会被触发
console.log('counter change to %o from %o', newV, oldV);
},
}
};
</script>
针对counter的监听不会被触发,因为this.counter[type] += 1;并不会使this.counter变化(地址没变)。那如果想要监听到这个变化应该怎么办呢?一般来说有两种方式:
使用deep参数
watch: {
counter: {
handler: function(newV, oldV) {
console.log('counter change to %o from %o', newV, oldV);
},
deep: true,
}
}
使用deep需要使用watch的完整形式:handler是监听回调函数,deep: true指定了不仅仅监听counter的变化,也监听其内部属性的变化,所以当counter.up或counter.down变化时才能出发handler回调。
重新赋值
methods: {
onTrigger: function(type) {
// 重新赋值触发变化
this.counter = {
...this.counter,
[type]: this.counter[type] + 1,
};
}
},
watch: {
counter: function(newV, oldV) {
// 不会被触发
console.log('counter change to %o from %o', newV, oldV);
},
}
那两种方式优劣如何呢?使用deep参数会为数据每一层都添加监听,当层级较深时比较耗费性能,而且Vue不能监听到属性的添加或删除。所以一般来说使用重新赋值的方式是较优的方案,但如果只是想监听内部嵌套数据的话,重新赋值就比较重了,所以Vue也提供了直接监听嵌套属性变化的途径:
通过路径监听内部数据
watch: {
'counter.up': function(newV, oldV) {
console.log('counter.up change to %d from %d', newV, oldV);
},
'counter.down': function(newV, oldV) {
console.log('counter.down change to %d from %d', newV, oldV);
},
}
通过这种方式可以避免使用deep造成的性能消耗问题,当只对某内部属性变化作出响应的场景下比较合适,但仍要注意监听的路径数据仍是复杂数据时的场景。
初始化变量触发监听回调
使用watch监听变化时,给变量初始值不会触发监听函数,如果像要改变这个默认设定可以使用immediate参数,其用法和deep类似:
watch: {
counter: {
handler: function(newV, oldV) {
console.log('counter change to %o from %o', newV, oldV);
},
immediate: true,
}
}
这样在赋初值时就会触发监听函数,其中第一个参数为初始值,第二个参数为undefined。
总结:使用watch可以监听属性的变化,且其使用方式也不少,理解每种方式的使用场景能为开发节省时间,优化性能。
来源:https://blog.csdn.net/qq_36272282/article/details/104426905


猜你喜欢
- 1.下载安装pyqt5工具包以及配置ui界面开发环境pip install PyQt5pip install PyQt5-tools2.点击
- 学习目的: 掌握ADO.NET打开SQL SERVER数据库的方法。 今天做个非常普通的例子,做一个用户登录框。主要是通过这个练习认识一下S
- 1. 什么是文件指纹?文件指纹就是打包后输出的文件名的后缀,主要用来对修改后的文件做版本区分。2. 文件指纹有哪几种?1. Has
- 起因引发原因:门店需求新增自提门店,自提门店需要加自提点图片,在渠道店上引入了图片地址img_url 的字段,字段值定义为text not
- 参考网址构建网络我们可以通过torch.nn包来构建网络,现在你已经看过了autograd,nn在autograd的基础上定义模型和求微分。
- 使用本Activation code需要jetbrains-agent支持!插件Activation code:06KU174Y5C-eyJ
- 论证完使用target=_blank并非绝对错误之后,分场景探讨如何减少新开窗口。自有意识注意这个问题,是看到蓝色经典Plod大叔在04年提
- 可能某次不小心改了配置文件,导致无法打开jupyter,找了很多方法,都没从根本上解决问题。倒是发现启动的默认目录被改了,怀疑是这个问题。然
- 前言为了机器人在寻路的过程中避障并且找到最短距离,我们需要使用一些算法进行路径规划(Path Planning),常用的算法有Djikstr
- NICE!大家好,在上一章节,我们学习了 multiprocessing 模块 的关于进程的创建与进场常用的方法的相关知识。 通过在一个主进
- 除了C/C++以外,我也接触过不少流行的语言,PHP、java、javascript、python,其中python可以说是操作起来最方便,
- Oracle是目前应用最广泛的数据库系统。一个完整的数据库系统包括系统硬件、操作系统、网络层、DBMS(数据库管理系统)、应用程序与数据,各
- 自定义模板403<!DOCTYPE html><html lang="en"><head&
- 1. MySQL索引概述1.1 索引的概念什么是索引,索引就是排好序的快速查找数据结构。1.2 索引的特点索引的优点1.提高数据检索的效率,
- 很多时候,我们都需要获取windows消息提示框的文本内容,例如系统异常信息,软件错误提示等。。。但是如何获取提示信息呢?通常我们的印象中,
- 找到detect.py,在大概113行,找到plot_one_box &
- 准备在以后制作的网站中尝试一些变化,比如:先提交内容,后提示注册/登陆。感觉这样可以绑架更多用户……不想注册再发言?那就先让你上钩发言,然后
- 数据增强卷积神经网络非常容易出现过拟合的问题,而数据增强的方法是对抗过拟合问题的一个重要方法。2012 年 AlexNet 在 ImageN
- 在开发国际化网站的时候,难免会与时区打交道,通用CMS更是如此,毕竟其 * 户可能是来自于全球各地的。Django在时区这个问题上下了不少功
- 昨天又翻了下前段时间WD内部培训的幻灯片,发现了kejun推荐的一篇好文:Javascript Closures,看了之后受益匪浅。这篇文章