基于Vue el-autocomplete 实现类似百度搜索框功能


Posted in Javascript onOctober 25, 2019

效果图如下所示:

基于Vue el-autocomplete 实现类似百度搜索框功能

首先上代码

<template>
  <div class="assets-search height-all">
    <div class="search-layout">
      <div class="search-title">让数据触手可及</div>
      <div class="search-input-layout">
        <!--<el-input class="search-input" placeholder="检索数据"
             @keyup.enter.native="searchAssets($event)"
             v-model="searchContent">
          <el-button style="color: white"
                @click="searchAssets(searchContent)"
                slot="append">搜 索</el-button>
        </el-input>-->
        <el-autocomplete
          class="inline-input search-input"
          v-model="searchContent"
          ref="autocomplete"
          :fetch-suggestions="requestDoSuggest"
          placeholder="请输入您需要检索资源名称或者中文"
          @keyup.enter.native="searchAssets($event)"
          :trigger-on-focus="false"
          @select="handleSelect"
        >
          <el-button @click="searchAssets" slot="append">搜 索</el-button>
        </el-autocomplete>
        <div class="search-word-layout" v-show="searchWordList.length">
          <span class="search-word-title">热门搜索:</span>
          <div class="search-word-list">
            <span class="search-word"
                v-for="(item, index) in searchWordList"
                @click="clickHotWord(item)"
                :key="index">{{item}}</span>
          </div>
        </div>
      </div>
      <el-button v-if="false" class="db-number-layout">{{`资产库:${ddNumber}`}}</el-button>
    </div>
  </div>
</template>
<script>
  import {mapActions } from 'vuex';
  export default {
    name: "search",
    created() {
      this.requestHotWord();
    },
    data() {
      return {
        searchContent:'',
        ddNumber:3445,
        searchWordList:[],
        hotWordSize:5,
      }
    },
    methods:{
      ...mapActions(['_AJAX']),
      /**
       * 点击热词搜索
       */
      clickHotWord(item) {
        this.searchContent = item;
        this.searchAssets();
      },
      /**
       * 跳转到搜索结果页面
       */
      searchAssets(event) {
        if (event) {
          event.target.blur();
          this.$refs.autocomplete.close();
        }
        let viewRoute = this.$router.resolve({
          path: '/assets/searchResult',
          query: {
            searchContent: this.searchContent,
          }
        });
        window.open(viewRoute.href, '_blank');
      },
      /**
       * 自动补全
       */
      requestDoSuggest(queryString, cb) {
        let params = {
          url: 'esSearch.doSuggest',
          data: {
            input: queryString,
            size:4,
          },
          method: 'GET'
        };
        this._AJAX(params)
          .then(res => {
            let list = res.result.map((item)=>{
              return {value:item}
            })
            cb(list);
          })
      },
      /**
       * 选择联想出来的数据
       */
      handleSelect(item) {
        this.searchContent = item.value;
        this.searchAssets();
      },
      /**
       * 请求热词列表
       */
      requestHotWord() {
        let params = {
          url: 'esSearch.queryHotWord',
          data: {
            size:this.hotWordSize,
          },
          method: 'GET'
        };
        this._AJAX(params)
          .then(res => {
            this.searchWordList = res.result;
          })
      }
    },
  }
</script>
<style lang="scss">
  .assets-search {
    display: flex;
    flex-direction: column;
    justify-content: center;
    background: #6ba9ec;
    .search-layout{
      text-align: center;
      .search-title{
        font-size: 50px;
        color: white;
        font-weight: bold;
        padding-bottom: 40px;
      }
      .search-input-layout{
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;
        .search-input{
          width: 50%;
        }
        .search-word-layout{
          text-align: left;
          width: 50%;
          padding: 15px;
          display: flex;
          flex-direction: row;
          align-items: center;
          .search-word-title{
            font-size: 15px;
            color: white;
          }
          .search-word-list{
            span:hover{
              color: #666666;
            }
          }
          .search-word{
            font-size: 15px;
            color: white;
            padding-right: 10px;
            cursor: pointer;
          }
        }
      }
      .db-number-layout{
        margin-top: 80px;
      }
    }
    .el-input-group--append .el-input__inner {
      border-radius: 0;
      height: 48px;
      line-height: 48px;
    }
    .el-input-group__append {
      background: $color-assist;
      border-color: $color-assist;
      border-radius: 0;
      color: white;
    }
  }
</style>

注意的细节

基础使用

fetch-suggestions 这个方法是去请求包含关键字的搜索功能,这里注意返回结果里面的列表对象属性里面要有一个value的属性,这个才能显示,联想输入内容。

select 方法是选择了一个联想输入的具体数据的点击事件

注意事项

按enter键进行搜索功能@keyup.enter.native="searchAssets(event)",有些人会好奇,这个 event)",有些人会好奇,这个event)",有些人会好奇,这个event是一个什么东西,其实就是一个事件,代码

if (event) {
   event.target.blur();
   this.$refs.autocomplete.close();
}

这个是为了处理点击enter使input输入框失去焦点,还有一个作用就是,让el-autocomplete 的联想输入框关闭。这个达到和百度搜索类似的效果。

总结

以上所述是小编给大家介绍的基于Vue el-autocomplete 实现类似百度搜索框功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JS 密码强度验证(兼容IE,火狐,谷歌)
Mar 15 Javascript
javascript 常用功能总结
Mar 18 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
Apr 08 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
IE和Firefox之间在JavaScript语法上的差异
Apr 22 Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
Jul 11 Javascript
JavaScript实现窗口抖动效果
Oct 19 Javascript
Vue.js tab实现选项卡切换
May 16 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 jQuery
vue配置文件实现代理v2版本的方法
Jun 21 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 Javascript
vue实现评论列表功能
Oct 25 #Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 #Javascript
浅谈layui 表单元素的选中问题
Oct 25 #Javascript
layUI的验证码功能及校验实例
Oct 25 #Javascript
layui点击按钮页面会自动刷新的解决方案
Oct 25 #Javascript
详解node登录接口之密码错误限制次数(含代码)
Oct 25 #Javascript
Vue 用Vant实现时间选择器的示例代码
Oct 25 #Javascript
You might like
php adodb连接不同数据库
2009/03/19 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
YII分模块加载路由的实现方法
2018/10/01 PHP
js中几种去掉字串左右空格的方法
2006/12/25 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
javascript nextSibling 与 getNextElement(node) 使用介绍
2011/10/13 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
jquery制作弹窗提示窗口代码分享
2014/03/02 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
2015/08/25 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
复杂的javascript窗口分帧解析
2016/02/19 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
AngularJs  Creating Services详解及示例代码
2016/09/02 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python实现基于POS算法的区块链
2018/08/07 Python
Python程序暂停的正常处理方法
2019/11/07 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
工程部经理岗位职责
2013/12/08 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
党员检讨书
2014/10/13 职场文书
小组组名及励志口号
2015/12/24 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android