element el-cascader动态加载数据 (多级联动,落地方案)

£神魔★判官ぃ 2023-01-21 02:09 676阅读 0赞

前言

最近需要用到element ui的这个插件做地区的四级联动,但是碰了一些问题:

  • 官网的说明太泛泛然,不易看懂
  • 网上的教程乱七八糟,代码一堆一堆的
  • 看这篇就对了!!!
  • 效果图 =>

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1OTQyMzQ4_size_16_color_FFFFFF_t_70

  • 点击确认后的值

20210513210539772.png

1. template

  1. <el-cascader
  2. size="mini"
  3. :props="props"
  4. @change="handleChange"
  5. v-model="value"
  6. style="width: 300px"
  7. ></el-cascader>

// props => 控制动态加载的配置

// @change => 监听变化

// value => 值

2. methods()

  1. // 获取省市区街道
  2. provinceFn(id) {
  3. let data = {
  4. up_id: id,
  5. };
  6. // 此处是一个promise 直接返回
  7. return postRequest(url.getlowerlevelarea, data);
  8. },
  9. // 监听数据变化
  10. handleChange(value) {
  11. console.log(value);
  12. }

3. data()配置

  1. data() {
  2. return {
  3. value: [], // 多级联动的值 => 会是一个数组
  4. props: {
  5. lazy: true,
  6. lazyLoad: (node, resolve) => {
  7. // node 节点数据 node.value => 当前节点的值
  8. // level: 层级 => 1,2,3,4
  9. const { level } = node;
  10. // 动态节点
  11. const nodes = [];
  12. // 为1代表第一次请求
  13. let type = level == 0 ? "1" : node.value;
  14. this.provinceFn(type)
  15. .then((res) => {
  16. if (res.code == -1) {
  17. this.msgFn("error", res.message);
  18. return;
  19. }
  20. // 节点数组
  21. res.data.map((item) => {
  22. // obj里的键值是官方要求的
  23. let obj = {
  24. value: item.city_id,
  25. label: item.city_name,
  26. leaf: node.level >= 3,
  27. };
  28. nodes.push(obj);
  29. });
  30. // resolve 节点返回
  31. resolve(nodes);
  32. })
  33. .catch((error) => {
  34. console.log(error);
  35. });
  36. },
  37. },
  38. };
  39. }

FAQ

注释其实已经非常详细了,整体思路是这样的:

  1. 根据官方文档,首先得知道 lazyLoad方法中的参数node, resolve分别是什么
  2. 配置自己的接口请求,我的是地区数据(省市区四级联动)
  3. 需要注意的是 props需要在data()里赋值,所以数据请求也要放进去
  4. 获取到数据后,需要按照它的规范赋值 => value:值,label:文字,leaf:层级
  5. 如果是三级,那么leaf值是=> 0, 1, 2,以此类推。我的是四级,所以是 => node.level >= 3
  6. 尽量不要用hover(效果会一闪一闪的,用户体验不好,click最佳)

已封装成组件,附上全部代码,供君使用:

  1. <template>
  2. <div class="con">
  3. <el-cascader
  4. size="mini"
  5. :props="props"
  6. @change="handleChange"
  7. v-model="value"
  8. style="width: 300px"
  9. ></el-cascader>
  10. </div>
  11. </template>
  12. <script>
  13. import url from "../request/url.js";
  14. import { postRequest } from "../request/api.js";
  15. export default {
  16. name: "newRegion",
  17. data() {
  18. return {
  19. value: [],
  20. props: {
  21. lazy: true,
  22. lazyLoad: (node, resolve) => {
  23. const { level } = node;
  24. const nodes = [];
  25. // level: 层级
  26. // node 节点数据
  27. // 一级菜单数据
  28. // 为1代表第一次请求
  29. let type = level == 0 ? "1" : node.value;
  30. this.provinceFn(type)
  31. .then((res) => {
  32. if (res.code == -1) {
  33. this.msgFn("error", res.message);
  34. return;
  35. }
  36. // 节点数组
  37. res.data.map((item) => {
  38. // {value:'',label:'全部'}
  39. let obj = {
  40. value: item.city_id,
  41. label: item.city_name,
  42. leaf: node.level >= 3,
  43. };
  44. nodes.push(obj);
  45. });
  46. // resolve 节点返回
  47. resolve(nodes);
  48. })
  49. .catch((error) => {
  50. console.log(error);
  51. });
  52. },
  53. },
  54. };
  55. },
  56. created() {},
  57. methods: {
  58. // 获取省市区
  59. provinceFn(id) {
  60. let data = {
  61. up_id: id,
  62. };
  63. return postRequest(url.getlowerlevelarea, data);
  64. },
  65. handleChange(value) {
  66. console.log(value);
  67. },
  68. // 弹窗
  69. msgFn(type, text) {
  70. this.$message({
  71. message: text,
  72. type: type,
  73. });
  74. },
  75. },
  76. };
  77. </script>
  78. <style lang="scss" scoped>
  79. .con {
  80. display: inline-block;
  81. }
  82. </style>

良心好文,讲的非常细致了,真心求顶~,以后会持续输出高质量好文!

发表评论

表情:
评论列表 (有 0 条评论,676人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DDD技术方案实践

    在整个DDD开发过程中,除了建模方法和理论的学习,实际技术落地还会遇到很多问题。在多个项目的不断开发演进过程中,循序渐进的总结了很多经验和小技巧,用于解决过往的缺憾和不足...

    相关 jquery实现多级联动

    我们在开发中,经常会遇到控件选择联动的情况,最常见的莫过于省市县了,当然还有其它不同层级的联动。好了,下面开始进行多久联动了。 详细代码如下: