基于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 相关文章推荐
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
JavaScript学习笔记记录我的旅程
May 23 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
Sep 04 Javascript
javascript检测是否联网的实现代码
Sep 28 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
Jan 23 Javascript
原生js实现autocomplete插件
Apr 14 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
Dec 11 Javascript
微信小程序实现即时通信聊天功能的实例代码
Aug 17 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
Jan 08 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
May 28 Javascript
JavaScript 获取滚动条位置并将页面滑动到锚点
Feb 08 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
php中执行系统命令的方法
2015/03/21 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
Node.js发送HTTP客户端请求并显示响应结果的方法示例
2017/04/12 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
如何用原生js写一个弹窗消息提醒插件
2019/05/24 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python去除列表中重复元素的方法
2015/03/20 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
Django如何批量创建Model
2020/09/01 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
电子专业求职信
2014/06/19 职场文书
党的群众路线教育实践活动督导组工作情况汇报
2014/10/28 职场文书
团员个人总结
2015/02/26 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS