Trabajar con rutas dinámicas en Next.js implica saber leer dos tipos de datos distintos: los params que viajan en la URL y los searchParams que llegan como query string. Aprender a extraerlos correctamente, tanto en componentes de servidor como de cliente, te permite construir vistas individuales de producto, filtros y experimentos sin fricción.
¿Cómo creo una ruta dinámica para un producto en Next.js?
Dentro de la carpeta app se crea una nueva carpeta llamada product y, dentro, otra carpeta envuelta en corchetes con el nombre del parámetro dinámico, por ejemplo [handle]. Ahí adentro vive un archivo page.tsx que exporta una función asíncrona como ProductPage. Con eso, una URL del tipo /product/vehiculo-volador ya renderiza la vista individual del producto [01:00].
Esta convención de carpetas con corchetes es la forma estándar en la que Next.js identifica segmentos dinámicos en el App Router. El valor que el usuario escriba en esa parte de la URL viajará como handle dentro del objeto params.
¿Cómo accedo a params desde un Server Component?
En un componente de servidor, los parámetros llegan directamente como props. Se define una interfaz, por ejemplo ProductPageProps, y se tipa el argumento de la página. Después, basta con leer props.params.handle o props.searchParams.id para usarlos.
Es importante separar mentalmente las dos fuentes de datos:
params contiene el segmento dinámico definido en el nombre de la carpeta, como handle.
searchParams contiene los pares clave-valor que vienen después del signo ? en la URL, como ?id=123456.
- Ambos están disponibles como props únicamente en componentes de servidor [02:30].
Este flujo funciona perfecto cuando la página es un React Server Component, que es el comportamiento por defecto.
¿Cómo obtengo los parámetros en un Client Component?
Cuando agregas la directiva use client al inicio del archivo, las props de params y searchParams dejan de ser la vía recomendada. En su lugar, Next.js expone hooks que puedes usar en cualquier nivel del árbol de componentes, incluso en uno profundamente anidado.
¿Qué es el hook useParams? Es un hook de Next.js que devuelve los parámetros dinámicos de la ruta actual, como handle, sin necesidad de pasarlos como props. Solo funciona en componentes de cliente.
El flujo es el siguiente: importas useParams desde next/navigation, lo invocas dentro del componente y obtienes un objeto con las claves definidas en tus carpetas dinámicas. Si intentas usarlo en una función async, verás el error Hooks are not supported in async components, porque los hooks no conviven con componentes asíncronos [03:45].
¿Cómo leo searchParams con useSearchParams?
A diferencia de useParams, el hook useSearchParams no devuelve un diccionario plano. Devuelve una instancia tipo Read entry searchParams sobre la que tienes que llamar al método .get() con la clave que buscas.
El patrón se ve así: declaras const searchParams = useSearchParams() y luego const id = searchParams.get('id'). Con eso recuperas el valor que llegó en la URL, por ejemplo 123456, desde cualquier componente cliente del árbol [05:10].
¿Cuál es la diferencia entre useParams y useSearchParams? useParams lee los segmentos dinámicos definidos en carpetas con corchetes. useSearchParams lee los valores que viajan en el query string después del ?. Los dos requieren use client.
¿Cuándo conviene usar params y cuándo searchParams?
La decisión no es estética, es semántica. Cada uno comunica una intención distinta sobre el recurso que estás mostrando.
Usa params cuando ya sabes qué recurso vas a renderizar y necesitas identificarlo de forma única, como el handle o el ID de un producto. Es la forma natural de modelar vistas individuales y URLs limpias.
Usa searchParams para datos secundarios o configurables, por ejemplo:
- Parámetros extra de configuración de la página.
- Tokens de búsqueda o filtros aplicados.
- Identificadores de campañas y analíticas.
- Variantes para experimentos de A/B testing y feature flags [07:20].
¿Puedo usar searchParams para A/B testing? Sí. Los searchParams son ideales para activar variantes de una vista o mostrar features nuevos solo a un segmento de usuarios, porque puedes leerlos y bifurcar la lógica de render sin tocar la ruta.
Dominar esta separación te ayuda a diseñar URLs más expresivas y a decidir con claridad qué información merece estar en la estructura de la ruta y cuál debe viajar como parámetro de consulta. ¿En qué parte de tu proyecto vas a aplicar primero useSearchParams? Cuéntalo en los comentarios.