element的el-autocomplete组件的使用(模糊匹配、自定义模板、远程搜索)

一、代码实现

<template>
    <div>
        <!-- trigger-on-focus 是否在输入框 focus 时显示建议列表 -->
        <!-- autocomplete 是一个可带输入建议的输入框组件,fetch-suggestions 是一个返回输入建议的方法属性,如 querySearch(queryString, cb),
        在该方法中你可以在你的输入建议数据准备好时通过 cb(data) 返回到 autocomplete 组件中。 -->
        <!-- fetch-suggestions 返回输入建议的方法,仅当你的输入建议数据 resolve 时,通过调用 callback(data:[]) 来返回它 -->
        <el-row class="demo-autocomplete">
            <el-col :span="24">
                <div class="sub-title">激活即列出输入建议</div>
                <el-autocomplete class="inline-input" v-model="state1" :fetch-suggestions="querySearch" placeholder="请输入内容"
                    @select="handleSelect"></el-autocomplete>
            </el-col>
            <el-col :span="24">
                <div class="sub-title">输入后匹配输入建议</div>
                <el-autocomplete class="inline-input" v-model="state2" :fetch-suggestions="querySearch" placeholder="请输入内容"
                    :trigger-on-focus="false" @select="handleSelect"></el-autocomplete>
            </el-col>
            <el-col :span="24">
                <div class="sub-title">自定义模板</div>
                <el-autocomplete class="inline-input" v-model="state3" :fetch-suggestions="querySearch" placeholder="请输入内容"
                    :trigger-on-focus="true" @select="handleSelect">
                    <i class="el-icon-edit el-input__icon" slot="suffix" @click="handleIconClick">
                    </i>
                    <template slot-scope="{ item }">
                        <div class="name">{{ item.value }}</div>
                        <span class="addr" style="color:#b4b4b4;">{{ item.address }}</span>
                    </template>
                </el-autocomplete>
            </el-col>
            <el-col :span="24">
                <div class="sub-title">远程搜索</div>
                <el-autocomplete v-model="state4" :fetch-suggestions="querySearchAsync" placeholder="请输入内容"
                    @select="handleSelect"></el-autocomplete>
            </el-col>
        </el-row>
    </div>
</template>
<script>
export default {
    name: 'AutoComplete',
    data() {
        return {
            restaurants: [],
            state1: '',
            state2: '',
            state3: '',
            state4: '',
        };
    },
    mounted() {
        this.restaurants = this.loadAll();
    },
    methods: {
        // 获取数据
        loadAll() {
            return [
                { "value": "三全鲜食(北新泾店)", "address": "长宁区新渔路144号" },
                { "value": "Hot honey 首尔炸鸡(仙霞路)", "address": "上海市长宁区淞虹路661号" },
                { "value": "新旺角茶餐厅", "address": "上海市普陀区真北路988号创邑金沙谷6号楼113" },
                { "value": "泷千家(天山西路店)", "address": "天山西路438号" },
                { "value": "胖仙女纸杯蛋糕(上海凌空店)", "address": "上海市长宁区金钟路968号1幢18号楼一层商铺18-101" },
                { "value": "贡茶", "address": "上海市长宁区金钟路633号" },
            ];
        },
        querySearch(queryString, callback) {
            console.log(queryString, 'queryString')
            var restaurants = this.restaurants;
            var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
            // 调用 callback 返回建议列表的数据
            callback(results);
        },
        // 根据queryString进行筛选
        createFilter(queryString) {
            return (restaurant) => {
                return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
            };
        },
        // 选中
        handleSelect(item) {
            console.log(item);
        },
        // 点击图标
        handleIconClick(ev) {
            console.log(ev, 'ev');
        },
        // ---------------------------------------------远程搜索相关------------------------------------

        querySearchAsync(queryString, cb) {
            var restaurants = this.restaurants;
            var results = queryString ? restaurants.filter(this.createStateFilter(queryString)) : restaurants;

            // 实际项目,从接口获取数据
            clearTimeout(this.timeout);
            this.timeout = setTimeout(() => {
                cb(results);
            }, 3000 * Math.random());
        },
        createStateFilter(queryString) {
            return (state) => {
                return (state.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
            };
        },
    },
}
</script>

<style scoped>
.sub-title{
    margin-top: 10px;
    margin-bottom: 10px;
}
</style>

二、效果图

在这里插入图片描述

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值