通过表单自动完成
Autocomplete through form
我打算使用 remix.run 构建自动完成功能,但后来我想到,在每次提交后 select/focus 将过于依赖路由和表单来输入,这无法产生良好的用户体验。用户将在表单中输入一些东西,表单被提交,他等待响应,然后输入再次聚焦,这里的 ux 是 instantsearch/autocomplete.
您需要的是 useFetcher
挂钩 Remix 导出。这个钩子可以让你从任何路由的加载器中获取数据而不会导致导航,它是为这种 UI 添加的。
import { Form, useFetcher } from "remix"
export default function Screen() {
let fetcher = useFetcher()
function handleChange(event) {
let value = event.currentTarget.value
// load data from a route with a loader
fetcher.load(`/api/autocomplete?query=${value}`)
}
return (
<Form>
<input type="text" onChange={handleChange} list="suggestions" />
<datalist id="suggestions">
{fetcher.data.map(item => {
return <option key={item.id} value={item.value} />
})}
</datalist>
</Form>
)
}
类似的东西,在你使用提取器加载的端点中导出加载器
export async function loader({ request }) {
let url = new URL(request.url)
let query = url.searchParams.get("query") ?? "";
let data = await getData(query)
return json(data)
}
我打算使用 remix.run 构建自动完成功能,但后来我想到,在每次提交后 select/focus 将过于依赖路由和表单来输入,这无法产生良好的用户体验。用户将在表单中输入一些东西,表单被提交,他等待响应,然后输入再次聚焦,这里的 ux 是 instantsearch/autocomplete.
您需要的是 useFetcher
挂钩 Remix 导出。这个钩子可以让你从任何路由的加载器中获取数据而不会导致导航,它是为这种 UI 添加的。
import { Form, useFetcher } from "remix"
export default function Screen() {
let fetcher = useFetcher()
function handleChange(event) {
let value = event.currentTarget.value
// load data from a route with a loader
fetcher.load(`/api/autocomplete?query=${value}`)
}
return (
<Form>
<input type="text" onChange={handleChange} list="suggestions" />
<datalist id="suggestions">
{fetcher.data.map(item => {
return <option key={item.id} value={item.value} />
})}
</datalist>
</Form>
)
}
类似的东西,在你使用提取器加载的端点中导出加载器
export async function loader({ request }) {
let url = new URL(request.url)
let query = url.searchParams.get("query") ?? "";
let data = await getData(query)
return json(data)
}