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();
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 bibliotecas react-redux
y react-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 de react
, react-router-redux
, react-redux
y react-router-dom
su proyecto utiliza actualmente por lo que tenemos la oportunidad de encontrar una solución de parcheo.
<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.