Saltar al contenido principal
Version: 0.1.0

useQueryParams

Lee y escribe parámetros de URL con tipado completo. Se mantiene sincronizado automáticamente con la navegación del navegador (atrás / adelante).

Firma

function useQueryParams<TQuery extends Record<string, any>>(): {
get: (...keys: (keyof TQuery)[]) => Partial<TQuery>;
set: (params: Partial<TQuery>, url?: string) => void;
build: (params: Partial<TQuery>) => string;
pathname: string;
search: string;
clear: () => void;
}

Parámetro de tipo

Definí la forma de tus query params como genérico para obtener autocompletado y acceso tipado:

interface Filtros {
pagina: number;
q: string;
activo: boolean;
}

const { get, set } = useQueryParams<Filtros>();
const { pagina, q } = get("pagina", "q");
set({ pagina: 2 });

Valor de retorno

Método / PropiedadDescripción
get(...keys)Devuelve un objeto con los params solicitados, haciendo auto-cast a boolean, number o JSON parseado
set(params, url?)Empuja los params actualizados a la URL. Opcionalmente apunta a otro path
build(params)Devuelve un query string a partir de params sin navegar
pathnamelocation.pathname actual
searchlocation.search actual
clear()Elimina todos los query params de la URL

Auto-conversión de valores

get() convierte automáticamente los valores del string de la URL:

Valor en stringConvertido a
"true" / "false"boolean
"42"number
'{"a":1}'Objeto/array parseado
Cualquier otra cosastring

Ejemplo

import { useQueryParams } from "@julianfere/hooked";

interface ParamsBusqueda {
q: string;
pagina: number;
activo: boolean;
}

function PaginaBusqueda() {
const { get, set, clear } = useQueryParams<ParamsBusqueda>();
const { q = "", pagina = 1 } = get("q", "pagina");

return (
<div>
<input value={q} onChange={(e) => set({ q: e.target.value, pagina: 1 })} />
<button onClick={() => set({ pagina: pagina + 1 })}>Siguiente página</button>
<button onClick={clear}>Limpiar filtros</button>
</div>
);
}
nota

Este hook depende de window.location y history.pushState. No es compatible con renderizado del lado del servidor out of the box.