vue+Element UI实现省市区镇四级联动封装

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

在一些需要填写地址的前端页面中,总是少不了需要填写地址的级联选择器,类似这样的:

在某依框架中,是直接把省市区的地址和编码放在了数据库里。个人觉得还是很头疼的:

  1. sql写起来麻烦。即使这样的sql只用写一次,后边的直接调用;
  2. 维护起来麻烦。万一增加了一个县,或者减少了一个区,头疼;
  3. 数据备份。这些数据加起来少说3000+,耗费时间和资源。

那有没有简单的方式呢?当然是有的,前端就有这样的一个库:

kotlin 复制代码
 npm install element-china-area-data

具体的使用可以参考对应的官方文档或者博客vue+Element UI 实现中国省市区三级联动

但是,shigen还是觉得麻烦,没错,可能我比较抓紧细节。

上周我们的vue项目我安装了一下,用的淘宝npm景象,下载依赖的时候,竟然报错这个包找不到,最后换成了官方的镜像才找到的。正巧,今天看到了这个文档,我真觉得这个组件很大,功能强大,但是用的很少。为什么不自己封装一个呢?

说干就干。在gitee上找到了这个项目:中国省市区数据。这个json文件里就是全部的json数据:

具体的数据选择,也可参考官方文档:中国省市区数据项目shigen的gitee页面突然卡住了,不知道是不是官方在升级,刷新了好几次都没用。

有了这个数据,我又想到了Element-ui有一个组件叫做el-cascader,正好实现级联的效果。打开el-cascader文档,我开始了封装:

xml 复制代码
 <template>
   <div>
     <el-cascader :options="options" :props="{ checkStrictly: true, value: 'code', label: 'name' }" ref="cascaderAddr"
       v-model="selectedOptions" @change="handleChange">
       <template slot-scope="{ node, data }">
         <span>{{ data.name }}</span>
         <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
       </template>
     </el-cascader>
     <p>{{ addrCodes }} {{ addrCodesSelected }}</p>
   </div>
 </template>
 ​
 <script>
 let pcas = require('@/assets/pcas-code.json')
 ​
 export default {
   name: 'ChinaPca',
   data() {
     return {
       options: pcas,
       selectedOptions: [],
       addrCodes: [],
       addrCodesSelected: [],
     }
   },
   methods: {
     // 获取省市区地址级联
     handleChange(thsAreaCode) {
       thsAreaCode = this.$refs['cascaderAddr'].getCheckedNodes()[0]
       this.addrCodes = thsAreaCode.path
       this.addrCodesSelected = thsAreaCode.pathLabels
       console.log(this.addrCodesSelected);
     }
   }
 }
 </script>

代码里没有设置对应的传值绑定方法,可以自行定义。

最后运行的效果是这样的:

存储到后端只用对选择的值稍微处理一下即可。


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台 账号 链接
CSDN shigen01 shigen的CSDN主页
知乎 gen-2019 shigen的知乎主页
掘金 shigen01 shigen的掘金主页
腾讯云开发者社区 shigen shigen的腾讯云开发者社区主页
微信公众平台 shigen 公众号名:shigen

shigen一起,每天不一样!

相关推荐
Flynt19 分钟前
React Router v8 升了之后,我花了两天才把项目跑起来
前端·typescript·preact
泯泷7 小时前
手搓JSVMM第 8 篇:函数调用:参数、返回值与调用帧
前端·javascript·前端框架
Sherotree7 小时前
Google Antigravity——Agent 被提到主界面
前端·ide·后端·edge浏览器
里欧跑得慢8 小时前
Flutter 像素级还原:设计稿到代码的视觉无损转换技巧
前端·css·flutter·web
里欧跑得慢8 小时前
Flutter 三方库 function_tree — 鸿蒙应用开发中的动态数学公式解析与计算神器,实现鸿蒙深度适配下的复杂函数逻辑运行时求值实战(适配鸿蒙 HarmonyOS Next ohos)
android·前端·安全·flutter·华为·harmonyos
苏灿烤鱼8 小时前
没有机密文件,也没有付费数据,在浏览器里造一颗"间谍卫星"
前端·javascript·github
泯泷9 小时前
手搓JSVM第 5 篇:写第一个编译器:从 AST 生成 IR
前端·javascript·算法
泯泷9 小时前
手搓JSVM第 7 篇:控制流:if、while 与 jump
前端·javascript·算法
泯泷9 小时前
手搓JSVM第 6 篇:把 IR 编成字节码:emit 与 label fixup
前端·javascript·算法
泯泷9 小时前
手搓JSVM第 3 篇:从栈式 VM 到寄存器式 VM:为什么我们选择寄存器
前端·javascript·算法