【ElementUI】el-autocomplete 远程搜索自动填充

本文详细介绍了在Vue.js中如何实现Autocomplete组件,包括基础功能如清空、编辑状态回填、展开下拉框、搜索指定内容及手动触发建议列表。通过两种不同的数据获取方式,展示了如何在大量客户数据中进行实时匹配和筛选。同时,讨论了如何处理编辑状态的回填、清空聚焦等细节问题,确保组件的正常工作。
摘要由CSDN通过智能技术生成

目录

实现基本功能

清空

编辑状态回填数据

展开下拉框

搜索指定内容

手动fetch-suggestions


工作需求:在存在大量客户的情况下,输入姓名中的任意字可以匹配相关联的姓名。以下是按照官网实现。

实现基本功能

<el-autocomplete
  ref="autocomplete"
  class="autocomplete"
  v-model="form.name"
  :fetch-suggestions="querySearch"
  clearable
  placeholder="请选择客户"
  @select="choose_memebr"
  @clear="blur_memebr()"
></el-autocomplete>

获取数据方式一: 进入页面就获取完整数据,后面再自己对数据进行筛选。 

data() {
  return {
    form:{
        name:'' // 展示的选中姓名
    },

    list:[],// 所有数据
    
    member: {}, // 选中的客户信息
  };
},  
created() {
    this.getlist()
},
method:{
  getlist() {
    getData({
      url:'/member',
      data: {},
    }).then((res) => {
      const {
        code,
        data: {
          list: { data },
        },
      } = res;
      if (code === 200) {
        data.map((e) => {
          e.value = `${e.user.name}(${e.user.phone})`;
        });

        this.list = data
      }
    });
  }
  // 获取数据
  querySearch(queryString, cb) {
    var restaurants = this.list;
    var results = queryString
       ? restaurants.filter(this.createFilter(queryString))
       : restaurants;
    // 调用 callback 返回建议列表的数据
    cb(results);
  },

  // 筛选
  createFilter(queryString) {
      return (restaurant) => {
        return (
          restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) ===
          0
        );
      };
  },

  // 选中,然后进行其他操作
  choose_memebr(item) {
    this.member = item;
  },

  // 清空
  blur_memebr(item) {
    this.member = {
        id: "",
        value: ""
    };
    document.activeElement.blur() // 清空聚焦
  },
}  

 获取数据方式二: 每次都调用接口进行筛选

data() {
  return {
    form:{
        name:'' // 展示的选中姓名
    },
    
    member: {}, // 选中的客户信息
  };
},  
method:{

  // 获取数据
  querySearch(queryString, cb) {
    getData({
      url:'/member',
      data: {
        search: queryString,
      },
    }).then((res) => {
      const {
        code,
        data: {
          list: { data },
        },
      } = res;
      if (code === 200) {
        // 只匹配value的值
        data.map((e) => {
          e.value = `${e.user.name}(${e.user.phone})`;
        });

        // 调用 callback 返回建议列表的数据
        cb(data);
      }
    });
  },


  // 选中,然后进行其他操作
  choose_memebr(item) {
    this.member = item;
  },

  // 清空
  blur_memebr(item) {
    this.member = {
        id: "",
        value: ""
    };
    document.activeElement.blur() // 清空聚焦
  },
}  

清空

添加clearable 和@clear的方法blur_member:
blur_member:当前获得焦点的元素失去焦点,el-autocomplete清空后才能正常使用,同时要把所选的项目清空。

document.activeElement :获取当前获得焦点的元素

blur_memebr(item) {
  document.activeElement.blur() // 清空聚焦
},

编辑状态回填数据

this.form.member = `${v.name}`
this.member = {
  id: v.id,
  value: v.name
}

展开下拉框

nextTick(()=>{
    this.$refs.autocompletet.activated = true
})

搜索指定内容

this.$refs.autocomplete.getData( this.form.name)

手动fetch-suggestions

nextTick(()=>{
    this.$refs.autocompletet.activated = true
    this.$refs.autocomplete.getData( this.form.name)
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宾果的救星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值