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( e v e n t ) " , 有 些 人 会 好 奇 , 这 个 event)",有些人会好奇,这个 event)"event是一个什么东西,其实就是一个事件,代码

if (event) {
     event.target.blur();
     this.$refs.autocomplete.close();
}

这个是为了处理点击enter使input输入框失去焦点,还有一个作用就是,让el-autocomplete 的联想输入框关闭。这个达到和百度搜索类似的效果。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3.0 是一款流行的 JavaScript 框架,而 el-autocomplete 则是一款基于 Vue.js 的自动完成组件,用于输入框的自动补全功能。下面是使用 Vue 3.0 和 el-autocomplete 实现自动补全功能的简单示例: 首先,你需要在项目中安装 el-autocomplete 组件: ```bash npm install element-ui el-autocomplete -S ``` 然后,在你的 Vue 组件中引入 el-autocomplete 组件,并在模板中使用: ```html <template> <div> <el-autocomplete v-model="inputValue" :fetch-suggestions="querySearchAsync" placeholder="请输入内容" @select="handleSelect" ></el-autocomplete> </div> </template> <script> import { ref } from 'vue'; import { fetchSearchResult } from '@/api'; export default { name: 'MyComponent', setup() { const inputValue = ref(''); const querySearchAsync = async (queryString, callback) => { const res = await fetchSearchResult(queryString); if (res.code === 200) { callback(res.data); } }; const handleSelect = (item) => { console.log(item); }; return { inputValue, querySearchAsync, handleSelect, }; }, }; </script> ``` 上面的代码中,我们使用了 Vue 3.0 的 Composition API,通过 `ref` 创建了一个响应式变量 `inputValue`,用于存储输入框的值。`querySearchAsync` 函数用于异步获取搜索结果,该函数会在用户每次输入时被调用。`handleSelect` 函数会在用户选择某个搜索结果时被调用。 这里的 `fetchSearchResult` 函数是一个异步函数,用于从后端获取搜索结果。你需要根据你的项目实际情况来实现该函数。 至此,我们已经完成了使用 Vue 3.0 和 el-autocomplete 实现自动补全功能的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值