Ich rendere Komponenten aus meiner externen Musterbibliothek (node_modules). In meiner Haupt-App übergebe ich meine Link
Instanz react-router-dom
wie 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 RouterLink
scheint korrekt zu rendern und navigiert beim Klicken sogar zur URL.
Mein Problem ist, dass sich das RouterLink
anscheinend von der react-router-dom
Instanz 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 Link
zu 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();
quelle
<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.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 vonreact-redux
undreact-router
Bibliotheken, da dies Ihr Problem beheben kann ). Entweder führen Sie das Upgrade durch, oder Sie sollten die genauen Versionen vonreact
angebenreact-router-redux
,react-redux
undreact-router-dom
Ihr Projekt wird derzeit verwendet, damit wir die Möglichkeit haben, eine Patch-Lösung zu finden.Antworten:
Ich habe Ihren Anwendungsfall in rekonstruiert
codesandbox.io
und der "Übergang" funktioniert einwandfrei. Vielleicht hilft Ihnen das Auschecken meiner Implementierung. Ich habe den Bibliotheksimport jedoch durch einen Dateiimport ersetzt, sodass ich nicht weiß, ob dies der entscheidende Faktor dafür ist, warum er ohne ein erneutes Laden der gesamten Seite nicht funktioniert.Was meinst du übrigens genau mit "nahtlos"? Gibt es Elemente, die auf jeder Seite verbleiben und beim Klicken auf den Link nicht erneut geladen werden sollten? Dies ist so, als hätte ich es in der Sandbox implementiert, in der auf jeder Seite ein statisches Bild oben bleibt.
Schauen Sie sich den Sandkasten an .
Dies ist die
example.js
DateiUnd das ist die
my-external-library.js
Datei:quelle