Vue 2 —监视器实现动态切换表单属性值
目录
一、需求背景
二、监视器语法
三、实例展示
1、HTML部分
2、JS部分
四、使用场景总结
1. 表单验证
2. 动态更新 UI
3. 数据同步
4. 计算属性的替代方案
计算属性的优势 :
简洁性:
监视器的优势 :
灵活性:
多属性依赖:
副作用管理:
5. 异步操作
7. 条件渲染
8. 数据初始化
9. 深度监听
10. 性能优化
一、需求背景
项目中有一个功能内部要实现,用户在下拉框表单选择内容时,若切换表单选项,之前表单内选择的内容将自动重置,确保用户每次选择的内容是唯一的。
此时,应该选择Vue中的监视器,使用监视器属性来实现上述的功能。
二、监视器语法
在 Vue 2 中,监视器(Watcher)用于监听数据的变化,并在变化时执行相应的处理逻辑。监视器可以通过 watch 选项来定义。
watch: {// 监听单个属性propertyName: function(newVal, oldVal) {// 执行处理逻辑},// 监听嵌套属性'object.propertyName': function(newVal, oldVal) {// 执行处理逻辑},// 深度监听对象或数组object: {handler: function(newVal, oldVal) {// 执行处理逻辑},deep: true}
}
三、实例展示
1、HTML部分
在模板中,根据 form.operation 的值,动态显示不同的表单项:
<el-col :span="24"><el-form-item label="* 说明备注:"><el-select v-model="form.operation" style="width: 80%" placeholder="请选择操作类型"><el-optionv-for="option in operationOptions":key="option.value":label="option.label":value="option.value"></el-option></el-select></el-form-item><el-form-item v-if="form.operation === '焊接'" label="* 焊接内容:"><el-selectv-model="form.weldingContent" multiple style="width: 80%" placeholder="请选择焊接内容"><el-option v-for="option in weldingOptions" :key="option.value" :label="option.label" :value="option.value"></el-option></el-select></el-form-item><el-form-item v-if="form.operation === '装配'" label="* 装配内容:"><el-selectv-model="form.assembleContent" multiple style="width: 80%" placeholder="请选择装配内容"><el-option v-for="option in assembleOptions" :key="option.value" :label="option.label" :value="option.value"></el-option></el-select></el-form-item><el-form-item v-if="form.operation === '测试'" label="* 测试结果:"><el-radio-group v-model="form.testingContent"><el-radio label="成功">成功</el-radio><el-radio label="失败">失败</el-radio></el-radio-group></el-form-item><el-form-item v-if="form.testingContent === '失败' && form.operation === '测试'" label="* 失败原因:"><el-input type="textarea" v-model="form.failureReason" style="width: 80%"placeholder="请简述失败原因"></el-input></el-form-item><el-form-item v-if="form.operation === '问题描述'" label="* 问题描述:"><el-input type="textarea" v-model="form.questReason" style="width: 80%"placeholder="请简述遇到的问题/操作"></el-input></el-form-item></el-col>
2、JS部分
watch: {'form.operation': function(newVal) {// alert('新的操作类型:'+ newVal);this.resetFieldsBasedOnOperation(newVal);}},methods: {resetFieldsBasedOnOperation(operation) {if (operation === '焊接') {// alert(operation);this.form.testingContent = '';this.form.failureReason = '';this.form.questReason = '';this.form.assembleContent = [];} else if (operation === '测试') {this.form.weldingContent = [];this.form.questReason = '';this.form.assembleContent = [];} else if (operation === '装配') {this.form.weldingContent = [];this.form.testingContent = '';this.form.failureReason = '';this.form.questReason = '';} else if (operation === '问题描述') {this.form.weldingContent = [];this.form.testingContent = '';this.form.failureReason = '';this.form.assembleContent = [];}else if (operation === '其他') {this.form.weldingContent = [];this.form.testingContent = '';this.form.failureReason = '';this.form.questReason = '';this.form.assembleContent = [];
}
此处的代码,使用监视器用于监听 form.operation 的变化,并在变化时调用 resetFieldsBasedOnOperation 方法来重置表单字段。
监听嵌套属性:
'form.operation' 是一个字符串,表示要监听 form 对象中的 operation 属性。
当 form.operation 发生变化时,会触发对应的回调函数。
回调函数参数:
newVal:新值
oldVal:旧值(可选)
方法调用:
在回调函数中,调用了 resetFieldsBasedOnOperation 方法,并传入新的 operation 值。
resetFieldsBasedOnOperation 方法根据不同的 operation 值,重置表单中的相关字段。


四、使用场景总结
Vue 2 中的监视器(Watcher)在实际开发中有多种应用场景,以下是一些常见的使用场景:
1. 表单验证
当表单字段发生变化时,可以立即进行验证并给出反馈。
watch: {'form.email': function(newVal) {if (!this.isValidEmail(newVal)) {this.formErrors.email = '请输入有效的电子邮件地址';} else {this.formErrors.email = '';}}
},
methods: {isValidEmail(email) {const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;return emailRegex.test(email);}
}
2. 动态更新 UI
当数据发生变化时,动态更新 UI 元素的状态或样式。
watch: {'user.isOnline': function(newVal) {if (newVal) {this.userStatus = '在线';} else {this.userStatus = '离线';}}
}
3. 数据同步
当某个数据源发生变化时,同步更新另一个数据源。
watch: {'localData': function(newVal) {this.syncToRemote(newVal);}
},
methods: {syncToRemote(data) {// 同步到远程服务器}
}
4. 计算属性的替代方案
虽然计算属性(Computed Properties)更简洁,但在某些复杂情况下,使用监视器可以更灵活地处理逻辑。
使用计算属性:
// updateFullName 方法将 user.firstName 和 user.lastName 拼接成完整的姓名,并赋值给 user.fullName。
computed: {fullName() {return `${this.user.firstName} ${this.user.lastName}`;}
}
使用监视器:
watch: {'user.firstName': function(newVal) {this.updateFullName();},'user.lastName': function(newVal) {this.updateFullName();}
},
methods: {updateFullName() {this.user.fullName = `${this.user.firstName} ${this.user.lastName}`;}
}
计算属性的优势 :
简洁性:
计算属性的定义更加简洁,不需要显式地编写回调函数。
计算属性会自动缓存结果,只有在其依赖的数据发生变化时才会重新计算。
监视器的优势 :
灵活性:
监视器可以执行更复杂的逻辑,而不仅仅是简单的计算。
可以在回调函数中执行异步操作、副作用操作(如发送网络请求、修改其他数据等)。
多属性依赖:
计算属性只能依赖于当前组件的数据属性,而监视器可以监听多个属性的变化。
在上面的例子中,我们需要同时监听 user.firstName 和 user.lastName,使用监视器可以更方便地实现这一点。
副作用管理:
计算属性不适合处理有副作用的操作,因为它们会在每次依赖数据变化时重新计算。
监视器可以在数据变化时执行副作用操作,如更新其他数据、发送网络请求等。
5. 异步操作
当数据发生变化时,触发异步操作,如发送网络请求。
watch: {'user.activity': function(newVal, oldVal) {console.log(`User activity changed from ${oldVal} to ${newVal}`);}
}
具体示例:
<template><div><h1>用户活动记录</h1><select v-model="user.activity"><option value="online">在线</option><option value="offline">离线</option><option value="idle">空闲</option></select></div>
</template><script>
import axios from 'axios';export default {data() {return {user: {activity: 'online'}};},
// 监听 user.activity 属性的变化。
// 当 user.activity 发生变化时,触发回调函数,打印变化信息并调用 logUserActivity 方法watch: {'user.activity': function(newVal, oldVal) {console.log(`User activity changed from ${oldVal} to ${newVal}`);this.logUserActivity(newVal, oldVal);}},
// logUserActivity 方法是一个异步函数,使用 axios 发送 POST 请求到 /api/log-activity。methods: {async logUserActivity(newVal, oldVal) {try {const response = await axios.post('/api/log-activity', {userId: this.user.id, // 假设用户ID已经存在oldActivity: oldVal,newActivity: newVal});console.log('Activity logged successfully:', response.data);} catch (error) {console.error('Error logging activity:', error);}}}
};
</script>
7. 条件渲染
根据数据的变化,动态显示或隐藏组件。
watch: {'form.showAdvancedOptions': function(newVal) {if (newVal) {this.showAdvancedSection = true;} else {this.showAdvancedSection = false;}}
}
8. 数据初始化
在数据初始化时执行一些操作,确保初始状态正确。
watch: {'initialData': {immediate: true,handler(newVal) {if (newVal) {this.processInitialData(newVal);}}}
},
methods: {processInitialData(data) {// 处理初始数据}
}
9. 深度监听
对于复杂的数据结构,使用深度监听来捕获内部属性的变化。
watch: {'complexObject': {deep: true,handler(newVal, oldVal) {console.log('Complex object changed');}}
}
10. 性能优化
在某些情况下,可以使用监视器来优化性能,避免不必要的计算或渲染。
watch: {'largeDataset': {deep: true,handler(newVal) {this.updateChart(newVal);}}
},
methods: {updateChart(data) {// 更新图表数据}
}
相关文章:
Vue 2 —监视器实现动态切换表单属性值
目录 一、需求背景 二、监视器语法 三、实例展示 1、HTML部分 2、JS部分 四、使用场景总结 1. 表单验证 2. 动态更新 UI 3. 数据同步 4. 计算属性的替代方案 计算属性的优势 : 简洁性: 监视器的优势 : 灵活性: 多属性依赖: 副…...
Qt_day10_程序打包(完结)
目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…...
golang通用后台管理系统09(系统操作日志记录)
1.日志工具类 package log/**** 日志记录 wangwei 2024-11-18 15:30*/ import ("log""os""path/filepath""time" )// 获取以当前日期命名的日志文件路径 func getLogFilePath() string {currentDate : time.Now().Format("2006-…...
如何确保爬取的数据准确性和完整性?
在数据驱动的业务环境中,爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序,并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库,它提…...
【java】JDK安装
Java Downloads | Oracle 中国 next 注意安装的路径 环境变量...
科技改变工作方式:群晖NAS安装内网穿透实现个性化办公office文档分享(1)
文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 本文将详细介绍如何在群晖NAS上安装Synology Office和Synology Drive Server,并利用Cpolar内网穿透工具为本地文档配置固定的公网…...
基于Java Springboot甘肃旅游管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
03-axios常用的请求方法、axios错误处理
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
《天体》游戏配置要求介绍
《天体》是一款太空探索和基地建造生存游戏,而游戏的画面表现非常不错,需要的配置要求也不算高,CPU最低只需要英特尔的酷睿i3 4XXX 系列或者AMD的Ryzen 3 2.6ghz处理器。 天体要什么配置最低配置: 需要 64 位处理器和操作系统 操作系统 *: …...
【企业级分布式系统】 Kafka集群
文章目录 KafkaKafka 概述使用消息队列的好处 Kafka 的特性Kafka 系统架构Kafka 的应用场景Kafka 的优缺点 Kafka 集群部署下载安装包安装 KafkaKafka 命令行操作Kafka 架构深入 FilebeatKafkaELK 部署指南~部署 ZookeeperKafka 集群部署 Filebeat部署 ELK(Logstash…...
MySQL 中有哪几种锁?
在 MySQL 中,锁(Locks)是为了保证数据的一致性和完整性而设计的机制。常见的锁可以从粒度和操作类型两个角度分类。以下是详细介绍: 按 粒度 分类 1. 全局锁 描述:锁定整个数据库实例。用途:主要用于备份…...
kafka中节点如何服役和退役
节点服役(添加新节点) 1.准备新节点: 安装 Kafka 和相关依赖。 配置 Kafka Broker 的 server.properties 文件,确保 broker.id 是唯一的,并且配置正确的 zookeeper.connect 地址。 重启网卡 2.启动新节点ÿ…...
HTML5实现剪刀石头布小游戏(附源码)
文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…...
集群聊天服务器(3)muduo网络库
目录 基于muduo的客户端服务器编程 muduo只能装在linux中,依赖boost库 客户端并不需要高并发 基于muduo的客户端服务器编程 支持epoll线程池,muduo封装了线程池 而且还有完善的日志系统 使用muduo库代码非常固定,基本就只有chatserver的类名…...
解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题
解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题 要解决在Ubuntu 20.04中使用PyCharm时无法输入中文的问题,特别是当使用IBus作为输入法框架时,我们需要通过设置适当的环境变量来确保PyCharm可以正确调用IBus输入法。下面将详细说明原因及解决步骤…...
【jvm】HotSpot中方法区的演进
目录 1. 说明2. JDK1.6及以前3. JDK1.74. JDK1.8及以后 1. 说明 1.在HotSpot虚拟机中,方法区(Method Area)的演进是一个重要的内存管理优化过程。2.从JDK1.6到JDK1.8,HotSpot虚拟机中的方法区经历了从永久代到元空间的重大变化。…...
Win10/11 安装使用 Neo4j Community Edition
如果你下载的是 Neo4j Community Edition 的压缩包,意味着你需要手动解压并配置 Neo4j。以下是详细的使用步骤: 0. 下载压缩包 访问Neo4j官网,找到 Community Edition 版本并选择 4.x 或者 5.x 下载:https://neo4j.com/deployme…...
Ubuntu 22.04 上快速搭建 Samba 文件共享服务器
Samba 简介 Samba 是一个开源软件,它扮演着不同操作系统间沟通的桥梁。通过实现 SMB(Server Message Block)协议,Samba 让文件和打印服务在 Windows、Linux 和 macOS 之间自由流动。 以下是 Samba 的特点: 跨平台兼…...
JQuery 基础知识学习(详尽版)2024.11.17
一、jQuery简介及使用详解 1.1 jQuery简介 写更少的代码,做更多的事;jQuery可以做:HTML 元素选取 , HTML 元素操作 ,CSS 操作 ,HTML 事件函数 ,JavaScript 特效和动画 ,HTML DOM 遍…...
Spring Validation参数校验
Validation Validation是Spring提供的一个参数校验框架,使用预定义的注解完成参数校验 使用步骤 引入Spring Validation起步依赖在需要校验的参数所在的类上添加Validated注解在需要校验的参数前面加上Pattern注解 <!--参数校验依赖--><dependency>&l…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
