Element-ui 自带的两种远程搜索(模糊查询)用法讲解


Posted in Javascript onJanuary 29, 2021

问题描述

有一种查询叫做前端远程搜索、模糊查询。饿了么自带两种方式可以做,一种是使用el-input中的el-autocomplete,另一种是使用el-select和el-option。这两种都可以选择,但是具体实现的思路方式要和后端商量。模糊查询是谁来做?

如果后端做

那么前端只需要把用户在输入框中的输入的关键字扔给后端,后端根据前端传过来的用户要查询的关键字,去数据库中进行模糊查询,查到的关联的数据扔给前端,前端拿到数据以后直接呈现给用户看到就行了。前端省事些

如果前端做

正常情况下,模糊查询其实后端做会多一些,因为假设用户输入了一个“王”字,想查询所有带“王”字的数据,如果数据库中有几万条数据,后端一次性把几万条数据扔给前端吗?前端再进行过滤、筛选、查找?这样前端会卡很久,同时数据不准确,因为在前端对后端返回来的数据进行过滤时,可能数据已经发生了改变等各种问题。但是也不是说前端就不能干。本文中分别介绍了饿了么自带的两种方式,我个人比较喜欢第二种方式。话不多说,上代码...

方式一

方式一效果图

Element-ui 自带的两种远程搜索(模糊查询)用法讲解

输入 “孙” 这个字会出现相关联的数据,也就是模糊查询的意思

<template>
 <div id="app">
  <!-- 远程搜索要使用filterable和remote -->
  <el-select
   v-model="value"
   filterable
   remote
   placeholder="请输入关键词"
   :remote-method="remoteMethod"
   :loading="loading"
  >
   <!-- remote-method封装好的钩子函数。当用户在输入框中输入内容的时候,会触发这个函数的执行,
   把输入框对应的值作为参数带给回调函数,loading的意思就是远程搜索的时候等待的时间,即:加载中-->
   <el-option
    v-for="item in options"
    :key="item.value"
    :label="item.label"
    :value="item.value"
   >
   </el-option>
  </el-select>
 </div>
</template>
<script>
export default {
 name: "app",
 data() {
  return {
   options: [],
   value: [],
   loading: false,
  };
 },
 methods: {
  // 当用户输入内容开始远程搜索模糊查询的时候,会触发remoteMethod方法
  remoteMethod(query) {
   // 如果用户输入内容了,就发请求拿数据,远程搜索模糊查询
   if (query !== "") {
    this.loading = true; // 开始拿数据喽
    // 这里模拟发请求,res就当成发请求返回来的数据吧。
    let res = [
     {
      label: "孙悟空",
      value: 500,
     },
     {
      label: "孙尚香",
      value: 18,
     },
     {
      label: "沙和尚",
      value: 1000,
     },
     {
      label: "沙师弟",
      value: 999,
     },
    ];
    this.loading = false // 拿到数据喽
    // 然后把拿到的所有数据,首先进行一个过滤,把有关联的过滤成一个新数组给到options使用
    this.options = res.filter((item)=>{

     // indexOf等于0代表只要首个字匹配的,如:搜索 王 王小虎数据会被过滤出来,但是 小虎王的数据不会被过滤出来。因为indexOf等于0代表以什么开头
     // return item.label.toLowerCase().indexOf(query.toLowerCase()) == 0

     // indexOf大于-1代表的是,只要有这个字出现的即可,如:搜索 王 王小虎、小虎王、小王虎都会被过滤出来。因为indexOf找不到才会返回-1,
     // 大于-1说明只要有就行,不论是不是开头也好,中间也好,或者结尾也好
     return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1
    })
   } else {
    this.options = [];
   }
  },
 },
};
</script>

说实话,我个人喜欢用方式二。来人呐,上代码

方式二

方式二效果图

Element-ui 自带的两种远程搜索(模糊查询)用法讲解

<template>
 <div id="app">
  <div>
   <el-autocomplete
    v-model="state2"
    :fetch-suggestions="querySearch"
    placeholder="请输入内容"
    :trigger-on-focus="false"
    @select="handleSelect"
    size="small"
   ></el-autocomplete>
  </div>
  <div>
   <ul>
    <li v-for="(item, index) in fruit" :key="index">{{ item.value }}</li>
   </ul>
  </div>
 </div>
</template>
<script>
export default {
 name: "app",
 data() {
  return {
   state2: "",
   fruit: [
    {
     value: "香蕉",
     price: "8.58",
    },
    {
     value: "车厘子",
     price: "39.99",
    },
    {
     value: "核桃",
     price: "26.36",
    },
    {
     value: "芒果",
     price: "15.78",
    },
   ],
  };
 },
 methods: {
  // 第二步
  // 当queryString不为空的时候,就说明用户输入内容了,我们把用户输入的内容在数据库中做对比,如果有能够模糊关联的,就直接取出
  // 并返回给带搜索建议的输入框,输入框就把返回的数据以下拉框的形式呈现出来,供用户选择。
  querySearch(queryString, cb) {
   if (queryString != "") {
    // 输入内容以后才去做模糊查询
    setTimeout(() => {
     let callBackArr = []; // 准备一个空数组,此数组是最终返给输入框的数组
     // 这个res是发请求,从后台获取的数据
     const res = [
      {
       value: "苹果",
       price: "13.25",
      },
      {
       value: "苹果1",
       price: "13.25",
      },
      {
       value: "苹果2",
       price: "13.25",
      },
      {
       value: "苹果3",
       price: "13.25",
      },
      {
       value: "苹果4",
       price: "13.25",
      },
      {
       value: "苹果5",
       price: "13.25",
      },
      
     ];
     res.forEach((item) => {
      // 把数据库做遍历,拿用户输入的这个字,和数据库中的每一项做对比
      // if (item.value.indexOf(queryString) == 0) { // 等于0 以什么什么开头
      if (item.value.indexOf(queryString) > -1) { // 大于-1,只要包含就行,不再乎位置
       // 如果有具有关联性的数据
       callBackArr.push(item); // 就存到callBackArr里面准备返回呈现
      }
     });
     // 经过这么一波查询操作以后,如果这个数组还为空,说明没有查询到具有关联的数据,就直接返回给用户暂无数据
     if (callBackArr.length == 0) {
      cb([{ value: "暂无数据", price: "暂无数据" }]);
     }
     // 如果经过这一波查询操作以后,找到数据了,就把装有关联数据的数组callBackArr呈现给用户
     else {
      cb(callBackArr);
     }
    }, 1000);
   }
  },
  // 点击谁,就把谁放进去
  handleSelect(item) {
   this.fruit = []
   this.fruit.push(item)
  },
 },
};
</script>

总结

两种都差不多,就是请求数据、拿数据、加工过滤数据、呈现数据。本文中的案例是,模糊查询过滤筛选数据是前端来做的,当然也可以让后端来做,具体做项目的时候,可以和后端商量。

到此这篇关于Element-ui 自带的两种远程搜索(模糊查询)用法讲解的文章就介绍到这了,更多相关Element-ui 模糊查询内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
jQuery下的几个你可能没用过的功能
Aug 29 Javascript
js列举css中所有图标的实现代码
Jul 04 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
jQuery实现dialog设置focus焦点的方法
Jun 10 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
JS实现的跨浏览器解析XML文件实例
Jun 21 Javascript
js 动态生成html 触发事件传参字符转义的实例
Feb 14 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
Nov 13 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
小程序实现列表倒计时功能
Jan 29 #Javascript
JS相册图片抖动放大展示效果的示例代码
Jan 29 #Javascript
vue监听键盘事件的相关总结
Jan 29 #Vue.js
javascript实现拼图游戏
Jan 29 #Javascript
JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法
Jan 29 #Javascript
Javascript实现打鼓效果
Jan 29 #Javascript
JS实现点击掉落特效
Jan 29 #Javascript
You might like
php修改时间格式的代码
2011/05/29 PHP
PHP number_format() 函数定义和用法
2012/06/01 PHP
PHP中使用file_get_contents post数据代码例子
2015/02/13 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
php抽象类和接口知识点整理总结
2019/08/02 PHP
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
ajax提交表单实现网页无刷新注册示例
2014/05/08 Javascript
jquery bind(click)传参让列表中每行绑定一个事件
2014/08/06 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
基于javascript实现贪吃蛇经典小游戏
2020/04/10 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
python使用magic模块进行文件类型识别方法
2018/12/08 Python
使用python画社交网络图实例代码
2019/07/10 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
tensorflow实现二维平面模拟三维数据教程
2020/02/11 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
CSS3基础(RGBa、text-shadow、box-shadow、border-radius)
2012/11/13 HTML / CSS
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
企业活动策划方案
2014/06/02 职场文书
视光学专业自荐信
2014/06/24 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
作弊检讨书
2015/01/27 职场文书
建党伟业观后感
2015/06/01 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
Java 异步任务计算FutureTask
2022/04/28 Java/Android