vue el-cascader 省市区封装及使用

使用了 Element UI 中的 el-cascader 组件,并对其进行了进一步封装和定制

创建组件index.vue (src/components/addressCascader/index.vue)
<template><div><el-cascaderv-if="showca"size="large":props="props":options="cascaderOption":placeholder="placeholder || '选择省/市/区'"v-model="selectedOptions"@change="addressChange"ref="place":disabled="disabled":clearable="clearable":popper-class=" 'cascader-default'"></el-cascader></div>
</template><script>import { getDistrictAllSelect, getDistrictFilterSelect } from '@/api/district'export default {props: {selectedVal: {type: [Number, String],default: ''},disabled: {type: Boolean,default: false},checkStrictly: {type: Boolean,default: false},isNeedFilter: {type: Boolean,default: true},clearable: {type: Boolean,default: false},placeholder: String},data () {return {props: {value: 'id',label: 'name',checkStrictly: this.checkStrictly,expandTrigger: 'hover'},newDistictId: '',selectedOptions: [],showca: true,timeout: null,isChoose: false,chooseLevel: 0,cascaderOption: [],originData: [],cascaderList: []}},watch: {selectedVal: {handler (val) {if (val) {if(this.originData.length>0) {this.cascaderList = []this.findParent(Number(this.selectedVal))this.cascaderList.push(Number(this.selectedVal))this.selectedOptions = this.cascaderListthis.$nextTick(() => {let label = this.$refs.place.getCheckedNodes()? this.$refs.place.getCheckedNodes()[0].pathLabels? this.$refs.place.getCheckedNodes()[0].pathLabels.join(''): '': ''let level = this.$refs.place.getCheckedNodes()? this.$refs.place.getCheckedNodes()[0].level: ''this.$emit('getVal',this.selectedOptions[this.selectedOptions.length - 1],label,level)})}} else {this.clearVal()}},immediate: true}},mounted () {this.getDistrictAllSelect()},beforeDestroy () {},methods: {findParent (idx) {this.originData.forEach(item => {if (idx.toString() === item.id.toString()) {let pid = item['parentId']if (pid !== 0) {this.cascaderList.unshift(pid)this.findParent(pid)}}})},addressChange (arr) {if (arr.length > 1) {this.isChoose = true}if (arr.length == 1) {this.chooseLevel = 0} else if (arr.length == 2) {this.chooseLevel = 1} else if (arr.length == 3) {this.chooseLevel = 3}if (arr.length == 0) {this.$emit('getVal', '')return}console.log(this.$refs.place.getCheckedNodes()[0],'this.$refs.place.getCheckedNodes()[0]')let label = this.$refs.place.getCheckedNodes()[0].pathLabels? this.$refs.place.getCheckedNodes()[0].pathLabels.join(''): ''let level = this.$refs.place.getCheckedNodes()[0].levelthis.$emit('getVal', arr[arr.length - 1], label, level)if (arr.length > 2) {this.$refs.place.dropDownVisible = false}},clearVal () {if (this.$refs.place) {this.selectedOptions = []this.$refs.place.$refs.panel.checkedValue = []this.$refs.place.$refs.panel.activePath = []this.$refs.place.$refs.panel.syncActivePath()}},async getDistrictAllSelect () {let dataif (this.checkStrictly && this.isNeedFilter) {data = await getDistrictFilterSelect()this.originData = data || []this.cascaderOption = this.transTree(data)} else {if (sessionStorage.pvRegionData&&sessionStorage.pvRegionOriginData!='undefined') {this.originData = JSON.parse(sessionStorage.pvRegionOriginData)this.cascaderOption = JSON.parse(sessionStorage.pvRegionData)} else {data = await getDistrictAllSelect()this.originData = data || []sessionStorage.setItem('pvRegionOriginData', JSON.stringify(data))this.cascaderOption = this.transTree(data)sessionStorage.setItem('pvRegionData',JSON.stringify(this.cascaderOption))}}if (this.selectedVal) {this.cascaderList = []this.findParent(Number(this.selectedVal))this.cascaderList.push(Number(this.selectedVal))this.selectedOptions = this.cascaderListthis.$nextTick(() => {let label = this.$refs.place.getCheckedNodes()? this.$refs.place.getCheckedNodes()[0].pathLabels? this.$refs.place.getCheckedNodes()[0].pathLabels.join(''): '': ''let level = this.$refs.place.getCheckedNodes()? this.$refs.place.getCheckedNodes()[0].level: ''this.$emit('getVal',this.selectedOptions[this.selectedOptions.length - 1],label,level)})}},transTree (data) {let result = []let map = {}if (!Array.isArray(data)) {//验证data是不是数组类型return []}data.forEach(item => {//建立每个数组元素id和该对象的关系map[item.id] = item //这里可以理解为浅拷贝,共享引用})data.forEach(item => {let parent = map[item.parentId] //找到data中每一项item的爸爸if (parent) {//说明元素有爸爸,把元素放在爸爸的children下面;(parent.children || (parent.children = [])).push(item)} else {//说明元素没有爸爸,是根节点,把节点push到最终结果中result.push(item) //item是对象的引用}})return result //数组里的对象和data是共享的}}}
</script><style scoped lang="scss"></style>
页面引入
  • 在需要使用addressCascader组件的地方,通过import语句引入组件注册并使用

<template><div><address-cascader:selectedVal="selectedValue"@getVal="(districtVal, districtLabel, districtLevel) =>setDistrictId(districtVal, districtLabel, info, districtLevel)":isNeedFilter="info.isNeedFilter":checkStrictly="info.checkStrictly"ref="addressCascader":disabled="info.disabled"></address-cascader></div>
</template>
<script>import addressCascader from "@/components/addressCascader/index";export default {components: {addressCascader},data() {return {info:{clearable: true,isNeedFilter:false,valueFormat:'yyyy-MM-dd',checkStrictly: false,pickerOptions:{}},dataSource: [],selectedValue: ''}},methods: {setDistrictId(val, label, info, districtLevel) {console.log("选中的值,文字,信息,级别", val, label, info, districtLevel);}}// ...}
</script>

确保你已经安装了Vue.js和Element UI,并在项目中引入它们。

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

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

相关文章

【个人记录】NGINX反向代理grpc服务

最开始使用proxy_pass去代理了grpc服务&#xff0c;结果请求时候报错提示&#xff1a; rpc error: code Unavailable desc connection error: desc "error reading server preface: http2: frame too large"后来才知道代理grpc服务需要使用grpc_pass&#xff0c;…

Jenkins——节点

Jenkins服务运行在一台服务器上&#xff0c;但是服务器的资源时有限的&#xff0c;那Jenkins服务的构建速度也是有限的。当项目比较多或规模大时&#xff0c;会超出Jenkins的构建能力。单个Jenkins不能满足需求&#xff0c;但是布置多个Jenkins服务比较麻烦&#xff0c;管理起来…

【Casbin】一篇文章入门Casbin

Casbin Casbin模型基础&#xff08;PERM&#xff09;Policy定义Request定义MatchersEffect ACL模型RBAC模型Go语言实战使用前先下载casbin包新建一个Casbin enforcer判断是否能通过增加Policy删除Policy更新Policy获取Policy Casbin 权限管理在几乎每个系统中都是必备的模块。…

java设计模式学习之【桥接模式】

文章目录 引言桥接模式简介定义与用途&#xff1a;实现方式 使用场景优势与劣势桥接模式在Spring中的应用绘图示例代码地址 引言 想象你正在开发一个图形界面应用程序&#xff0c;需要支持多种不同的窗口操作系统。如果每个系统都需要写一套代码&#xff0c;那将是多么繁琐&am…

【vue-router】useRoute 和 useRouter 的区别

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

一起学docker系列之十四Dockerfile微服务实践

目录 1 前言2 创建微服务模块2.1 **创建项目模块**2.2 **编写业务代码** 3 编写 Dockerfile4 构建 Docker 镜像5 运行 Docker 容器6 测试微服务7 总结8 参考地址 1 前言 微服务架构已经成为现代软件开发中的一种重要方式。而 Docker 提供了一种轻量级、便携式的容器化解决方案…

业务运营常用的ChatGPT通用提示词模板

业务目标设定和策略制定&#xff1a;请帮助我设定明确的业务目标&#xff0c;并制定相应的运营策略&#xff0c;以便我能够更好地指导团队开展工作。 市场调研和分析&#xff1a;请帮助我进行市场调研和分析&#xff0c;包括竞争对手、市场规模、客户需求等方面的内容&#xf…

ESP32和ESP8266的ESP-MESH

ESP32和ESP8266的ESP-MESH 功能介绍一、介绍ESP-MESH二、安装painlessMesh库三、ESP-MESH基本示例&#xff08;广播消息&#xff09;四、示范 功能介绍 了解如何使用ESP-MESH网络协议通过ESP32和ESP8266 NodeMCU板构建网状网络。 ESP-MESH允许多个设备&#xff08;节点&#x…

位运算的高频算法题

关卡名 位运算的高频算法题 我会了✔️ 内容 1.理解位运算如何统计1的个数的 ✔️ 2.理解位运算如何实现加法 ✔️ 3.理解递归乘法是如何实现的 ✔️ 1 位移的妙用 位移操作是一个很重要的问题&#xff0c;可以统计数字中1的个数&#xff0c;在很多高性能软件中也大量应…

群晖NAS配置之自有服务器frp实现内网穿透

什么是frp frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议&#xff0c;且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。今天跟大家分享一下frp实现内网穿透 为什么使用 frp &a…

基于瑞芯微rk3588+寒武纪 | 38TOPS INT8算力的AI边缘计算盒子,智能安防、智慧工地、智慧城管、智慧油站

边缘计算盒子 瑞芯微rk3588寒武纪 | 38TOPS INT8算力 ● 采用 Big-Little 大小核架构&#xff0c;搭载四核 A76四核 A55&#xff0c;CPU主频高达 2.4GHz &#xff0c;提供1MB L2 Cache 和 3MB L3 &#xff0c;Cache提供更强的 CPU 运算能力。 ● 高性能四核 Mali-G610 GPU&a…

【2024秋招】2023-9-22 金山云文档服务端开发一面

1 OS 1.1 堆和栈的区别&#xff0c;什么时候用到堆&#xff0c;什么时候用到栈呢 堆和栈是两种不同的内存分配方式&#xff0c;它们在计算机编程中有着各自的用途和特点。以下是它们之间的主要区别以及在何时使用它们&#xff1a; 1.1.1 堆&#xff08;Heap&#xff09;&…

在vue中如何书写 SSR 友好的代码

文章目录 前言服务端的响应性​组件生命周期钩子​访问平台特有 API​跨请求状态污染​激活不匹配​自定义指令​teleports​后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;vue.js &#x1f431;‍&#x1f453;博主在前端领域还有很多…

i++和++i的区别

i和i的区别 一、基本概念 两者的作用都是自增加1。 单独拿出来说的话&#xff0c;i和i&#xff0c;效果都是一样的&#xff0c;就是ii1 public static void main(String[] args) {int i 0;i;System.out.println(i);}public static void main(String[] args) {int i 0;i;Sys…

【开源】基于JAVA语言的校园电商物流云平台

项目编号&#xff1a; S 034 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S034&#xff0c;文末获取源码。} 项目编号&#xff1a;S034&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快…

FH Admin Shiro反序列化漏洞复现

0x01 产品简介 FH Admin 是一款 java 快速开发平台。 0x02 漏洞概述 FH Admin CMS 存在 shiro 反序列化漏洞&#xff0c;该漏洞源于软件存在硬编码的 shiro-key&#xff0c;攻击者可利用该 key 生成恶意的序列化数据&#xff0c;在服务器上执行任意代码&#xff0c;执行系统命…

python自动化第二篇——合并ppt

简述 python合并ppt的方法有很多&#xff0c;但网上常说的python-pptx的方法&#xff0c;我用不了&#xff0c;这里我用了一个python-office的库。但又两个缺点&#xff0c;第一个生成的文档在你的用户名下的文档里&#xff0c;第二个是名字随机。 import office import os im…

华为OD机试真题-查找接口成功率最优时间段-2023年OD统一考试(C卷)

题目描述: 服务之间交换的接口成功率作为服务调用关键质量特性,某个时间段内的接口失败率使用一个数组表示,数组中每个元素都是单位时间内失败率数值,数组中的数值为0~100的整数,给定一个数值(minAverageLost)表示某个时间段内平均失败率容忍值,即平均失败率小于等于minA…

vue3-vite-ts:编写Rollup插件并使用 / 优化构建过程

一、vue3-vite-ts项目&#xff0c;编写Rollup插件并使用的意义 在使用Vue3 Vite TypeScript这种技术栈时&#xff0c;可以使用Rollup插件来优化构建过程&#xff0c;例如使用rollup-plugin-typescript2插件来编译TypeScript代码&#xff0c;使用rollup-plugin-vue插件来处理…

【开源】基于Vue+SpringBoot的康复中心管理系统

项目编号&#xff1a; S 056 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S056&#xff0c;文末获取源码。} 项目编号&#xff1a;S056&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…