基于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 相关文章推荐
用roll.js实现的图片自动滚动+鼠标触动的特效
Mar 18 Javascript
自写的一个jQuery圆角插件
Oct 26 Javascript
js用正则表达式来验证表单(比较齐全的资源)
Nov 17 Javascript
js中Math之random,round,ceil,floor的用法总结
Dec 26 Javascript
JQuery遍历json数组的3种方法
Nov 08 Javascript
JS仿Windows开机启动Loading进度条的方法
Feb 26 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
javascript实现网页字符定位的方法
Jul 14 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
谈一谈javascript中继承的多种方式
Feb 19 Javascript
bing Map 在vue项目中的使用详解
Apr 09 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
Dec 06 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目录管理函数小结
2008/09/10 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
php类中private属性继承问题分析
2012/11/01 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP实现验证码校验功能
2017/11/16 PHP
Jquery 扩展方法
2010/05/06 Javascript
JQuery拖拽元素改变大小尺寸实现代码
2012/12/10 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
深入解析JavaScript中函数的Currying柯里化
2016/03/19 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
jQuery webuploader分片上传大文件
2016/11/07 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
详谈js对url进行编码和解码(三种方式的区别)
2017/08/16 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
Python tempfile模块学习笔记(临时文件)
2014/05/25 Python
介绍Python的@property装饰器的用法
2015/04/28 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
国庆节文艺活动方案
2014/02/03 职场文书
公司投资建议书
2014/05/16 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis