【element-plus】解决级联选择器el-cascader在懒加载模式 使用filterable无法搜索

文章讲述了作者在给ElementPlus的cascader级联选择器添加可搜索功能时遇到的问题,涉及到懒加载、filterable的限制以及如何通过`before-filter`和DOM监听实现自定义搜索逻辑的过程。
摘要由CSDN通过智能技术生成

今天产品让我给cascader级联选择器加个可搜索,我寻思这还不简单,直接加个filterable就行了。结果因为这个cascader使用了懒加载来进行多层级的请求,filterable并不能正常使用,输入什么都显示没有数据。

麻烦的是change事件也完全不响应这个搜索值的变化,只会在组件有选中项的时候触发。查询资料后,我找到这个属性:

这个钩子函数里能获取filterable的搜索值,并通过return true或false来开启或关闭默认的搜索行为。可有个问题是beforeFilter在搜索值为空时也不会触发,最终我只好通过监听里面input框的dom来实现搜索的清空还原。

注意:element-plus的el-cascader有两个input框,经实践el-cascader__search-input才是能取到搜索词的框。如果你用的element-ui版肯定会有区别。

完整方案如下:

<el-cascader class="user-cascader" ref="classify" v-model="data.curItem2"
          :options="data.options2" :props="data.props2" @change="handleChange2" filterable clearable :before-filter="beforeFilter" />
onMounted(() => {
  // 获取data.options2 并备份一个data.options2Copy
  // getList()

  // 监听搜索框的dom
  nextTick(() => {
    let dom = document.getElementsByClassName('user-cascader')[0]
    let inputDom = dom.getElementsByClassName('el-cascader__search-input')[0] // 搜索框
    
    inputDom.addEventListener('input', (e) => {
      console.log(e.target.value)
      const value = e.target.value
      if (!value) {
        clear()
      }
    })
  })
});

function beforeFilter(value) {
  data.keyWord = value?.trim()
  console.log(data.keyWord)
  // 手动筛选 
  data.options2 = data.options2.filter(v => v.label.indexOf(data.keyWord) > -1)
  // 空的时候显示默认的筛选无结果面板
  if (data.options2.length === 0) {
    return true
  }
  // 懒加载时默认筛选无效 直接禁用它 让组件加载我们手动筛选的数据
  return false
}

// 没搜索词时展示完整的原列表数据
const clear = () => {
  data.keyWord = ''
  data.options2 = JSON.parse(JSON.stringify(data.options2Copy))
}

另外看其他资料element-ui版需要加上:key来手动刷新组件,另一个区别就是input的类名,其他思路逻辑都是一致的。如果你看到了这篇文章但是用的element-ui,可以尝试这两个改动。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于 Element UI 的级联选择器 el-cascader,如果需要回显已经选中的值,可以通过设置 v-model 和 :options 属性来实现。 假设有一个三级联动的级联选择器,选项数据如下: ``` 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: '顶部导航' }] }] }] ``` 如果需要回显已经选中的值,可以将当前选中的值通过 v-model 绑定到 data 中的一个变量上,例如: ``` <el-cascader v-model="selectedOptions" :options="options" ></el-cascader> ``` 其中,selectedOptions 是一个数组,用于保存当前选中的值。 接下来,需要在 mounted 钩子函数中设置已选中的值,例如: ``` mounted() { this.selectedOptions = ['zhinan', 'shejiyuanze', 'yizhi'] } ``` 这样,在页面加载完成后,级联选择器就会自动回显已经选中的值。 需要注意的是,如果级联选择器的选项数据是异步加载的,需要在加载完成后再设置已选中的值,例如: ``` mounted() { this.loadOptions().then(() => { this.selectedOptions = ['zhinan', 'shejiyuanze', 'yizhi'] }) }, methods: { loadOptions() { // 异步加载选项数据 } } ``` 这样就可以实现 Element UI 的级联选择器 el-cascader 的回显功能了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值