基于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 相关文章推荐
基于jquery的让页面控件不可用的实现代码
Apr 27 Javascript
30个最佳jQuery Lightbox效果插件分享
Apr 11 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
Jun 05 Javascript
Bootstrap3制作图片轮播效果
May 12 Javascript
微信小程序 navigation API实例详解
Oct 02 Javascript
浅述节点的创建及常见功能的实现
Dec 15 Javascript
vue项目实战总结篇
Feb 11 Javascript
深入浅出理解JavaScript高级定时器原理与用法
Aug 02 Javascript
获取layer.open弹出层的返回值方法
Aug 20 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
Dec 03 Javascript
微信小程序—setTimeOut定时器的问题及解决
Jul 26 Javascript
jQuery中DOM常见操作实例小结
Aug 01 jQuery
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共享内存段示例分享
2014/01/20 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
jQuery中:lt选择器用法实例
2014/12/29 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[02:36]DOTA2混沌骑士 英雄基础教程
2013/11/26 DOTA
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python中如何获取类属性的列表
2016/12/26 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
python 常见的反爬虫策略
2020/09/27 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
详解matplotlib绘图样式(style)初探
2021/02/03 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
Why we need EJB
2016/10/20 面试题
美术专业学生个人自我评价
2013/09/19 职场文书
行政助理岗位职责
2013/11/10 职场文书
铲车司机岗位职责
2014/03/15 职场文书
运动会演讲稿50字
2014/08/25 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
工作经历证明书范文
2014/11/02 职场文书
刑事附带民事代理词
2015/05/25 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
Python max函数中key的用法及原理解析
2021/06/26 Python