element-plus级联选择器使用懒加载获取数据无法回显的问题解决方案

在升级elementplus后,级联选择器使用懒加载后在不清楚当前层是否是叶节点的时候,无法设置leaf属性导致数据无法回显的问题,具体的复现链接如下

Element Plus Playground

选上了但无法回显到输入框

 

触发的原因就是没有设置leaf,所以element认为当前都还不是叶节点,当返回没有子节点的时候才认为是叶节点,但选中时还是选中了个空节点,这是内部代码逻辑的bug,具体我也没细看,就想了下有什么替补方案可以解决的,因为有时候后台就是不配合你返回这个字段给你,需要你往下请求,请求到没数据了为止,所以就只能自己看看怎么搞了

后面想来想去就把代码改成了动态拼接options数据

<template>
  <el-cascader
    v-model="value"
    :options="options"
    ref="contentRef"
    @expand-change="change"
  />
</template>

<script>
export default {
  data() {
    return {
      value: [],
      options: [],
    }
  },
  created() {
    this.change([])
  },
  methods: {
    change(val) {
      console.log(val); 
      setTimeout(() => {
        if (!val.length) {
          this.options = [{
            value: '1',
            label: 'Guide',
            leaf: false,
            children: []
          }, {
            value: '2',
            label: 'Component',
            leaf: false,
            children: []
          }, {
            value: '3',
            label: 'Resource',
            leaf: false,
            children: []
          }]
        } else {
          let nowLevelData = {}
          nowLevelData.children = this.options
          val.forEach(value => {
            for (const node of nowLevelData.children) {
              if (node.value === value) {
                nowLevelData = node
                break
              }
            }
          })
          if (val.length < 3) {
            nowLevelData.loading = true
            nowLevelData.children = [{
              value: nowLevelData.value + '1',
              label: 'Guide',
              leaf: false,
              children: []
            }, {
              value: nowLevelData.value + '2',
              label: 'Component',
              leaf: false,
              children: []
            }, {
              value: nowLevelData.value + '3',
              label: 'Resource',
              leaf: false,
              children: []
            }]
          } else {
            nowLevelData.leaf = true
          }
        }
      }, 500)
    }
  }
}
</script>

贴一下实现代码,自己写的一个小demo,逻辑就是每一层我都认为自己还不是叶,然后通过已选中的一层一层往下找,当找到第三层想要看看有没有第四层的时候,告诉组件我现在已经是叶节点了,大家可以根据自己的业务逻辑改成请求,请求到没有下一层数据的时候,告诉当前层你已经是叶啦,这样来做到回显。

当然这样的写法有个不好的点,当你还没获取到下一层数据时,都认为还有下一层,也就导致了当前真是叶节点的时候,展开时会多出一层然后请求完再消失,用户体验不好

贴个图,会有短暂的这种效果,具体看你接口的请求速度,但再快也会闪一下,进一步的想法是能不能获取当前这个节点的demo然后加上load的效果,去阻塞那个空数据的渲染,等到真的有数据再加上去,这样就不会有一闪而过的效果了,但目前还没想到这一步要怎么写,后续如果有想法了会继续更新,大家有好的思路也欢迎指点,感谢!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于级联选择器回显问题,可以通过设置 v-model 的值来实现。具体来说,你需要将级联选择器的 v-model 绑定到一个数组上,数组中存储每个级联选择器选中的值。然后,在初始化级联选择器时,你需要将这个数组中的值传递给级联选择器,以实现回显。 以下是一个示例代码: ```html <template> <el-cascader v-model="selectedOptions" :options="options" @change="handleChange" ></el-cascader> </template> <script> export default { data() { return { options: [ { value: "zhinan", label: "指南", children: [ { value: "shejiyuanze", label: "设计原则", children: [ { value: "yizhi", label: "一致", }, { value: "fankui", label: "反馈", }, ], }, { value: "daohang", label: "导航", children: [ { value: "cexiangdaohang", label: "侧向导航", }, { value: "dingbudaohang", label: "顶部导航", }, ], }, ], }, ], selectedOptions: ["zhinan", "daohang", "dingbudaohang"], }; }, methods: { handleChange(value) { console.log(value); }, }, }; </script> ``` 在上面的代码中,我们首先定义了一个 options 数组,用于存储级联选择器的选项。然后,我们定义了一个 selectedOptions 数组,用于存储级联选择器的选中值。在模板中,我们将级联选择器的 v-model 绑定到 selectedOptions 上,并将 options 数组传递给级联选择器的 options 属性。 这样,当级联选择器初始化时,它会自动选中 selectedOptions 数组中的值。当用户改变选择时,我们可以通过 @change 事件来获取用户选择的值,并将它们存储在 selectedOptions 数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值