Ich rendere Komponenten aus meiner externen Musterbibliothek (node_modules). In meiner Haupt-App übergebe ich meine LinkInstanz react-router-domwie folgt an die Komponente meiner externen Bibliotheken:
import { Link } from 'react-router-dom';
import { Heading } from 'my-external-library';
const articleWithLinkProps = {
url: `/article/${article.slug}`,
routerLink: Link,
};
<Heading withLinkProps={articleWithLinkProps} />
In meiner Bibliothek wird Folgendes gerendert Link:
const RouterLink = withLinkProps.routerLink;
<RouterLink
to={withLinkProps.url}
>
{props.children}
</RouterLink>
Das RouterLinkscheint korrekt zu rendern und navigiert beim Klicken sogar zur URL.
Mein Problem ist, dass sich das RouterLinkanscheinend von der react-router-domInstanz meiner App gelöst hat . Wenn ich auf klicke Heading, ist es "schwer" zu navigieren und die Seite zurückzusenden, anstatt wie gewohnt nahtlos dorthin Linkzu gelangen.
Ich bin mir nicht sicher, was ich an dieser Stelle versuchen soll, damit es nahtlos navigieren kann. Jede Hilfe oder Beratung wäre dankbar, danke im Voraus.
Bearbeiten: Zeigt an, wie mein Router eingerichtet ist.
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 ) verwenden, sollten Sie in Betracht ziehen, auf neuere Versionen zu wechseln , es sei denn, Sie haben eine besondere Einschränkung bei der Durchsetzung der Verwendung veralteter Versionen von react-reduxund react-routerBibliotheken, da dies Ihr Problem beheben kann ). Entweder führen Sie das Upgrade durch, oder Sie sollten die genauen Versionen von reactangeben react-router-redux, react-reduxund react-router-domIhr Projekt wird derzeit verwendet, damit wir die Möglichkeit haben, eine Patch-Lösung zu finden.
<Link>Komponente als Argument oder Requisit an Ihre externe Bibliothek weitergeben lassen? Dies würde mehr Flexibilität und eine saubere Handhabung der Navigation ermöglichen.