es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

React Router v6 en paquete externo

Tengo una aplicación con react router dentro. Toda la aplicación está envuelta por el componente Router.

<router>
    <routes>
        <route path="/home/" element=""></route><homepage></homepage>} />
        <route path="/desk/" element=""></route><desk></desk>} />
    </routes>
</router>

En mi componente Desk importo desde otro paquete mi componente externo Table, el cual tiene Link, useLocation, etc.

Tengo que envolver todo con Router en el componente Table. Por lo tanto, ahora tengo un Router principal en la aplicación y otro Router en mi componente de biblioteca. En este caso, al hacer clic en Link se cambia la URL en la barra de direcciones del navegador, pero no hace que el Router principal enruté los componentes correctamente.

Si elimino el componente Router de mi biblioteca, muestra errores como “useHref() solo se puede usar en el contexto de un componente Router”.

¿Podrías ayudarme a solucionar este problema, por favor? ¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Posibles soluciones para componentes anidados de React Router

    Como experto en IT especializado en ReactJS y React Router, permítame sugerir algunas posibles soluciones para este problema. Hay varias formas de lograr la funcionalidad deseada sin interferir con el enrutador principal:

    1. Utilice BrowserRouter en lugar de Router en su componente de tabla. Esto creará una nueva instancia de enrutador que funcionará dentro del alcance de su componente de biblioteca. Importe BrowserRouter de react-router-dom y envuelva su componente de tabla con él:
      import { BrowserRouter } from 'react-router-dom';
      
      function TablaConEnrutador(props) {
       return (
         <browserrouter>
           <tabla {...props}=""></tabla>
         </browserrouter>
       );
      }
      

      Luego, utilice TablaConEnrutador en lugar de Tabla en su componente de escritorio.

    2. Utilice MemoryRouter en lugar de BrowserRouter en su componente de tabla. Esto creará un enrutador que no depende de la barra de direcciones del navegador, sino que almacena la URL actual en memoria. Importe MemoryRouter de react-router-dom y envuelva su componente de tabla con él:

      import { MemoryRouter } from 'react-router-dom';
      
      function TablaConEnrutador(props) {
       return (
         <memoryrouter>
           <tabla {...props}=""></tabla>
         </memoryrouter>
       );
      }
      

      Luego, utilice TablaConEnrutador en lugar de Tabla en su componente de escritorio.

    3. Pase el contexto del Router a su componente de biblioteca utilizando contextTypes. Esta solución requiere una configuración adicional para pasar el contexto del Router a su componente de biblioteca:

      import React, { Component } from 'react';
      import { Router, Route, Switch } from 'react-router-dom';
      import PropTypes from 'prop-types';
      import Tabla from 'components/Tabla';
      
      class Escritorio extends Component {
       static contextTypes = {
         router: PropTypes.object
       };
      
       render() {
         return (
           <div>
             <switch>
               <route path="/escritorio" component="{TablaConEnrutador}"></route>
             </switch>
           </div>
         );
       }
      }
      
      function TablaConEnrutador(props, context) {
       return (
         <tabla {...props}="" router="{context.router}"></tabla>
       );
      }
      TablaConEnrutador.contextTypes = {
       router: PropTypes.object
      };
      

      Aquí, estamos pasando el objeto router del contexto del Router al componente de Tabla como una prop. Luego, en el componente de Tabla, podemos usarlo para crear enlaces y realizar el enrutamiento.

    Elija la solución que mejor se adapte a su proyecto y arquitectura.

Comments are closed.