Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

285
Views
¿Cómo combinar setSearchParams de react-router-dom con la ruta que tiene un parámetro de una manera que permite el uso correcto del botón Atrás?

Tengo un conjunto de rutas que se ven así:

 { path: '/things', element: <MainLayout />, children: [ { path: 'search', element: <MainSearch />, }, { path: 'search/:thingId', element: <ThingLayout />, }, { path: '', element: <Navigate to="search" replace />, }, ], },

Donde la idea es buscar algo en MainSearch, obtener resultados, hacer clic en él y acceder a una página /things/search/:thingId para esa Cosa.

Sin embargo, ThingLayout también tiene un paradigma de pestañas, que se establece mediante parámetros de búsqueda y el usuario hace clic en las pestañas dentro de ese componente.

ThingLayout.tsx

 import { useParams, useSearchParams } from 'react-router-dom'; const ThingLayout = () => { const [searchParams, setSearchParams] = useSearchParams(); const activeTab = searchParams.get('tab'); // When the user first comes here from general search route, // set the default tab useEffect(() => { if (!activeTab) { setSearchParams({ tab: DEFAULT_TAB }); } }, []); // ... }

Mi problema es que necesito (creo) la ruta /search/:thingId para que todas mis rutas /search/:thingId?tab=someTab se resuelvan en este componente, que luego tiene un código para verificar qué pestaña está configurada a través de searchParams y luego represente el componente secundario adecuado, pero si un usuario presiona el botón Atrás, la URL cambia a /search/:thingId y luego vuelve inmediatamente a /search/:thingId?tab=defaultTab . Intenté usar navigate en lugar de setSearchParams para cambiar la URL:

 import { useNavigate } from 'react-router-dom'; // ... const navigate = useNavigate(); navigate(`?tab=${DEFAULT_INVENTORY_PARTS_TAB}`)

Pero tuve el mismo problema: cuando venía de la búsqueda, primero la URL sería /search/:thingId , luego se convertiría en ?tab=defaultTab .

He buscado en los documentos del enrutador de reacción, así como también he visto muchas preguntas de stackoverflow, y estoy pensando ahora que tal vez solo estoy siguiendo un patrón incorrecto. ¿Mi método de navegación por pestañas es compatible con la forma "correcta" de usar React Router? ¿Cómo puedo combinar la ruta general :id con mi ruta de searchParams de búsqueda manipulada?

La versión de mi enrutador de reacción es "react-router-dom": "^6.2.1"

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

setSearchParams funciona de manera similar a la función de navigate , pero solo para la URL queryString. Toma un objeto de opciones que es el mismo tipo de argumento que navigate .

 declare function useSearchParams( defaultInit?: URLSearchParamsInit ): [URLSearchParams, SetURLSearchParams]; type ParamKeyValuePair = [string, string]; type URLSearchParamsInit = | string | ParamKeyValuePair[] | Record<string, string | string[]> | URLSearchParams; type SetURLSearchParams = ( nextInit?: URLSearchParamsInit, navigateOpts?: : { replace?: boolean; state?: any } ) => void;

Pase un objeto de navigateOpts que establece el tipo de navegación para que sea una redirección.

 import { useParams, useSearchParams } from 'react-router-dom'; const ThingLayout = () => { const [searchParams, setSearchParams] = useSearchParams(); const activeTab = searchParams.get('tab'); // When the user first comes here from general search route, // set the default tab useEffect(() => { if (!activeTab) { searchParams.set("tab", DEFAULT_TAB); setSearchParams(searchParams, { replace: true }); } }, []); // ... }
about 4 years ago · Santiago Trujillo Report

0

La respuesta es usar la función de navigate proporcionada por el useNavigate de react-router-dom , que tiene un parámetro de replace que se le puede pasar, para reemplazar el elemento actual en el historial.

Entonces, mi código que verifica si hay una pestaña seleccionada, y si no, establece el parámetro de búsqueda, ahora navigate a la URL con el conjunto de parámetros de búsqueda adecuado, en lugar de configurar el parámetro de búsqueda directamente y solo.

 import { useParams, useSearchParams } from 'react-router-dom'; const ThingLayout = () => { const [searchParams, setSearchParams] = useSearchParams(); const activeTab = searchParams.get('tab'); // When the user first comes here from general search route, // set the default tab useEffect(() => { if (!activeTab) { setSearchParams({ tab: DEFAULT_TAB }); } }, []); // ... }

se convierte

 import { useSearchParams, useNavigate } from 'react-router-dom'; const ThingLayout = () => { const [searchParams] = useSearchParams(); const navigate = useNavigate(); const activeTab = searchParams.get('tab'); // When the user first comes here from general search route, // set the default tab useEffect(() => { if (!activeTab) { navigate(`?tab=${DEFAULT_TAB}`, {replace: true}); } }, []); // ... }
about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!