Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

151
Vistas
React Router V5: la mejor manera de usar la variable de contexto en la ruta

En Mi aplicación tengo mis rutas definidas, como se muestra a continuación:

 <BrowserRouter> <Header /> <div className="App"> <Switch> <Route exact path="/"> <Redirect to="/home" /> </Route> <Route exact path={["/home", "/"]} component={Home} /> <Route path="/account/:id" render={(props: RouteComponentProps<any>) => <Account {...props} />} /> <Route component={NotFound} /> </Switch> </div> </BrowserRouter>

Lo que quiero saber es que esto puede ser complicado. Si quisiera que mi ruta tuviera un prefijo de mi contexto, es decir, variable, ¿cómo haría esto, pero el giro es que la variable proviene de una respuesta de API?

Entonces, ¿qué sucede si quisiera la ruta /contextVariable /undefined/home /contextVariable/home pero contextVariable proviene de una respuesta de API y se almacena en un valor de contexto? /undefined/home como en la respuesta, ¿debería terminar antes de insertarse en la ruta?

¿Algunas ideas?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Una vez hice un proyecto que tenía un requisito similar. En eso, en lugar de declarar rutas dinámicas, obtuve una matriz de rutas del estado que era una matriz de objetos con componente, ruta y algunos otros parámetros. De forma predeterminada, agregué la página de destino inicial y la página no encontrada:

 const [routes, setRoutes] = React.useState([ { component: HomeComponent, path: '/', }, { component: NoMatchPage, path: '*', } ])

Y luego tuve la solicitud en un bloque useEffect que actualizaría este estado así:

 React.useEffect(()=>{ // call api() const oldRoutes = routes; const noMatchPage = oldRoutes.pop(); const newRoutes = [...oldRoutes, responseFromApi.map( routeItem => ({ component: ComponentName, path: routeItem.path }) ), noMatchPage] setRoutes(newRoutes) },[])

Edición 1: Porque soy olvidadizo

Lo siento, olvidé la parte principal, así es como sería la representación de la ruta:

 <Switch> { routes.map(routeItem => <Route path={routeItem.path} component={routeItem.component} /> ) } </Switch>

Además, si desea evitar el código adicional en useEffect, simplemente puede hacer esto:

 React.useEffect(()=>{ // call api() setRoutes(responseFromApi.map( routeItem => ({ component: ComponentName, path: routeItem.path }) )) },[])

y entonces

 <Switch> <Route exact path={["/home", "/"]} component={Home} /> { routes.map(routeItem => <Route path={routeItem.path} component={routeItem.component} /> ) } <Route component={NotFound} /> </Switch>

Edición 2: Porque soy ignorante

En el caso de que el usuario ingrese la URL directamente y Switch no pueda identificar la Route y, por lo tanto, cargue NotFoundPage , puede hacer lo siguiente:

  1. Establezca una condición cuando comience a cargar sus rutas, dentro de su bloque useEffect :
 const [loading, setLoading] = React.useState(false); React.useEffect(() => { setLoading(true); // load paths setLoading(false); }, [])
  1. Mientras la búsqueda está en progreso, muestra un Loader al usuario:
 return ( <> { loading ? <LoaderComponent /> : <Switch> // same as before </Switch> } </> )

Preferiblemente mostrar algo para que el usuario lea, para que no se irrite, porque la paciencia es cosa del pasado. ¡Espero que esto ayude!

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si desea hacer esto con un React Context, este es el patrón que sugiero. Cree un contexto de reacción que contenga la lógica de la API para obtener una "ruta base" y exponerla a los consumidores. Los consumidores tomarán el valor de "ruta base" proporcionado y lo antepondrán a todos los destinos de enlace y rutas de ruta.

Ejemplo:

BasePathProviderBasePathProvider

 import { createContext, useContext } from "react"; const BasePath = createContext({ basepath: "" }); const BasePathProvider = ({ children }) => { ... logic to fetch basepath ... return ( <BasePath.Provider value={{ basepath }}> {children} </BasePath.Provider> ); }; const useBasePath = () => useContext(BasePath);

Encabezamiento

 const Header = () => { const { basepath } = useBasePath(); return ( ... <Link to={`${basepath}/`}>Home</Link> <Link to={`${basepath}/account/${/* some id value */}`}> Account </Link> ... ); };

aplicación

 function App() { return ( <div className="App"> <Header /> <BasePath.Consumer> {({ basepath }) => ( <Switch> <Redirect from={`${basepath}/`} exact to={`${basepath}/home`} /> <Route path={`${basepath}/home`} component={Home} /> <Route path={`${basepath}/account/:id`} component={Account} /> <Route component={NotFound} /> </Switch> )} </BasePath.Consumer> </div> ); }

índice.js

 import { BrowserRouter as Router } from "react-router-dom"; import BasePathProvider from "../path/to/BasePathProvider"; ... <Router> <BasePathProvider> <App /> </BasePathProvider> </Router>

Edite react-router-v5-best-way-to-use-context-variable-in-route

Nota: Es posible que también desee/necesite implementar un estado de "carga" para representar condicionalmente los elementos secundarios del componente BasePathProvider hasta children se basepath el valor de la ruta base.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda