최근에 스벨트킷에서 현재 페이지에서 쿼리 스트링 파라미터만 업데이트 할 필요가 생겼다.
예를 들어, 현재 페이지가 /posts
이고, 쿼리 스트링 파라미터가 page=1
이라고 하자. 이 때 정렬을 위한 쿼리 스트링 파라미터를 추가하고 싶다면, /posts?page=1&sort=asc
와 같이 쿼리 스트링 파라미터를 추가해야 한다.
이 때, page
파라미터는 유지하고 sort
파라미터만 추가하고 싶다면 어떻게 해야 할까?
goto
우선 스벨트킷에서 페이지 이동을 programatical하게 하기 위해서는 goto
함수를 사용하면 된다.
import { goto } from '$app/navigation';
// `goto` 함수는 서버에서 호출할 수 없다.
if (typeof window !== undefined) {
goto('/posts?page=1&sort=asc');
}
하지만 goto만 가지고는 현재 페이지의 쿼리 스트링 파라미터를 알 수 없다. 따라서 스토어에서 page
를 가져와야 한다.
page
page
스토어는 현재 페이지와 관련된 정보를 가지고 있다. 이 스토어를 사용하면 현재 페이지의 쿼리 스트링 파라미터를 알 수 있다.
위 내용을 종합하면 아래와 같이 쿼리 스트링 파라미터를 업데이트 할 수 있다.
import { page } from '$app/stores';
import { goto } from '$app/navigation';
// `goto` 함수는 서버에서 호출할 수 없다.
if (typeof window !== 'undefined') {
// $page.url을 직접 수정하면 안된다.
// https://github.com/sveltejs/kit/issues/2785#issuecomment-967790973
const query = new URLSearchParams($page.url.searchParams);
if (asc) query.set('sort', 'asc');
else query.delete('sort');
goto(`?${query.toString()}`);
}