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();
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-reduxy 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-reduxy react-router-domsu 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.