본문으로 건너뛰기

검색 매개변수로 탐색하는 방법

이 가이드에서는 TanStack Router의 Link 컴포넌트와 프로그래밍 방식 탐색 메서드를 사용하여 탐색 중 검색 매개변수를 업데이트하고 관리하는 방법을 설명합니다.

사전 요구 사항: 기본 검색 매개변수 설정 - 검색 매개변수를 읽고 검증하기 위한 기초 개념입니다.

빠른 시작

기존 상태를 유지하면서 검색 매개변수를 업데이트하는 탐색을 구성합니다.

import { Link, useNavigate } from '@tanstack/react-router'

// Link with search parameter updates
;<Link to="/search" search={(prev) => ({ ...prev, query: 'new search' })}>
Search for "new search"
</Link>

// Programmatic navigation
const navigate = useNavigate()
navigate({
to: '/search',
search: (prev) => ({ ...prev, page: 1 }),
})

기본 검색 매개변수 업데이트

모든 검색 매개변수를 교체합니다.

import { Link } from '@tanstack/router'

function SearchForm() {
return (
<div>
{/* Replace all search params */}
<Link to="/products" search={{ category: 'electronics', page: 1 }}>
Electronics
</Link>

{/* Navigate to same route with new search */}
<Link search={{ sort: 'price-asc' }}>Sort by Price</Link>
</div>
)
}

함수형 검색 매개변수 업데이트

기존 검색 매개변수와 병합합니다.

import { Link } from '@tanstack/react-router'

function Pagination() {
return (
<div>
{/* Preserve existing search, update page */}
<Link search={(prev) => ({ ...prev, page: (prev.page || 1) + 1 })}>
Next Page
</Link>

{/* Toggle filter while keeping other params */}
<Link
search={(prev) => ({
...prev,
inStock: !prev.inStock,
})}
>
Toggle In Stock
</Link>

{/* Remove a search parameter */}
<Link
search={(prev) => {
const { category, ...rest } = prev
return rest
}}
>
Clear Category Filter
</Link>
</div>
)
}

모든 검색 매개변수 유지

탐색할 때 현재 검색 매개변수를 모두 유지하려면 search={true}를 사용합니다.

import { Link } from '@tanstack/react-router'

function Navigation() {
return (
<nav>
{/* Keep all search params when changing routes */}
<Link to="/products" search={true}>
View Products (Keep Filters)
</Link>

{/* Equivalent functional approach */}
<Link to="/products" search={(prev) => prev}>
View Products (Functional)
</Link>
</nav>
)
}

검색 매개변수를 사용하여 다른 라우트로 이동합니다.

import { Link } from '@tanstack/react-router'

function Navigation() {
return (
<nav>
{/* Navigate to different route with search */}
<Link to="/search" search={{ query: 'laptops', category: 'electronics' }}>
Search Laptops
</Link>

{/* Inherit current search params to new route */}
<Link
to="/products"
search={true} // Shorthand to carry over all search params
>
View Products
</Link>

{/* Transform search params for new route */}
<Link
to="/advanced-search"
search={(prev) => ({
q: prev.query, // Rename parameter
filters: {
category: prev.category,
inStock: prev.inStock,
},
})}
>
Advanced Search
</Link>
</nav>
)
}

프로그래밍 방식 탐색

useNavigate 훅 사용

검색 매개변수를 업데이트하면서 프로그래밍 방식으로 이동합니다.

import { useNavigate } from '@tanstack/react-router'

function SearchControls() {
const navigate = useNavigate()

const handleSortChange = (sortBy: string) => {
navigate({
search: (prev) => ({ ...prev, sort: sortBy, page: 1 }),
})
}

const handleClearFilters = () => {
navigate({
search: (prev) => {
const { category, minPrice, maxPrice, ...rest } = prev
return rest
},
})
}

const handleSearch = (query: string) => {
navigate({
to: '/search',
search: { query, page: 1 },
})
}

return (
<div>
<select onChange={(e) => handleSortChange(e.target.value)}>
<option value="relevance">Sort by Relevance</option>
<option value="price-asc">Price: Low to High</option>
<option value="price-desc">Price: High to Low</option>
</select>

<button onClick={handleClearFilters}>Clear Filters</button>

<button onClick={() => handleSearch('latest products')}>
Search Latest
</button>
</div>
)
}

useNavigate 또는 Link를 사용할 수 없는 React 외부 컨텍스트에서만 라우터를 직접 사용합니다.

import { router } from './router' // Your router instance

// ✅ Appropriate use case: Utility function outside React components
export function navigateFromUtility(searchParams: Record<string, any>) {
router.navigate({
search: (prev) => ({ ...prev, ...searchParams }),
})
}

// ✅ Appropriate use case: Event handlers in non-React code
class ApiService {
onAuthError() {
// Navigate to login when auth fails
router.navigate({
to: '/login',
search: { redirect: window.location.pathname },
})
}
}

// ✅ Appropriate use case: Global error handler
window.addEventListener('unhandledrejection', (event) => {
if (event.reason.status === 401) {
router.navigate({
to: '/login',
search: { error: 'session-expired' },
})
}
})

⚠️ React 컴포넌트에서는 대신 useNavigate를 사용하는 것을 권장합니다.

// ❌ Avoid in React components
function Component() {
const router = useRouter()

const handleClick = () => {
router.navigate({ search: { filter: 'active' } })
}

return <button onClick={handleClick}>Filter</button>
}

// ✅ Use useNavigate in React components
function Component() {
const navigate = useNavigate()

const handleClick = () => {
navigate({ search: { filter: 'active' } })
}

return <button onClick={handleClick}>Filter</button>
}

고급 탐색 패턴

조건부 탐색

특정 조건이 충족되면 자동으로 이동합니다.

import { useEffect } from 'react'
import { useNavigate, useSearch } from '@tanstack/react-router'

function ConditionalNavigation() {
const navigate = useNavigate()
const search = useSearch({ from: '/products' })

// Auto-reset page when search query changes
useEffect(() => {
if (search.query && search.page > 1) {
navigate({
search: (prev) => ({ ...prev, page: 1 }),
})
}
}, [search.query, search.page, navigate])

return <div>Page resets automatically when search changes</div>
}

일반적인 패턴

일반적인 문제

검색 매개변수가 업데이트되지 않음

문제: Link 탐색이 검색 매개변수를 업데이트하지 않습니다.

// ❌ Wrong - no search prop
<Link to="/products">Electronics</Link>

// ✅ Correct - with search parameters
<Link to="/products" search={{ category: 'electronics' }}>
Electronics
</Link>

기존 검색 매개변수 손실

문제: 새 탐색이 특정 매개변수만 업데이트하지 않고 모든 검색 매개변수를 교체합니다.

// ❌ Wrong - replaces all search params
<Link search={{ page: 2 }}>Next Page</Link>

// ✅ Correct - preserves existing search params
<Link search={(prev) => ({ ...prev, page: 2 })}>
Next Page
</Link>

일반적인 다음 단계

검색 매개변수를 사용한 탐색을 익힌 후에는 다음 작업을 고려할 수 있습니다.