How toAccess the Search Params of a Request in Remix
The search params, typically called query params, are the part of the URL that comes after the ?
. For example, in the URL https://sergiodxa.com/tutorials?q=remix
, the search params part of the URL is q=remix
.
This is commonly used to pass data to the server using the URL, for example when building a search form you can pass the search term or any other filter. Or when building a pagination you can pass the page number and page size, or a cursor.
If you're writing a Remix route that receives a request with search params you can access them using the URL and URLSearchParams APIs.
export async function loader({ request }: LoaderFunctionArgs) {
let { searchParams } = new URL(request.url);
let query = searchParams.get("query");
let products = await getProducts(query)
return json({ query, products });
};
In some cases the search param can be duplicated, one example can be if you're building a filter with checkboxes and you want to allow multiple values for the same filter. In that case you can use the getAll
method to get all the values for a search param.
export async function loader({ request }: LoaderFunctionArgs) {
let { searchParams } = new URL(request.url);
let size = searchParams.getAll("size");
let products = await getProducts({ size })
return json({ query, products });
};
Another common use case is to get the search params from the client, for example if you're building a search form you can get the search term from the client and pass it to the server.
import { useSearchParams } from "@remix-run/react";
import { useDeferredValue, useEffect, useState } from "react";
export function Component() {
let [searchParams, setSearchParams] = useSearchParams();
let [value, setValue] = useState(() => {
return searchParams.get("query") ?? ""
});
let deferredValue = useDeferredValue(value);
useEffect(() => {
setSearchParams({ query: deferredValue });
}, [deferredValue, setSearchParams]);
return (
<input
type="text"
value={value}
onChange={(event) => setValue(event.currentTarget.value)}
/>
);
}