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利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
js获取input标签的输入值实现代码
Aug 05 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
Nov 27 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
Apr 06 Javascript
js实现图片轮播效果学习笔记
Jul 26 Javascript
vue移动端路由切换实例分析
May 14 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
Oct 16 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
Nov 11 Javascript
vue-cli项目使用mock数据的方法(借助express)
Apr 15 Javascript
js回调函数原理与用法案例分析
Mar 04 Javascript
使用vue实现HTML页面生成图片的方法
Mar 12 Javascript
vue实现移动端拖动排序
Aug 21 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
Terran历史背景
2020/03/14 星际争霸
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP对象相关知识总结
2017/04/09 PHP
Javascript闭包(Closure)详解
2015/05/05 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
JavaScript实现身份证验证代码
2016/02/17 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
详细讲解用Python发送SMTP邮件的教程
2015/04/29 Python
python中的格式化输出用法总结
2016/07/28 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
pytorch中的inference使用实例
2020/02/20 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
python如何快速拼接字符串
2020/10/28 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
家长会演讲稿范文
2014/01/10 职场文书
学校花圃的标语
2014/06/18 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
房屋买卖委托书格式范本格式
2014/10/13 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS