Estoy renderizando componentes desde mi biblioteca de patrones externos (node_modules). En mi aplicación principal, paso mi Link
instancia react-router-dom
al 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 Link
así:
const RouterLink = withLinkProps.routerLink;
<RouterLink
to={withLinkProps.url}
>
{props.children}
</RouterLink>
El RouterLink
parece representar correctamente, e incluso navega a la dirección URL cuando se hace clic.
Mi problema es que RouterLink
parece haberse separado de la react-router-dom
instancia 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 Link
harí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-redux
yreact-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-redux
yreact-router-dom
su proyecto utiliza actualmente por lo que tenemos la oportunidad de encontrar una solución de parcheo.Respuestas:
He reconstruido su caso de uso
codesandbox.io
y 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.js
archivoY este es el
my-external-library.js
archivo:fuente