useRemoteSearch
远程搜索 - 通常用于下拉选项(Select)
使用
基本使用
默认情况下会使用 @vueuse/core 下的 useFetch 来发送 POST 请求获取远程搜索数据。
data对象包含请求的结果;loading对象将指示请求是否正在加载;onRemoteSearch函数用于传入输入的值并进行远程搜索调用。
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({ url })import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({ url })由于默认是 POST 请求,请求参数的属性默认是 name,当然,也可以通过 requestKey 来覆盖:
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
requestKey: 'value'
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
requestKey: 'value'
})在这种情况下,请求参数会是如下格式:
{
"value": "<input>"
}{
"value": "<input>"
}支持 GET 请求
对于 GET 请求会在调用 onRemoteSearch 函数时将请求参数拼接到 url 上。
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
fetchOptions: { method: 'GET' }
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
fetchOptions: { method: 'GET' }
})支持额外的请求参数
有时,会在搜索时附加额外参数,这里可以通过 extraData 来指定:
extraData 可以是一个对象,也可以是一个 ref 或 compute。
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
extraData: {
belongToId: '<uuid>'
}
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
extraData: {
belongToId: '<uuid>'
}
})在这种情况下,请求参数会是如下格式:
{
"name": "<input>",
"belongToId": "<uuid>"
}{
"name": "<input>",
"belongToId": "<uuid>"
}自定义响应结果处理
对于响应结果,也许有不同的格式,这里通常认为是一个对象格式的,其中返回的数据应该通过 data 来承载。如果不是 data 可以通过 responseKey 来做控制。
这里也做了一些兼容处理:
- 如果不是
data会尝试用result - 如果直接返回了一个数组,则直接当做响应结果返回。
当然了,可能还会有数据格式上的不同,对于下拉选项组件,通常是 label 和 value 作为 props 的。如果响应的数据是其他的属性,可以通过 kvOrCb 来做设置。
如果只是属性上的不同,比如返回的数据格式是 [{ "name": "<name>", "id": "<id>" }] ,那么会帮你转换为 label 和 value 的格式:
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
kvOrCb: ['name', 'id']
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
kvOrCb: ['name', 'id']
})在这种情况下,将返回如下格式:
[
{ "label": "<name>", "value": "<id>" }
][
{ "label": "<name>", "value": "<id>" }
]如果你想自己去处理响应结果,kvOrCb 也支持回调函数的格式,其中回调函数的参数 result 为响应结果:
处理后的结果会赋值给
useRemoteSearch返回的data
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
kvOrCb: (result) => {
return []
}
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
kvOrCb: (result) => {
return []
}
})首次自动请求
在某些场景下,下拉选项会需要默认展示一些数据,在这种情况下可以通过 firstAutoSearch 来进行一次自动请求,需要说明的是,此时的搜索值为空字符串。
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
firstAutoSearch: true
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
firstAutoSearch: true
})自定义 fetch
默认的 useFetch 并不能很好的应对一些场景,比如出现服务器异常的情况。
比较好的实践是在项目中对 useFetch 统一封装,覆盖请求的通用场景。
import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
fetcher: myUseFetch,
// fetcherOptions: {} // 指定 fetcher 参数项
})import { useRemoteSearch } from '@zuks/core'
const { data, loading, onRemoteSearch } = useRemoteSearch({
url,
fetcher: myUseFetch,
// fetcherOptions: {} // 指定 fetcher 参数项
})类型声明
export interface UseRemoteSearchOptions<T, U> {
/**
* 请求地址
*/
url: MaybeRefOrGetter<string>
/**
* 请求参数属性
*
* @default 'name'
*/
requestKey?: string
/**
* 响应结果属性
*
* @default 'data'
*/
responseKey?: string
/**
* 额外的请求数据
*/
extraData?: MaybeRefOrGetter<Record<string, any>>
/**
* 响应格式处理
*/
kvOrCb?: KvOrCb<T, U>
/**
* 首次自动搜索
*
* @default false
*/
firstAutoSearch?: boolean
/**
* 自定义 fetch
*
* @default useFetch
*/
fetcher?: typeof useFetch
/**
* 自定义 fetch 参数
*/
fetcherOptions?: UseFetchOptions
/**
* fetch 参数
*/
fetchOptions?: RequestInit
}
export declare function useRemoteSearch<
T extends Record<string, any>,
U = LabelValue,
>(
options: UseRemoteSearchOptions<T, U>,
): {
data: ShallowRef<U[]>
loading: Ref<boolean>
onRemoteSearch: (query: string) => Promise<UseFetchReturn<T> | undefined>
}
export type UseRemoteSearchReturn = ReturnType<typeof useRemoteSearch>export interface UseRemoteSearchOptions<T, U> {
/**
* 请求地址
*/
url: MaybeRefOrGetter<string>
/**
* 请求参数属性
*
* @default 'name'
*/
requestKey?: string
/**
* 响应结果属性
*
* @default 'data'
*/
responseKey?: string
/**
* 额外的请求数据
*/
extraData?: MaybeRefOrGetter<Record<string, any>>
/**
* 响应格式处理
*/
kvOrCb?: KvOrCb<T, U>
/**
* 首次自动搜索
*
* @default false
*/
firstAutoSearch?: boolean
/**
* 自定义 fetch
*
* @default useFetch
*/
fetcher?: typeof useFetch
/**
* 自定义 fetch 参数
*/
fetcherOptions?: UseFetchOptions
/**
* fetch 参数
*/
fetchOptions?: RequestInit
}
export declare function useRemoteSearch<
T extends Record<string, any>,
U = LabelValue,
>(
options: UseRemoteSearchOptions<T, U>,
): {
data: ShallowRef<U[]>
loading: Ref<boolean>
onRemoteSearch: (query: string) => Promise<UseFetchReturn<T> | undefined>
}
export type UseRemoteSearchReturn = ReturnType<typeof useRemoteSearch>