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 相关文章推荐
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
Mar 12 Javascript
关于jQuery中的end()使用方法
Jul 10 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
Jan 23 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
Oct 17 Javascript
javasript实现密码的隐藏与显示
May 08 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
Backbone.js框架中简单的View视图编写学习笔记
Feb 14 Javascript
JS库 Highlightjs 添加代码行号的实现代码
Sep 13 Javascript
Three.js开发实现3D地图的实践过程总结
Nov 20 Javascript
解决vue keep-alive 数据更新的问题
Sep 21 Javascript
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
JS制作简易计算器的实例代码
Jul 04 Javascript
小程序实现列表倒计时功能
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 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
浅析php单例模式
2014/11/25 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
Express与NodeJs创建服务器的两种方法
2017/02/06 NodeJs
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
JS实现小米轮播图
2020/09/21 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
详解Python当中的字符串和编码
2015/04/25 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
python中的错误处理
2016/04/10 Python
Python实现的中国剩余定理算法示例
2017/08/05 Python
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
Python File(文件) 方法整理
2019/02/18 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
《美丽的小路》教学反思
2014/02/26 职场文书
计算机专业职业规划
2014/02/28 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
小人国观后感
2015/06/11 职场文书
财务年终工作总结大全
2019/06/20 职场文书
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
python利用while求100内的整数和方式
2021/11/07 Python
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang