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

Ste*_*fen 17 svelte 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>
Run Code Online (Sandbox Code Playgroud)

这可行,但有时会因为更新查询参数而陷入困境。由于某种原因,load在这些情况下不会被调用。我可以通过await invalidate在 , 之前添加 URL 来让它可靠地工作goto,但 nowload总是被调用两次,并且搜索字段很快就会翻转回旧值。

我刚刚开始使用 Svelte/SvelteKit,所以我的方法可能是错误的。谢谢你的帮助。

Jar*_*ino 21

我有类似的问题触发load功能,我通过创建新实例URLSearchParams并导航到这些新参数来解决它。

let query = new URLSearchParams($page.url.searchParams.toString());
    
query.set('word', word);
        
goto(`?${query.toString()}`);
Run Code Online (Sandbox Code Playgroud)

  • @Nicholas Mordecai 我谨表示不同意。请参阅阿纳托尔·卢塞特的评论。 (6认同)

El *_*ano 16

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

现在,它是这样完成的:

$page.url.searchParams.set('word',word); 
goto(`?${$page.url.searchParams.toString()}`);
Run Code Online (Sandbox Code Playgroud)

$pagegoto()可以从:

import { goto } from "$app/navigation";
import { page } from "$app/stores"; 
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这会改变“page”的内部“URLSearchParams”,这可能会在使用反应性语句时导致一些问题。更好的方法是从 `$page.url.searchParams` 创建并修改一个新的 `URLSearchParams`,然后在 `goto` 中使用它 (`goto(newSearchParams)`)。 (11认同)