基于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里的prototype使用示例
Nov 19 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
javascript制作的cookie封装及使用指南
Jan 02 Javascript
js实现两点之间画线的方法
May 12 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
Jun 13 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
微信小程序wx.previewImage预览图片实例详解
Dec 07 Javascript
Angularjs实现页面模板清除的方法
Jul 20 Javascript
小程序获取周围IBeacon设备的方法
Oct 31 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 Javascript
深入浅析vue全局环境变量和模式
Apr 28 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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中的类-什么叫类
2006/11/20 PHP
php上的memcache和memcached两个pecl库
2010/03/29 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
python通过ssh-powershell监控windows的方法
2015/06/02 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
python连接PostgreSQL过程解析
2020/02/09 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
Expedia印度:您的一站式在线旅游网站
2017/08/24 全球购物
印度在线杂货店:bigbasket
2018/08/23 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
机电一体化求职信
2014/03/10 职场文书
三年级学生评语大全
2014/12/26 职场文书
Win11怎么启动任务管理器?Win11启动任务管理器的几种方法
2021/11/23 数码科技