Renderuję komponenty z mojej biblioteki wzorców zewnętrznych (node_modules). W mojej głównej aplikacji przekazuję moją Linkinstancję react-router-domdo komponentu bibliotek zewnętrznych w następujący sposób:
import { Link } from 'react-router-dom';
import { Heading } from 'my-external-library';
const articleWithLinkProps = {
url: `/article/${article.slug}`,
routerLink: Link,
};
<Heading withLinkProps={articleWithLinkProps} />
W mojej bibliotece renderuje się Linktak:
const RouterLink = withLinkProps.routerLink;
<RouterLink
to={withLinkProps.url}
>
{props.children}
</RouterLink>
RouterLinkWydaje się do renderowania poprawnie, a nawet przejście do adresu URL po kliknięciu.
Mój problem polega na tym, że RouterLinkwygląda na to, że odłączono się od react-router-dominstancji mojej aplikacji . Kiedy klikam Heading, „twardo” nawiguje, odsuwa stronę, zamiast kierować ją bezproblemowo, jak Linkzwykle.
Nie jestem pewien, co mam teraz spróbować, aby umożliwić płynną nawigację. Każda pomoc lub rada będzie mile widziana, z góry dziękuję.
Edycja: Pokazuje, jak skonfigurowany jest mój router.
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 ), chyba że masz specjalne ograniczenia wymuszające stosowanie przestarzałych wersji bibliotek react-reduxi react-routerbibliotek, powinieneś rozważyć przejście na nowsze wersje, ponieważ może to rozwiązać problem ). Albo zrobić upgrade, czy należy podać dokładne wersje react, react-router-redux,react-redux a react-router-domprojekt jest obecnie za pomocą tak mamy szansę, aby znaleźć rozwiązanie łatanie.
<Link>przekazać komponentu do zewnętrznej biblioteki jako argumentu lub rekwizytów? pozwoliłoby to na większą elastyczność i czysty sposób obsługi nawigacji.