如何在 SvelteKit 中更新页面和查询参数?

How to update the page and query parameters in SvelteKit?

我有一个带有搜索字段的页面。如果使用查询参数(例如 ?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,所以我的方法可能是错误的。感谢您的帮助。

我在触发 load 函数时遇到了类似的问题,我通过创建 URLSeachParams 的新实例并导航到这些新参数来解决它。

let query = new URLSearchParams($page.query.toString());

query.set('word', word);
    
goto(`?${query.toString()}`);

更短的方法:

$page.query.set('word',word); 
goto(`?${$page.query.toString()}`);

$page.query 不再可用,因为它已被 $page.url 取代(在 @sveltejs/kit@1.0.0-next.208 中)。

现在,它是这样完成的:

$page.url.searchParams.set('word',word); 
goto(`?${$page.url.searchParams.toString()}`);

$pagegoto() 您可以从:

import { goto } from "$app/navigation";
import { page } from "$app/stores";