Quick Start Tutorial
paramsync>quick-start

Quick Start Tutorial

Learn how to bind query parameters to React state with zero typing latency in under 5 minutes.

Step 1: Import useQueryState and Parsers

Import useQueryState along with the built-in parser that matches your data type:

TSexample.tsx
'use client';
 
import { useQueryState, parseAsString, parseAsInteger } from 'paramsync';
main|paramsync
TypeScript JSXLn 3, Col 1

Step 2: Create a Debounced Search Input

Pass { debounceMs: 300 } to debounce URL updates while keeping local input state 100% instantaneous:

TSexample.tsx
const [search, setSearch] = useQueryState(
'q',
parseAsString.withDefault(''),
{ debounceMs: 300 }
);
main|paramsync
TypeScript JSXLn 5, Col 1

Step 3: Add Pagination with Auto-Reset

Reset page back to 1 when the search query changes so users don't end up on an empty page:

TSexample.tsx
const [page, setPage] = useQueryState('page', parseAsInteger.withDefault(1));
 
const handleSearch = (newVal: string) => {
setPage(1); // Cleans ?page from URL
setSearch(newVal);
};
main|paramsync
TypeScript JSXLn 6, Col 1

Complete Working Component

TSSearchFeed.tsx
'use client';
 
import { useQueryState, parseAsString, parseAsInteger } from 'paramsync';
 
export default function SearchFeed() {
const [search, setSearch] = useQueryState(
'q',
parseAsString.withDefault(''),
{ debounceMs: 300 }
);
 
const [page, setPage] = useQueryState('page', parseAsInteger.withDefault(1));
 
return (
<div className="space-y-4">
<input
type="text"
value={search}
onChange={(e) => {
setPage(1);
setSearch(e.target.value);
}}
placeholder="Filter results..."
/>
 
<div className="flex items-center gap-2">
<button disabled={page <= 1} onClick={() => setPage((p) => p - 1)}>
Prev
</button>
<span>Page {page}</span>
<button onClick={() => setPage((p) => p + 1)}>
Next
</button>
</div>
</div>
);
}
main|paramsync
TypeScript JSXLn 37, Col 1