搜索需求:
搜索框为空,默认展示下面的搜索历史,隐藏搜索列表
如果用户输入搜索内容:
有搜索结果展示:搜索结果,
没有搜索结果展示:暂无搜索内容
点击搜索列表的选项,自动填充到搜索框
具体代码如下:
封装防抖截流函数:
/**
*
* @param {*} fn
* @param {*} delay
*
* 节流函数throttle:在delay时间内,时间只触发一次
* 防抖函数:在delay时间后,输入完成后多长时间才会触发一次;如果在输入时间内,用户再次输入就会重新计时
*/
function throttle (fn, delay) {
var t = null,
begin = new Date().getTime();
return function () {
var _self = this,
args = arguments,
cur = new Date().getTime();
clearTimeout(t);
if (cur - begin >= delay) {
fn.apply(_self, args);
begin = cur;
} else {
t = setTimeout(function () {
fn.apply(_self, args)
}, delay);
}
}
}
export {
throttle
}
搜索功能
<template>
<div class="wrap">
<input
v-model="input_value"
type="text"
placeholder="请搜索"
@keyup="searchAction"
ref="input"
/>
<ul v-show="isShow">
<li
v-for="(item, index) of searchRes"
:key="index"
@click="choose(item.name)"
>
<div>{{ item.name }}</div>
</li>
</ul>
<div v-show="!isShow && !isClick && input_value.length == 0">搜索历史</div>
<div v-if="searchRes.length == 0 && input_value.length > 0">
暂无搜索结果
</div>
</div>
</template>
<script type="text/javascript">
import { throttle } from '@/libs/utils';
export default {
data () {
return {
searchRes: [], // 搜索的结果
CourseData: [
{name: '北京1'},
{name: '上海1'},
{name: '广州2'},
{name: '深圳3'}
], // 搜索联想,这里可以请求接口拿数据
input_value: '', // 输入框的值
isClick: false, // 是否点击搜索项
isShow: false // 是否展示数据列表
}
},
methods: {
// 选择列表选项
choose (props) {
this.isClick = true;
this.isShow = false;
this.input_value = props
},
// 搜索功能:节流函数
searchAction: throttle(function (e) {
//拿到当前input输入框输入的值
this.input_value = this.$refs.input.value;
//判断展示ul列表,如果输入了就展示没输入就不展示
this.isClick = this.isShow = this.input_value.length > 0 ? true : false
// 搜索的结果
this.searchRes = this.CourseData.filter((item) => {
if (item.name.includes(e.target.value)) {
return item;
}
})
}, 300)
}
}
</script>
<style lang="less" scoped>
</style>
原文链接:前端实现模糊查询