搜索框模糊查询(带搜索历史纪录及搜索建议)

<template>
  <div>
    <el-autocomplete
      class="inline-input"
      clearable
      v-model="state1"
      :debounce="0"
      :select-when-unmatched="unmatched"
      :fetch-suggestions="querySearch"
      placeholder="请输入内容"
      @clear="firstHouse"
      @select="handleSelect"
      @keyup.native.enter="setIntoStorage"
    ></el-autocomplete>
   <el-button type="primary"  icon="el-icon-search"   @click="setIntoStorage"
      >搜索</el-button
    >
    <el-button type="danger" icon="el-icon-delete"   @click="reschange"
      >删除历史记录</el-button
    >
    <el-table
      :data="restaurants1"
      style="width: 100%">
      <el-table-column
        prop="projectname"
        label="姓名"
        width="180">
      </el-table-column>
      <el-table-column
        prop="developer"
        label="名称"
        width="180">
      </el-table-column>
      <el-table-column
        prop="transactionCount"
        label="数量">
      </el-table-column>
    </el-table>
  </div>
</template>
export default {
  name: 'userManagement',
  data() {
    return {
      restaurants1:[],//接口数据
      //建议的数组,这里可以看成历史数据的数组,这个数组不能为空,为空的话就会报错
      restaurants: [
        {
          value: '', //必须项
          code: ''
        }
      ],
      state1: '',
      unmatched:false,
    }
  },
  created() {
    this.firstHouse()
  },
  mounted() {
    this.restaurants = this.loadAll() 
  },
  methods: {
  //删除历史纪录
    reschange(){
       localStorage.removeItem('srcOrderNo')  //清空缓存
       localStorage.removeItem('ReverseSort')
       this.restaurants=[]
       this.unmatched=false
    },
    
    //接口数据(接口调用已省略)
    firstHouse() {
          this.restaurants1 = res.data //你获取的接口数据
           this.restaurants1.forEach((item) => {
              var value = item.projectname
              item.value = value
            })
    },
    querySearch(queryString, cb) {
      //如果有缓存值,那就给历史搜索的数组赋值
      if(queryString.length==0){
      //如果没有值就赋值历史纪录
         if (JSON.parse(localStorage.getItem('srcOrderNo'))) {
          this.restaurants = JSON.parse(localStorage.getItem('srcOrderNo'))
        }
      }else{
     // 如果有值就赋值数据库的建议提示
        this.restaurants=this.restaurants1
      }
      var restaurants = this.restaurants
        console.log(restaurants)
      //根据输入的值与历史搜索的数组进行匹配
      var results = queryString
        ? restaurants.filter(this.createStateFilter(queryString))
        : restaurants
      cb(results)
    },
      createStateFilter(queryString) {
        return (state) => {
          return (state.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
        };
      },
    //点击历史搜索的数据,获取到点击的数据
    handleSelect(item) {
      console.log(item)
    },
     loadAll() {
      return this.restaurants
    },
    //回车,点击事件
    setIntoStorage() {
      console.log(this.state1)
      this.firstHouse()
      if (JSON.parse(localStorage.getItem('ReverseSort'))) {
        // 判断是否有  缓存值
        var data = JSON.parse(localStorage.getItem('ReverseSort'))
        //如果已经存在输入的值,那这个值的搜索次数加一
        for (var i = 0; i < data.length; i++) {
          if (data[i].value == this.state1) {
            data[i].number = Number(data[i].number) + 1
          }
        }
        function compare(property) {
          return function(a, b) {
            var value1 = a[property]
            var value2 = b[property]
            return value1 - value2
          }
        }
        var datas = data.sort(compare('number')).reverse() //根据搜索次数进行倒排序
        localStorage.setItem('ReverseSort', JSON.stringify(datas)) //储存到所有历史数据中
        if (datas.length > 5) {
          //限制页面上只显示五条历史数据
          var list = datas.slice(0, 5)
          localStorage.setItem('srcOrderNo', JSON.stringify(list))
        } else {
          localStorage.setItem('srcOrderNo', JSON.stringify(datas))
        }
        //如果历史数据中不存在,则需要进行添加
        for (var i = 0; i < data.length; i++) {
          if (data[i].value == this.state1) {
            return
          }
        }
        //新数据
        data.push({
          value: this.state1,
          code: '1',
          number: 1
        })
        function compare(property) {
          return function(a, b) {
            var value1 = a[property]
            var value2 = b[property]
            return value1 - value2
          }
        }
        var datat = data.sort(compare('number')).reverse()
        localStorage.setItem('ReverseSort', JSON.stringify(datat))
        if (datat.length > 5) {
          var list = datat.slice(0, 5)
          localStorage.setItem('srcOrderNo', JSON.stringify(list))
        } else {
          localStorage.setItem('srcOrderNo', JSON.stringify(datat))
        }
      } else {
        // 首次创建
        let str = [{ value: this.state1, code: '0', number: 1 }]
        //创建用于存储所有的历史搜索,计算数据输入频率的高低
        localStorage.setItem('ReverseSort', JSON.stringify(str))
        //创建用于存储页面上的历史搜索,根据计算展示搜索频率最高的数据
        localStorage.setItem('srcOrderNo', JSON.stringify(str))
      }
    }
  }
}

参考@倔强的烤马铃薯的文章
效果:

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值