在Vue3+ElementPlus前端中,使用watch监控对象变化,实现字典列表的级联更新处理
在Vue3+ElementPlus前端中,有时候一些字典的关联显示,需要使用级联,因此一般使用watch监控对象变化,实现字典列表的级联更新。本篇随笔介绍基于实际案例来实现多级关联的处理操作,以供参考。
1、省市区的级联案例
在很多实际业务项目中,往往都可能涉及到级联显示的场景。比如有 省份 -> 城市 -> 区县 的字典数据,用户在选择“省份”时,自动更新“城市”选项;选择“城市”时,自动更新“区县”选项。基本的处理过程如下所示。
使用
ref/reactive保存选择值和字典数据。使用
watch监听上级字段变化,动态更新下级字典数据。下级值要 清空/重置,避免残留无效值。
对于省市区简单例子的Vue3模板界面,如下代码所示。
<template>
<div>
<label>省份:</label>
<select v-model="province">
<option :value="null">请选择</option>
<option v-for="p in provinces" :key="p.code" :value="p.code">{{ p.name }}</option>
</select> <label>城市:</label>
<select v-model="city">
<option :value="null">请选择</option>
<option v-for="c in cities" :key="c.code" :value="c.code">{{ c.name }}</option>
</select> <label>区县:</label>
<select v-model="area">
<option :value="null">请选择</option>
<option v-for="a in areas" :key="a.code" :value="a.code">{{ a.name }}</option>
</select>
</div>
</template>
在其script脚本代码的操作中,使用watch来处理界面代码逻辑如下所示。
<script setup lang="ts">
import { ref, watch } from 'vue' // 模拟字典数据
const provinces = ref([
{ code: 'gd', name: '广东' },
{ code: 'bj', name: '北京' }
]) const citiesDict: Record<string, { code: string; name: string }[]> = {
gd: [
{ code: 'gz', name: '广州' },
{ code: 'sz', name: '深圳' }
],
bj: [
{ code: 'dc', name: '东城' },
{ code: 'xc', name: '西城' }
]
} const areasDict: Record<string, { code: string; name: string }[]> = {
gz: [{ code: 'tianhe', name: '天河区' }, { code: 'yuexiu', name: '越秀区' }],
sz: [{ code: 'nanshan', name: '南山区' }, { code: 'futian', name: '福田区' }],
dc: [{ code: 'xx', name: '东城区示例' }],
xc: [{ code: 'yy', name: '西城区示例' }]
} // 当前选择
const province = ref<string | null>(null)
const city = ref<string | null>(null)
const area = ref<string | null>(null) // 下级字典
const cities = ref<{ code: string; name: string }[]>([])
const areas = ref<{ code: string; name: string }[]>([]) // 监听省份变化 → 更新城市
watch(province, (newVal) => {
if (newVal) {
cities.value = citiesDict[newVal] || []
} else {
cities.value = []
}
city.value = null // 清空下级选择
area.value = null
areas.value = []
}) // 监听城市变化 → 更新区县
watch(city, (newVal) => {
if (newVal) {
areas.value = areasDict[newVal] || []
} else {
areas.value = []
}
area.value = null // 清空下级选择
})
</script>
有时候,对于字段的处理顺序,我们可能需要引入nextick来处理。
nextTick 在 Vue3 里非常适合用来 等 DOM 和响应式更新完成再执行逻辑。
在「编辑场景级联字典」这种情况里,nextTick 可以解决 字典更新和已有值赋值的时序问题。
// 监听省份变化 → 更新城市字典
watch(
() => form.province,
async (newVal) => {
if (!newVal) {
cities.value = []
form.city = null
form.area = null
return
} cities.value = await fetchCities(newVal) // 用 nextTick 等 cities 更新后再校验
await nextTick()
if (!cities.value.find(c => c.code === form.city)) {
form.city = null
form.area = null
}
},
{ immediate: true }
)
2、电力记录业务的处理案例
在我们的一个项目案例中,对于电力的一些级联处理,也有类似的参考价值,如对于电力记录的处理中,我们需要根据地区进行一级、二级、三级能耗的下拉列表级联更新,方便在录入的时候进行关联显示。下面是数据列表的显示部分界面截图。

在数据编辑或者新增的情况下,我们需要根据这些内容进行级联的显示处理,那么界面如下所示。

我们看到,以上几个了下拉列表的字典内容,都存在一定的级联关系,如选择区域后,需要更新一级列表、选择一级列表后,需要更新二级列表、选择二级列表后,需要更新三级列表等等。
我们使用watch来跟踪对象的变化,并及时进行字典数据的更新,如下逻辑代码所示。
const area = ref([]); // 能源区域
const level1 = ref([]); // 一级能耗计量
const level2 = ref([]); // 二级能耗计量
const level3 = ref([]); // 三级能耗计量
const initArea = () => {
electrecord.GetFieldDict('area').then(data => {
// console.log(data);
area.value = data;
});
}; // 判断下拉框的值是否有改变
watch(
() => editForm.area,
(newValue) => {
if (!newValue) {
editForm.level1 = '';
editForm.level2 = '';
editForm.level3 = '';
}
if (newValue) {
const whereStr = `area='${newValue}'`;
electmerter.GetFieldDict('level1', whereStr).then(data => {
// console.log(data);
level1.value = data;
});
}
},
{ immediate: true }
); watch(
() => editForm.level1,
(newValue) => {
if (!newValue) {
editForm.level2 = '';
editForm.level3 = '';
editForm.devicename = '';
editForm.devicecode = '';
editForm.lastnumber = 0;
}
if (newValue) {
const whereStr = `level1='${newValue}' and area='${editForm.area}'`;
electmerter.GetFieldDict('level2', whereStr).then(data => {
// console.log(data);
level2.value = data;
});
}
},
{ immediate: true }
);
watch(
() => editForm.level2,
(newValue) => {
if (!newValue) {
editForm.level3 = '';
editForm.devicename = '';
editForm.devicecode = '';
editForm.lastnumber = 0;
}
if (newValue) {
const whereStr = `level2='${newValue}' and area='${editForm.area}' and level1='${editForm.level1}'`;
electmerter.GetFieldDict('level3', whereStr).then(data => {
// console.log(data);
level3.value = data;
});
}
},
{ immediate: true }
);
watch(
() => editForm.level3,
(newValue) => {
if (!newValue) {
editForm.devicename = '';
editForm.devicecode = '';
editForm.lastnumber = 0;
}
},
{ immediate: true }
);
其中 electmerter.GetFieldDict 是ES6类中的API调用函数,主要对标后端代码里面,通用处理的获取对应表的关联字段列表。
后端通用的处理代码如下C#代码所示。
/// <summary>
/// 根据字段名称,获取对应的字典列表
/// </summary>
/// <param name="fieldName">字段名称</param>
/// <param name="whereStr">条件字符串,如Age > 20 AND IsActive = true</param>
/// <returns></returns>
public virtual async Task<List<CListItem>> GetFieldDict(string fieldName, string whereStr)
{
var list = new List<CListItem>();
if (!fieldName.IsNullOrEmpty())
{
//var sql = $"Select distinct {fieldName} from Table";
var query = this.EntityDb.AsQueryable();
if (!string.IsNullOrWhiteSpace(whereStr))
{
query = query.Where(whereStr);
} var fieldList = await query.Distinct().Select<string>(fieldName).ToListAsync();
if(fieldList != null && fieldList.Count >0)
{
var sortedList = fieldList
.OrderBy(name => GetSortIndex(name)) // 主排序:数字前缀
.ThenBy(name => name) // 次排序:中文拼音顺序
.ToList();
list = sortedList.Select(s => new CListItem(s)).ToList();
}
}
return list;
}
以上就是一些简单案例上对于watch的使用,用于处理多级关联更新的情况下的功能实现。
在Vue3+ElementPlus前端中,使用watch监控对象变化,实现字典列表的级联更新处理的更多相关文章
- javaWeb - 2 — ajax、json — 最后附:后台获取前端中的input type = "file"中的信息 — 更新完毕
1.ajax是什么? 面向百度百科一下就知道了,这里就简单提炼一下 Ajax即Asynchronous Javascript And XML(异步JavaScript和XML).当然其实我们学的应该叫 ...
- 在Vue3+TypeScript 前端项目中使用事件总线Mitt
事件总线Mitt使用非常简单,本篇随笔介绍在Vue3+TypeScript 前端项目中使用的一些场景和思路.我们在Vue 的项目中,经常会通过emits 触发事件来通知组件或者页面进行相应的处理,不过 ...
- 在基于vue-next-admin的Vue3+TypeScript前端项目中,为了使用方便全局挂载的对象接口
在基于vue-next-admin 的 Vue3+TypeScript 前端项目中,可以整合自己的 .NET 后端,前端操作一些功能的时候,为了使用方便全局挂载的对象接口,以便能够快速处理一些特殊的操 ...
- vue3+element-plus+登录逻辑token+环境搭建
vue3+element-plus+登录逻辑token环境搭建 安装脚手架工具 1 npm i @vue/cli@4.5.13 -g 验证是否安装成功 1 vue -V # 输出 @vue/cli 4 ...
- Vue3+Vue-cli4项目中使用腾讯滑块验证码
Vue3+Vue-cli4项目中使用腾讯滑块验证码 简介: 滑块验证码相比于传统的图片验证码具有以下优点: 验证码的具体验证不需要服务端去验证,服务端只需要核验验证结果即可. 验证码的实现不需要我们去 ...
- Vite-Admin后台管理系统|vite4+vue3+pinia前端后台框架实例
基于vite4.x+vue3+pinia前端后台管理系统解决方案ViteAdmin. 前段时间分享了一篇vue3自研pc端UI组件库VEPlus.这次带来最新开发的基于vite4+vue3+pinia ...
- 说说移动前端中 viewport (视口)
转载网络资源的文章:来源不详~~ 移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dip ( device-independent pixel 设 ...
- 移动前端中viewport(视口) 转
移动前端中常说的 viewport (视口)就是浏览器显示页面内容的屏幕区域.其中涉及几个重要概念是 dpi ( device-independent pixel 设备逻辑像素 )和 CSS 像素之间 ...
- 前端中的SEO
前端中的SEO: mate.title META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME). <Meta name="Keywords" ...
- 实例分析ASP.NET在MVC5中使用MiniProfiler监控MVC性能的方法
这篇文章主要为大家详细介绍了ASP.NET MVC5使用MiniProfiler监控MVC性能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 MiniProfiler ,一个简单而有效的迷你剖析器 ...
随机推荐
- chatgpe脚本系列 - 分析nginx攻击日志,并自动加入防火墙黑名单
脚本内容 #!/bin/bash # 日志文件路径 LOG_FILE="/var/log/nginx/access.log" # Fail2Ban 过滤器路径 FILTER_FIL ...
- Windows11 关闭搜索栏中的Web网页搜索
️ Win11 搜索栏总弹出网页搜索通过注册表彻底关闭 在 Windows 11 系统中,当你通过任务栏中的搜索栏查找内容时,除了显示本地文件.应用和设置外,系统还会自动集成 Bing 搜索结果,展示 ...
- Oracle故障处理:分析Oracle数据库离奇的多快读慢
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效 ...
- 将AI Bot接入微信,做AI对话机器人
大家好,我是Edison. 之前学习了Coze这个AI Agent智能体开发台创建了一些Agent,除了可以将其发布到微信公众号做对话机器人之外,我看到了许多直接将其集成到微信对话或群聊中的案例. 刚 ...
- 小米手机4 rom 下载链接
简介 https://krunk.cn/kblog563.html
- java 两个线程
简介 使用synchronized, 来实现两个线程的同步操作. 参考链接 https://www.cnblogs.com/leihuazhe/p/7898563.html TIPS 唤醒一个在等待资 ...
- 如何测试wifi的吞吐率
基本知识储备 Interval 表示时间间隔, transfer 表示时间间隔传输的数据量, Bandwidth是时间间隔里的传输速率. Jitter 表示抖动. Lost/Total 表示丢包的数量 ...
- 什么是ETL?什么是ELT?怎么区分它们使用场景
ELT和ETL这两种模式从字面上来看就是一个顺序颠倒的问题,每个单词拆开来看其实都是一样的.E代表的是Extract(抽取),也就是从源端拉取数据:T代表的是Transform(转换),对一些结构化或 ...
- ETL数据集成工具DataX、Kettle、ETLCloud特点对比
ETL数据集成工具 对于数据仓库,大数据集成类应用,通常会采用ETL工具辅助完成.ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract) ...
- SciTech-BigDataAIML-LLM-Agent:智能体 大模型LLM | 一文完全搞懂大模型Agent(智能体):Agent、Agent + RAG 生活与工作的不可或缺。
SciTech-BigDataAIML-LLM-Agent:智能体 大模型LLM | 一文完全搞懂大模型Agent(智能体) Agent.Agent + RAG 生活与工作的不可或缺. 电影<钢 ...