【发布时间】:2022-03-12 22:52:25
【问题描述】:
我有一个带有搜索字段的页面。如果使用查询参数(例如?word=cat)访问,则页面应加载显示结果并填充搜索字段。如果完成搜索,结果和查询参数(浏览器历史记录)应该会更新。
我发现更新查询参数的唯一方法是goto,所以我的尝试是:
<script context="module">
export async function load({ page, fetch }) {
const response = await fetch(`/data.json?${page.query.toString()}`)
if (response.ok) {
return {
props: {
word: page.query.get('word'),
body: await response.json()
}
}
}
}
</script>
<script>
import { goto } from '$app/navigation'
import { page } from '$app/stores'
export let word
export let body
function search() {
$page.query.set('word', word)
goto(`?${$page.query.toString()}`)
}
</script>
<main>
<form on:submit|preventDefault={search}>
<input bind:value={word}>
</form>
<!-- ... -->
</main>
这可行,但有时仅更新查询参数就卡住了。出于某种原因,load 在这些情况下不会被调用。我可以通过在goto 之前为 URL 添加await invalidate 来使其可靠地工作,但现在load 总是被调用两次,并且搜索字段很快就会翻转回旧值。
我刚开始使用 Svelte/SvelteKit,所以我的方法可能是错误的。感谢您的帮助。
【问题讨论】:
-
尝试删除
$page.query.set行并简单地使用goto就足够了 -
谢谢,我用单独的
URLSearchParams替换了它,它可以工作。