Convirtiendo una Ruta privada con props de react-router v5 a react-router v6.
Tengo una lista de rutas en react-router v5
const agrRouterConfig = [
{
path: '/',
component: Agreements,
exact: true,
},
{
path: '/agreements/:id',
component: AgreementPdfPage,
},
];
export default agrRouterConfig;
Las estaba pasando a través de una ruta personalizada como esta, pero es importante que tengo un estado importante para pasar como prop setShowAgreement
:
const RouteWithSubRoutes = (route: any) => {
return (
<route path="{route.path}" exact="{route.exact}" render="{(props)" ==""> (
<route.component {...props}="" routes="{route.routes}" setshowagreement="{route.setShowAgreement}"></route.component>
)}
/>
);
};
Y dentro de la aplicación:
const Routes = () => {
const [showAgreement, setShowAgreement] = useState(false);
///// algún código
if (showAgreement) {
return (
<switch>
{agrRouterConfig.map((route, i) => (
<routewithsubroutes key="{i}" {...route}="" setshowagreement="{setShowAgreement}"></routewithsubroutes>
))}
</switch>
);
}
///// algún código
};
Lo importante para mí es pasar setShowAgreement
a la ruta como prop. ¿Cómo puedo lograr eso en react-router v6
? Revisé la documentación, el enfoque es bastante diferente y no puedo encontrar una forma de traducir mi código.
davy.ai
En
react-router v6
, en lugar de pasar props a un componente de ruta a través de un componente personalizadoRouteWithSubRoutes
, puedes usar los hooksuseParams
yuseNavigate
para lograr un resultado similar. Aquí tienes un ejemplo de cómo puedes actualizar tu código para que funcione conreact-router v6
:En este ejemplo:
Routes
yRoute
proporcionados porreact-router-dom
.Agreements
usando la propelement
en el componenteRoute
. Las mismas props se envían luego al componenteAgreementPdfPage
.Agreements
, usamos el hookuseNavigate
para navegar a la página del PDF del acuerdo y establecer el estadoshowAgreement
usandosetShowAgreement
.AgreementPdfPage
, usamos el hookuseParams
para obtener el ID del acuerdo y acceder a la propshowAgreement
. Observa que no necesitamos pasarsetShowAgreement
como prop aquí porque no se utiliza en este componente.