基于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 相关文章推荐
用JavaScript实现UrlEncode和UrlDecode的脚本代码
Jul 23 Javascript
屏蔽script注入小例子
Nov 12 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
Nov 13 Javascript
JavaScript替换当前页面的方法
Apr 03 Javascript
jQuery插件StickUp实现网页导航置顶
Apr 12 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
Javascript闭包实例详解
Nov 29 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
Jan 17 Javascript
BootStrap selectpicker
Jun 20 Javascript
React组件内事件传参实现tab切换的示例代码
Jul 04 Javascript
selenium 反爬虫之跳过淘宝滑块验证功能的实现代码
Aug 27 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
ThinkPHP上使用多说评论插件的方法
2014/10/31 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
js实现日期级联效果
2014/01/23 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
knockoutjs动态加载外部的file作为component中的template数据源的实现方法
2016/09/01 Javascript
Bootstrap3多级下拉菜单
2017/02/24 Javascript
Vux+Axios拦截器增加loading的问题及实现方法
2018/11/08 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
nodejs二进制与Buffer的介绍与使用
2019/07/11 NodeJs
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
在Python的Django框架中使用通用视图的方法
2015/07/21 Python
pandas去重复行并分类汇总的实现方法
2019/01/29 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
详解Python中pyautogui库的最全使用方法
2020/04/01 Python
python怎么自定义捕获错误
2020/06/29 Python
Django ModelForm组件原理及用法详解
2020/10/12 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
肯尼亚网上商城:Kilimall
2016/08/20 全球购物
Hotels.com日本:国外和海外住宿,酒店预订
2019/12/13 全球购物
办公室经理岗位职责
2014/01/01 职场文书
优秀教师工作感言
2014/02/16 职场文书
王老吉广告词
2014/03/20 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
唐山大地震的观后感
2015/06/05 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
珍惜时间的诗歌赏析
2019/08/23 职场文书
python 命令行传参方法总结
2021/05/25 Python