需求描述【省市区三级联动】

组件:Cascader 级联选择器

  • 后端需要所选中的地区的名字,如:['北京市', '北京市', '东城区']
  • 获取后端省市区具体列表的接口返回数据:
  1. // 省 - 参数1
  2. [
  3. {
  4. value: 1,
  5. label: '北京市'
  6. },
  7. ...
  8. ]
  9. // 市 - 参数2
  10. [
  11. {
  12. value: 1,
  13. label: '北京市'
  14. },
  15. ...
  16. ]
  17. // 区 - 参数3
  18. [
  19. {
  20. value: 1,
  21. label: '东城区'
  22. },
  23. ...
  24. ]
  • 因 element-ui 级联选择器 Cascader 有可以直接获取指定字段的属性,所以直接使用
  1. {
  2. value: this.label
  3. }
  • 一般情况下都没有问题,偶然发现当省市区有名字一样时出现没有值选中的情况,如:['北京市', '北京市', '东城区']
  • 发现接口也有点问题

    组件的回调级别 level 在相同内容的情况下,返回的一直是最上层的节点,猜想可能是 level 的判断的问题,于是只能找源码了

经常不断打断点终于找到的原因所在

  • 问题原因:查找节点的方法,不管当前找到了几个节点,都会只返回第一个节点,然后第一个节点肯定是在最前面的所以级别最高 level 是1,这个应该是一个问题,还得想下怎么才能解决自己的问题
  1. // cascader-panel/src/store.js
  2. getNodeByValue(value) {
  3. if (value) {
  4. const nodes = this.getFlattedNodes(false, !this.config.lazy)
  5. .filter(node => (valueEquals(node.path, value) || node.value === value));
  6. return nodes && nodes.length ? nodes[0] : null;
  7. }
  8. return null;
  9. }


  • 既然组件是必须唯一找到才能正常,那我只能设置一个唯一的值了,把层级【级别】也加到里面去,这样就能显示唯一的,最后返回出来时再把层级【级别】去掉就好了

本来是想用 computed 做转换的,结果发现转换有问题,只能用 watch 了,感觉 watch 性能可能会不大好,自己一般情况下能用 computed 解决的绝不用 watch 的

  • 组件实现代码:

显示的值还是 label
比对的值是 value, 确定唯一的值
返回到父组件的值要做对应的去格式化处理

  1. <template>
  2. <div class="the-city-cascader">
  3. <el-cascader
  4. class="city-cascader"
  5. :separator="separator"
  6. v-on="$listeners"
  7. v-bind="$attrs"
  8. v-model="innerValue"
  9. :options="cityOptions"
  10. :props="cascaderProps"
  11. @change="changeHandle"
  12. >
  13. </el-cascader>
  14. </div>
  15. </template>
  16. <script>
  17. export default {
  18. name: 'the-city-cascader',
  19. props: {
  20. value: {
  21. type: [Array, String],
  22. default: () => []
  23. },
  24. expandTrigger: {
  25. type: String,
  26. default: 'click'
  27. },
  28. /**
  29. * value 传出的字段组
  30. */
  31. valueKey: {
  32. type: String,
  33. default: 'value',
  34. },
  35. separator: {
  36. type: String,
  37. default: ' / ',
  38. },
  39. },
  40. data() {
  41. return {
  42. cityOptions: [],
  43. innerValue: [],
  44. isLazy: true,
  45. };
  46. },
  47. computed: {
  48. cascaderProps() {
  49. return {
  50. expandTrigger: this.expandTrigger,
  51. value: this.valueKey,
  52. lazy: true,
  53. lazyLoad: async (node, resolve) => {
  54. const { data, level } = node
  55. let nodes = []
  56. const findLevel = level + 1
  57. if (level === 0) {
  58. nodes = await this.initCityList(findLevel)
  59. } else {
  60. nodes = await this.initCityList(findLevel, data.code)
  61. }
  62. nodes.forEach(item => {
  63. if (findLevel < 3) {
  64. item.leaf = false
  65. } else {
  66. item.leaf = true
  67. }
  68. })
  69. // 通过调用resolve将子节点数据返回,通知组件数据加载完成
  70. resolve(nodes)
  71. }
  72. }
  73. },
  74. },
  75. created() {
  76. this.innerValue = this.value.map((item, itemI) => `${itemI + 1}-${item}`)
  77. },
  78. methods: {
  79. /**
  80. * 省1市2区3
  81. */
  82. async initCityList(flag, areaId = 0) {
  83. const params = { flag, areaId }
  84. let result = []
  85. try {
  86. const { data, status } = await this.axios.get(this.$API.cascaderCity, { params })
  87. if (status === 200) {
  88. result = (data.result || []).map(item => ({
  89. // 显示的值
  90. label: item.label,
  91. // 值的id
  92. value: `${flag}-${item.label}`,
  93. // 接口参数的值
  94. code: item.value,
  95. }))
  96. }
  97. } catch (error) {
  98. console.error(error)
  99. }
  100. return result
  101. },
  102. changeHandle(val) {
  103. const list = val.map(item => {
  104. const splitList = item.split('-')
  105. if (splitList.length > 0) {
  106. return splitList[1]
  107. } else {
  108. return splitList[0]
  109. }
  110. })
  111. this.$emit('input', list)
  112. }
  113. }
  114. }
  115. </script>
  116. <style lang="scss" scoped>
  117. .the-city-cascader {
  118. width: 100%;
  119. .city-cascader {
  120. width: 100%;
  121. }
  122. }
  123. </style>

使用 element-ui 级联插件遇到的坑的更多相关文章

  1. Element ui级联地址省市区插件

    安装 npm install element-china-area-data -S 使用 import { provinceAndCityData, regionData, provinceAndCi ...

  2. [坑况]饿了么你是这样的前端——vue+element ui 【this dependency was not found:'element-ui/lib/theme-chalk/index.css'】

    element ui 坑况:今日pull代码,潇洒npm run dev ,被告知:this dependency was not found:'element-ui/lib/theme-chalk/ ...

  3. element UI Cascader 级联选择器 编辑 修改 数组 路径 问题(转载)

    来源:https://segmentfault.com/a/1190000014827485 element UI的Cascader级联选择器编辑时 vue.js element-ui 2 eleme ...

  4. vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式

    不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...

  5. 基于element UI 的上传插件

    为了不再重复的上传文件,做了一个统一选择文件和上传文件的 基于 element UI :http://element-cn.eleme.io 前端实现文件下载和拖拽上传 演示 用法 <uploa ...

  6. 基于element ui的图片预览插件

    写插件很简单,满足两个条件即可,一.基本的逻辑思路,二.熟悉插件语法要求.本次Vue插件也比较简单,点击“查看图片”用轮播的方式限制用户上传的图片,如图: 项目采用的是vue-element-admi ...

  7. vue与element ui的el-checkbox的坑

    一,场景 通过使用checkbox,实现如图的场景, 点击某个tag,实现选中和非选中状态. 二, 官网的例子 通过切换checked值为true或者false来实现,一个checkbox的状态切换 ...

  8. element UI排坑记(一):判断tabs组件是否切换

    之所以将这个问题列在排坑记之中,是因为官方组件的一个属性颇有些隐蔽,这个问题曾经折腾了本人较多时间,始终思维固着,且使用搜索引擎也不容易搜索到答案,故记之.然而实际解决却是相当简单的. 一.问题描述 ...

  9. Vue(十八)Element UI

    Elment UI 1. 简介 Element UI是饿了么团队提供的一套基于Vue2.0的组件库,可以快速搭建网站,提高开发效率 ElementUI PC端 MintUI 移动端 [官网](http ...

随机推荐

  1. MakaJs:基于 React, Redux 的轻量级前端框架

    github: maka.js 留下您宝贵的STAR!谢谢 maka maka源于中文码咖,意为写代码的大咖 一眼即可看懂的前端框架,简约而不简单 1.安装 bash sudo npm i -g @m ...

  2. BZOJ 4621: Tc605

    Description 最初你有一个长度为 N 的数字序列 A.为了方便起见,序列 A 是一个排列. 你可以操作最多 K 次.每一次操作你可以先选定一个 A 的一个子串,然后将这个子串的数字全部变成原 ...

  3. Color Length UVALive - 5841

    题文:见网页:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=sho ...

  4. bugku猫片

    这个猫片思路清奇,真的让我长知识了. 开局一只猫,挺可爱的.   拿到图片,老套路来一波,首先 winhex打开是正常png图片,binwalk ,stegslove都没有任何收获. 折腾了好久没有任 ...

  5. .NET LINQ分析AWS ELB日志避免996

    前言 小明是个单纯的.NET开发,一天大哥叫住他,安排了一项任务: "小明,分析一下我们超牛逼网站上个月的所有AWS ELB流量日志,这些日志保存在AWS S3上,你分析下,看哪个API的响 ...

  6. 1046 Shortest Distance (20 分)

    1046 Shortest Distance (20 分) The task is really simple: given N exits on a highway which forms a si ...

  7. MySQL优化与实践

    一.MySQL优化概括 二.SQL优化 实践: 1.查看是否开启了慢查询日志 show variables like 'slow_query_log' 没有开启 2.查看是否开启了未使用索引SQL记录 ...

  8. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  9. 2.RF中scalar,list和dict变量的定义和取值

    $:定义scalar变量:@定义list变量:&定义dict变量: $还用来取值,包含scalar, list和dict变量,如下example所示 1.定义scalar变量:set vari ...

  10. angular之跨域

    一.什么是跨域? 跨域是指一个域下的文档或者脚本去请求另一个域下的资源.(广义) 广义的跨域: 1.资源跳转:链接跳转.重定向.表单提交. 2.资源嵌入:<link>.<script ...