# 输入即搜索
这个功能目标有三点:
- 输入即联想搜索(不用点按钮)
- 不能太频繁请求接口(防抖)
- 必须在“停止输入一段时间后”才触发搜索
用 watch + debounce,或者直接用 @vueuse/core 的 watchDebounced / useDebounceFn 是最优解
<template>
<el-input
v-model="keyword"
placeholder="请输入关键字搜索"
clearable
/>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { watchDebounced } from '@vueuse/core'
const keyword = ref('')
const fetchTableData = async (val: string) => {
console.log('搜索请求:', val)
// await api({ keyword: val, page: 1 })
}
watchDebounced(
keyword,
(val) => {
fetchTableData(val)
},
{
debounce: 500, // 停止输入 500ms 后触发
maxWait: 1000, // 最多 1s 一定会触发一次(可选)
}
)
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
maxWait有什么用
不管你一直输个不停,最长等
maxWait这么久,也必须触发一次回调