Naive UI 组件使用体验之-级联选择 Cascader

news2025/4/7 13:40:43

使用场景

地址区域选择

简单使用

安装依赖

npm install naive-ui -D

按需引入之-手动引入

import {NCascader,CascaderOption
} from 'naive-ui' 

使用

<n-cascader:value="regionValue":options="regionOptions":multiple="false"placeholder="所在地区"remoteclearablecheck-strategy="child"@load="handleLoad"
/> 

增加操作

这里我们是要对收货地址进行一个增加操作。 我们这里只针对所在地址进行说明。

获取region

这里需要通过接口提前请求

const regionOptions = ref([])

// 获取区域列表
const getRegionList = async () => {// 获取region的接口const res = await findBaseRegion()regionOptions.value = res.map((item: CascaderOption) => {return {label: item.regionName,value: item.id,depth: 1,isLeaf: false}});
}

onMounted(() => {getRegionList()
}) 

接口返回的数据如下:

{"code": 200,"message": "成功","data": [{ "id": 1, "regionName": "华北" },{ "id": 2, "regionName": "华东" },{ "id": 3, "regionName": "东北" },{ "id": 4, "regionName": "华中" },{ "id": 5, "regionName": "华南" },{ "id": 6, "regionName": "西南" },{ "id": 7, "regionName": "西北" }],"ok": true
} 

这个数据需要进行格式转换,处理成下面的格式:

[{label: '华北',value: 1, depth: 1,isLeaf: false},...
] 

属性说明

属性描述
label标题
value
depth深度,根据depth来判断处在同一级的元素
isLeaf是否是最后一层,如果为true,后面的数据不再展开

我们使用上面处理好的数据,赋值给regionOptions即可进行渲染。

获取province

接下来我们需要在选择完毕region以后,根据对应的value去接口请求对应的province的数据,然后展示出来。

这里涉及到一个异步请求数据的过程,我们这样做

<n-cascader:value="regionValue":options="regionOptions"@load="handleLoad"
/> 

绑定load事件,在load事件中,接收option参数

const handleLoad = (option: CascaderOption) => {return new Promise<void>(async (resolve, reject) => {const list = await getProvinceList(option.value as number); if (list.length > 0) {option.children = list;resolve()} else {reject()}})
} 

option.value即为我们选中的value值,根据这个值去请求getProvinceList这个接口,最后拿到 provinceList赋值给option。children。注意这里的return new Promise,返回的一定得是一个Promise,而且必须要resolveorreject才能请求成功,不然有个菊花会一直在那爱的魔力转圈圈。

在请求接口的时候,同样的也需要把返回的数据处理成符合规范的数据格式,代码如下:

const getProvinceList = async (id: number) => {const res = await findBaseProvinceByRegionId(id as number)const list:CascaderOption[]= [];for(let i = 0; i < res.length; i ++) {list.push({label: res[i].name,value: `${id}-${res[i].id}`,depth: 2,isLeaf: true})}return list;
} 

注意:

  • value: ${id}-${res[i].id},写成这样的原因是它的value值的规则限制是x、x-y、x-y-z这种,比如1,1-2,1-2-3,不知道能不能看懂,看不懂自己实践一下。
  • depth的值变成了2
  • isLeaf: true,表示是最后一层了。

最后通过绑定的value值,在发生了value值变化的时候,我们就可以实时拿到他的值了。在所有的数据添加完毕,提交数据的时候,还需要对value值进行处理,因为我们选择完地址以后,发现它的value值是1-1,1-2,1-3这样的,-前面的的表示regionId,-后面的表示provinceId,后端需要的是分开传,不是1-1,1-2,1-3这样的,所以得拆开一下,我也是吐了。我们这里简单的split一下就行了。

const addstr = regionValue.value.split('-');
modal.value.regionId = addstr[0];
modal.value.provinceId = addstr[1]; 

添加操作到此为止。

修改操作

这里我们是要对收货地址进行过一个修改操作。修改的话就需要数据回显。我们需要拿到regionList和对应的privinceList的数据。

获取regionList还是和之前一样,没有变化。当我们点击修改按钮的时候,拿到对应的reginId去请求privinceList的数据,代码如下:

// 更新地址
const handleUpdateAdd = (item: any) => {showModal.value = true;editType.value = 'update';regionOptions.value.map(async (n: CascaderOption) => {if (n?.value === item.regionId) {// 根据相同的value值,触发接口请求,处理好的数据,赋值给children即可n.children = await getProvinceList(item.regionId)// 更新绑定的vaue值的格式,跟上面讲的格式一样regionValue.value = `${item.regionId}-${item.provinceId}` as any}})// 对表单默认值覆盖modal.value = {...item}
} 

如上代码所示,回显的时候赋值一下valuechildren的值就能正常显示了,必须按照数据格式的要求来。

使用总结

上面啰里八嗦的一大堆,其实是我搞了好半天才摸索出来的,看着其实也没啥难点,只有一点,当初搞崩溃了,就是value的值怎么触发它都不变化,最后看了一下它这个值的规则,吐血了直接,官方文档也没有说明,只是看它示例中写的1-1, 1-1-1这样的。一直以为就是选择哪个值它就是那个值,没想它的是根据父级-子级这样子来的。

最后

最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

一篇搞懂Python中的随机数

在 python 中生成随机样本的所有你需要的示例列表 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 在这篇博客中&#xff0c;我将演示如何根据不同的需求在python…

Docker三剑客——Docekr Swarm

目录 一、概述 二、Swarm 的核心概念 1. Node&#xff08;节点&#xff09; 2. Service&#xff08;服务&#xff09; 3. Task&#xff08;任务&#xff09; 三、Swarm 服务的运行部分 1. 工作节点 2. 服务、任务和容器 3. 任务和调度 4. 副本服务和全局服务 四、Swa…

3. 【prometheus 学习】prometheus数据类型

prometheus 四种数据类型学习及测试 安装 1&#xff09;从官网下载对应版本的二进制压缩包并解压 2&#xff09;新建prometheus.yml 文件&#xff0c;静态指定抓取本机的9091端口&#xff0c;设置采样时间2秒1次&#xff0c;方便一会测试。 scrape_configs:- job_name: defin…

单细胞UMAP图只标记特定细胞群、圈定细胞群及坐标轴修改

最近有小伙伴私信我&#xff0c;如下的单细胞UMAP图怎么做&#xff1f;是啥样的图呢&#xff1f;就是UMAP图上其他群是灰色的&#xff0c;只有某个群或者某几个群是标记颜色的&#xff0c;比较突出。其实很简单&#xff0c;一种办法可参考我们之前写过的ggplot做UMAP图&#xf…

uni-app使用蓝牙

目录 前言 连接蓝牙 开启蓝牙适配器 发现蓝牙 连接蓝牙 收发蓝牙数据 获取服务ID 获取特征值 读取蓝牙数据 写蓝牙数据 遇到的坑 获取serviceId的坑 特征值不支持读写 notify成功后立刻写蓝牙数据 工具方法 前言 原因是公司要搞个共享单车给内部员工使用&#…

32位浮点数表示方法

今天开始给大家介绍计算机组成原理课程&#xff0c;本文主要内容是32位浮点数表示方法。 一、32位浮点数构成 32位浮点数是计算机中常见的一种数据类型&#xff0c;该数占据32bit空间&#xff0c;可以表示较大范围内的整数和小数。32位浮点数由三部分组成&#xff0c;分别是符…

Java集合List、Set、Map底层源码解析

目录集合介绍MapHashMapLinkedHashMapHashTablePropertiesCollectionListArrayListVectorLinkedListSetHashSetLinkedHashSetTreeSet集合介绍 为什么使用集合&#xff1f; 当我们想要保存一组数据时&#xff0c;可以使用到的变量类型有集合和数组。那么就像说一下数组的局限性…

1.9

完善案例 ​ this.$nextTick(function () {this.$refs.input.focus()})}​ //点击编辑直接获取焦点 this.$refs.input.focus() //但是这种写法 由于input是用v-show控制的 所以执行了上面代码 改变了isEdit值 但是不会立马去重新解析模板 input框还没有出来 //将handleedit回调…

springboot+xxl-job初体验

在日常开发中经常遇到任务调度的需求&#xff0c;下面体验一下分布式调度xxl-job。 1、常见定时任务的实现方式 Java自带的java.util.Timer类ScheduledExcutorServiceSpringboot自带的EnableScheduling注解Quartz框架Elastic-job框架XXL-JOB框架 下面对xxl-job实现任务调度尝…

【TypeScript】TS进阶-函数重载(七)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

一文读懂电商数字员工究竟是什么?| RPA铺第1期

百度的曦灵&#xff0c;中核的核小智、万科集团数字员工“崔筱盼”都曾在2022年度爆火&#xff0c;数字员工一夜之间成为众多行业追捧的对象&#xff0c;那么&#xff0c;他/她们究竟代表着什么&#xff0c;对企业而言&#xff0c;是噱头大于收益&#xff0c;还是收益大于噱头呢…

简单的客户端服务器(多线程)基于json通信

这是一个客户端和服务器通信的小项目&#xff0c;小编自己手写了一个json工具&#xff0c;测试比jsoncpp&#xff0c;protobuf "效率更高"&#xff08;浅拷贝&#xff09;&#xff0c;改写成深拷贝效率会急剧下降&#xff08;小编能力有限&#xff0c;知识点&#xf…

技术分享 | Spring Boot 异常处理

说到异常处理&#xff0c;我们都知道使用 try-catch 可以捕捉异常&#xff0c;可以 throws 抛出异常。那么在 Spring Boot 中我们如何处理异常&#xff0c;如何更优雅的处理异常&#xff0c;如何全局处理异常。是本章讨论解决的问题。Java 异常类首先让我们简单了解或重新学习下…

Android开发-AS学习(一)

完整项目最精简流程&#xff1a;Android <-> 接口 <-> 数据库Android开发工具&#xff1a;Android Studio项目目录信息&#xff1a;一、控件1.1 TextView基础属性描述layout_width组件的宽度layout_height组件的高度id为TextView设置一个组件idtext设置显示的文本内…

Linux 学习笔记(借鉴黑马程序员Linux课程)

Linux视频课程 简介 Linux诞生于1991年&#xff0c;由林纳斯托瓦兹在21岁时完成。此后成为最为流行的服务器操作系统之一。 Linux内核和系统发行版 由Linux系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能&#xff0c;如&#xff1a;调度CPU、调度内存、调…

【笑小枫的按步照搬系列】Redis多系统安装(Windows、Linux、Ubuntu)

笑小枫&#x1f495; 欢迎来到笑小枫的世界&#xff0c;喜欢的朋友关注一下我呦&#xff0c;大伙的支持&#xff0c;就是我坚持写下去的动力。 微信公众号&#xff1a;笑小枫 笑小枫个人博客&#xff1a;https://www.xiaoxiaofeng.com Windows 下安装 方式一&#xff1a;https…

HCL(新华三模拟器)如何连接CRT及改界面颜色

我使用的HCL版本是2.1.1官网下载连接&#xff1a;https://www.h3c.com/cn/Service/Document_Software/Software_Download/Other_Product/H3C_Cloud_Lab/Catalog/HCL/&#xff0c;一键直达下载官网这个版本可以适配virtualbox的5.2.44的版本&#xff0c;同时支持华为的ensp模拟器…

Spring Security 表单配置(一)

Spring Security 表单配置&#xff08;一&#xff09;工具版本及环境参考资源配置详细说明工具版本及环境 工具&#xff1a; IDEA 2021.3 Maven 3.8.6 JDK 8 Spring Boot 2.7.7 Spring Securiity 5.7.6 参考资源 Spring Security官网: https://docs.spring.io/spring-security…

javaEE 初阶 — 常见的锁策略

文章目录1. 乐观锁 vs 悲观锁2. 互斥锁 vs 读写锁3. 重量级锁 vs 轻量级锁4. 自旋锁 vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. synchronized 是哪种锁8. 相关面试题1. 乐观锁 vs 悲观锁 乐观锁 指的是预测锁竞争不是很激烈&#xff0c;也就是指这里做的…

排列组合两个列表中的元素 product(a,b)

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】排列组合两个列表中的元素product(a,b)关于以下python代码表述错误的一项是?from itertools import producta [1,2,3]b [4,5,6]print("【显示】a",a)print("【显示】b",…