AutoComplete自动完成分类查询功能

Antdesign-vue AutoComplete自动完成分类查询功能

最近在业务里遇到需要在输入框输入的同时,要有搜索提示的需求。因为笔者最近都在做Antdesign的项目,所以就用这个框架来处理,首先来看一下效果:

自动完成

官方例子

首先Antdesign自己的官网就有示例.
在这里插入图片描述
其实这个例子已经满足我们80%的需求了,我们只要在他的基础上增加搜索功能就好了。

效果实现

1.首先查看文档,AutoComplete有一个事件方法:
在这里插入图片描述
所以我们就在这个事件上去做搜索功能,完整HTML代码:

<a-auto-complete
    v-model="m.persons"
    @search="handleSearch"
    dropdown-match-select-width="false"
    option-label-prop="value">
      <template slot="dataSource">
        <a-select-opt-group v-for="group in dataSourcePerson" :key="group.title">
          <span slot="label">{{ group.title }} </span>
              <a-select-option v-for="opt in group.children" :key="opt.id" :value="opt.title"> {{ opt.title }} </a-select-option>
           </a-select-opt-group>
      </template>
 </a-auto-complete>

2.然后我们接着去写搜索方法,我的思路是每次input框触发@search方法的时候,改变dataSourcePerson数据源,把匹配到数据源重新赋值到dataSourcePerson就好了。

// 过滤方法,将数组里匹配到的数据然后return
	fifterData (arr, input) {
      let list = []
      if (!arr.length) return []
      arr.forEach(v => {
        if (v.name.indexOf(input) >= 0) {
          list.push(v)
        }
      })
      return list
    },
    handleSearch (input) {
      let xyr = this.fifterData(this.XYR_LIST, input)
      let bhr = this.fifterData(this.BHR_LIST, input)
      let zr = this.fifterData(this.ZR_LIST, input)
      let bar = this.fifterData(this.BAR_LIST, input)
      this.initFormWithData({
        XYR_LIST: xyr,
        BHR_LIST: bhr,
        ZR_LIST: zr,
        BAR_LIST: bar
      })
    },
    initFormWithData (data) {
      this.dataSourcePerson = [
        {
          title: '嫌疑人',
          children: this.getList(data.XYR_LIST)
        },
        {
          title: '被害人',
          children: this.getList(data.BHR_LIST)
        },
        {
          title: '证人',
          children: this.getList(data.ZR_LIST)
        },
        {
          title: '报案人',
          children: this.getList(data.BAR_LIST)
        }
      ]
    },
    getList (arr) {
      let list = []
      arr.forEach(v => {
        list.push({
          id: v.id,
          title: v.name
        })
      })
      return list
    },

代码我就贴了关键的,至此筛选功能便完成了,但是当我满怀期待去试验效果的时候,浏览器又又又又给我抛了个错:
在这里插入图片描述
map 报错?第一想到的就是数组报错,但是我查了很久都发现数组没问题呀。就在我逐一debugger的时候,我发现我的“证人”项children竟然是空数组,原来是这个组件不会去帮我们去处理空数据的情况,那就自己处理呗。

3.在给数据源赋值的时候,如果哪项的children 是空数组,那就删去这一项

	for (let i = this.dataSourcePerson.length - 1; i >= 0; i--) {
        let v = this.dataSourcePerson[i]
        if (!v.children.length) {
          this.dataSourcePerson.splice(i, 1)
        }
      }

将这段代码放在initFormWithData方法最后就可以了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值