ElementUI的autocomplete组件+vue实现搜索联想(输入框提示)

select+autocomplete+buttom组件组合成一个带有选择的搜索框( 其中slot 属性是就用来指定在 autocomplete 中前置或者后置内容。)

<el-autocomplete :fetch-suggestions="querySearch" placeholder="请输入内容"  @select="handleSelect" v-model="searchValue" clearable class="input-with-select">
                  <el-select v-model="selectValue" slot="prepend" placeholder="请选择">
                      <el-option label="编号" value="id"></el-option>
                      <el-option label="姓名" value="username"></el-option>
                      <el-option label="微信/QQ" value="qq"></el-option>
                  </el-select>
                  <el-button slot="append" icon="el-icon-search" @click="selectSearch"></el-button>
</el-autocomplete>

vue:

data: {
    tableData: {$listb},//绑定页面显示的数据,初始为原始数据
    tableDataAll: {$listb},//保存原始数据
    selectValue:"id",//选择器选择的内容,初始为编号
    searchValue:null //搜索框输入的内容
  },

初始的数据可以通过各种方式传进来,这个就看各自的需求了。

那么数据有了再写几个方法:

//搜索
      selectSearch() {
          if(this.searchValue!==null){              
              let arr = this.tableDataAll.filter(item => {
                  if(item[this.selectValue]==null){
                      item[this.selectValue]="";
                      return item[this.selectValue].indexOf(this.searchValue) !== -1;
                  }else{
                      return item[this.selectValue].indexOf(this.searchValue) !== -1;
                  }
              });
              this.tableData = arr;
          }else{
              this.tableData = this.tableDataAll;
          }
      },
      //搜索联想
      querySearch(queryString, cb) {
          let programs = this.tableData;
          let programList = [];
          //从数据中拿出要联想的字段,并给它的名改成指定的{value:值}的格式才能正常显示
          for(let i=0;i<this.tableData.length;i++){
              programList.push({'value':programs[i][this.selectValue]})
          }
          let results = queryString ? programList.filter(this.createStateFilter(queryString)) : programList;
          //数据可能会存在重复的值,那么就不需要重复显示,所以调用下面写的去重方法
          results = this.arrayReuse(results);
          cb(results);//最后给到显示
      },
      //联想内容根据输入的搜索内容过滤
      createStateFilter(queryString) {
          return (program) => {
              return (program.value.toLowerCase().indexOf(queryString.toLowerCase()) !== -1);
          };
      },
      handleSelect(item) {
          this.searchValue = item.value;
      },
      //数组对象去重
      arrayReuse(arr) {
          const res = new Map();
          return arr.filter((arr) => !res.has(arr.value) && res.set(arr.value, 1))
      }
    },

如果选择器的值改变了,那么输入框的内容得清空,既然搜索内容清空了,那么显示的数据也得是原数据吧,所以最后完善一下,给两个数据做个监听:

watch: {
        searchValue(){
            //搜索框内容改变(包括清空)就搜索
            this.selectSearch();
            //搜索框没输入或者清空了显示回原始的数据(和上面一种觉得哪种更适合就看情况用)
            // if(this.searchValue == ""){
            //     this.tableData = this.tableDataAll;
            // }
        },
        selectValue(){
            //选择器一旦重新选择了,就让输入框的内容清空
            this.searchValue = "";
        }
    },

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 3中实现自动完成下拉列表的方法很简单,可以使用Vue.js提供的指令和组件的功能来实现。 首先,你需要引入ElementUI库,它是一个基于Vue.js的组件库,提供了非常好用的组件和指令。其中el-autocomplete是用来实现输入框的自动完成下拉列表的组件。 接下来,你需要在Vue.js的template(模板)中使用el-autocomplete组件,最基本的使用方法如下: ```html <template> <el-autocomplete v-model="value" :fetch-suggestions="querySearch" placeholder="请输入" /> </template> ``` 在这里,v-model用来绑定输入框的值,placeholder用来设置输入框的提示语,:fetch-suggestions用来绑定一个函数,该函数会在输入输入时被调用,它的返回值是一个数组,用来显示下拉列表中的选项。 接下来,你需要在Vue.js的script(脚本)中实现querySearch函数,该函数需要返回一个Promise对象,用来异步获取输入输入后的联想词,例如: ```javascript <script> import { ref } from 'vue'; import { fetchSuggestions } from '@/api/suggestion.js'; export default { setup() { const value = ref(''); const querySearch = async (queryString) => { return await fetchSuggestions(queryString); }; return { value, querySearch, }; }, }; </script> ``` 在这里,我们用了Vue.js 3中新增的setup函数,在该函数中,我们使用了ref定义了value变量,并定义了querySearch函数,该函数使用async/await实现异步调用了一个api/suggestion.js的函数fetchSuggestions,该函数的接口可以根据自己的实际需求进行实现。 最后,你需要在Vue.js的style(样式)中引入ElementUI的样式,以确保el-autocomplete组件正常显示: ```css @import "element-plus/packages/theme-chalk/src/index.scss"; ``` 综上所述,使用Vue.js 3和ElementUI实现输入框的自动完成下拉列表功能就这么简单,你只需要引入库、定义组件和指令、实现函数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值