Estoy renderizando componentes desde mi biblioteca de patrones externos (node_modules). En mi aplicación principal, paso mi Linkinstancia react-router-domal componente de mis bibliotecas externas de la siguiente manera:
import { Link } from 'react-router-dom';
import { Heading } from 'my-external-library';
const articleWithLinkProps = {
url: `/article/${article.slug}`,
routerLink: Link,
};
<Heading withLinkProps={articleWithLinkProps} />
En mi biblioteca, está renderizando Linkasí:
const RouterLink = withLinkProps.routerLink;
<RouterLink
to={withLinkProps.url}
>
{props.children}
</RouterLink>
El RouterLinkparece representar correctamente, e incluso navega a la dirección URL cuando se hace clic.
Mi problema es que RouterLinkparece haberse separado de la react-router-dominstancia de mi aplicación . Cuando hago clic Heading, se navega "con fuerza", publicando de nuevo la página en lugar de enrutarla sin problemas como lo Linkharía normalmente.
No estoy seguro de qué probar en este momento para permitirle navegar sin problemas. Cualquier ayuda o consejo sería apreciado, gracias de antemano.
Editar: muestra cómo está configurado mi enrutador.
import React from 'react';
import { hydrate, unmountComponentAtNode } from 'react-dom';
import { AppContainer } from 'react-hot-loader';
import { Provider } from 'react-redux';
import { createBrowserHistory } from 'history';
import { ConnectedRouter } from 'react-router-redux';
import RedBox from 'redbox-react';
import { Route } from 'react-router-dom';
import { Frontload } from 'react-frontload';
import App from './containers/App';
import configureStore from './redux/store';
import withTracker from './withTracker';
// Get initial state from server-side rendering
const initialState = window.__INITIAL_STATE__;
const history = createBrowserHistory();
const store = configureStore(history, initialState);
const mountNode = document.getElementById('react-view');
const noServerRender = window.__noServerRender__;
if (process.env.NODE_ENV !== 'production') {
console.log(`[react-frontload] server rendering configured ${noServerRender ? 'off' : 'on'}`);
}
const renderApp = () =>
hydrate(
<AppContainer errorReporter={({ error }) => <RedBox error={error} />}>
<Provider store={store}>
<Frontload noServerRender={window.__noServerRender__}>
<ConnectedRouter onUpdate={() => window.scrollTo(0, 0)} history={history}>
<Route
component={withTracker(() => (
<App noServerRender={noServerRender} />
))}
/>
</ConnectedRouter>
</Frontload>
</Provider>
</AppContainer>,
mountNode,
);
// Enable hot reload by react-hot-loader
if (module.hot) {
const reRenderApp = () => {
try {
renderApp();
} catch (error) {
hydrate(<RedBox error={error} />, mountNode);
}
};
module.hot.accept('./containers/App', () => {
setImmediate(() => {
// Preventing the hot reloading error from react-router
unmountComponentAtNode(mountNode);
reRenderApp();
});
});
}
renderApp();
fuente

<Link>componente pase a tu biblioteca externa como argumento o accesorios? eso permitiría una mayor flexibilidad y su forma limpia de manejar la navegación.react-router-redux( github.com/reactjs/react-router-redux ), a menos que tenga una restricción especial para imponer el uso de versiones obsoletas de las bibliotecasreact-reduxyreact-router, debería considerar la posibilidad de pasar a versiones más nuevas, ya que puede solucionar su problema ) O haces la actualización, o que debe ofrecer las versiones exactas dereact,react-router-redux,react-reduxyreact-router-domsu proyecto utiliza actualmente por lo que tenemos la oportunidad de encontrar una solución de parcheo.Respuestas:
He reconstruido su caso de uso
codesandbox.ioy la "transición" funciona bien. Entonces, tal vez revisar mi implementación podría ayudarlo. Sin embargo, reemplacé la importación de la biblioteca por una importación de archivos, por lo que no sé si ese es el factor decisivo de por qué no funciona sin una recarga completa de la página.Por cierto, ¿qué quieres decir exactamente con "sin problemas"? ¿Hay elementos que permanecen en cada página y no deberían volver a cargarse al hacer clic en el enlace? Esto es como lo implementé en el sandbox donde una imagen estática permanece en la parte superior de cada página.
Echa un vistazo a la caja de arena .
Este es el
example.jsarchivoY este es el
my-external-library.jsarchivo:fuente