Je rend des composants à partir de ma bibliothèque de modèles externe (node_modules). Dans mon application principale, je passe mon Link
instance de react-router-dom
dans le composant de mes bibliothèques externes comme suit:
import { Link } from 'react-router-dom';
import { Heading } from 'my-external-library';
const articleWithLinkProps = {
url: `/article/${article.slug}`,
routerLink: Link,
};
<Heading withLinkProps={articleWithLinkProps} />
Dans ma bibliothèque, ça rend le Link
comme:
const RouterLink = withLinkProps.routerLink;
<RouterLink
to={withLinkProps.url}
>
{props.children}
</RouterLink>
Le RouterLink
semble s'afficher correctement et navigue même vers l'URL lorsque vous cliquez dessus.
Mon problème est que le RouterLink
semble s'être détaché de l' react-router-dom
instance de mon application . Lorsque je clique Heading
, la navigation est "difficile", affichant la page au lieu de l'acheminer de façon transparente comme d' Link
habitude.
Je ne sais pas quoi essayer à ce stade pour lui permettre de naviguer de manière transparente. Toute aide ou conseil serait apprécié, merci d'avance.
Modifier: montrant comment mon routeur est configuré.
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();
la source
<Link>
composant transmis à votre bibliothèque externe comme argument ou accessoire? cela permettrait plus de flexibilité et sa façon propre de gérer la navigation.react-router-redux
( github.com/reactjs/react-router-redux ), sauf si vous avez une contrainte spéciale à appliquer en utilisant des versions obsolètes des bibliothèquesreact-redux
etreact-router
, vous devriez envisager de passer à des versions plus récentes, car cela peut résoudre votre problème ). Soit vous faites la mise à niveau, ou vous devez fournir les versions exactes dereact
,react-router-redux
,react-redux
etreact-router-dom
votre projet utilise actuellement si nous avons une chance de trouver une solution de ragréage.Réponses:
J'ai reconstruit votre cas d'utilisation
codesandbox.io
et la "transition" fonctionne bien. Alors peut-être que vérifier mon implémentation pourrait vous aider. Cependant, j'ai remplacé l'importation de bibliothèque par une importation de fichier, donc je ne sais pas si c'est le facteur décisif pour expliquer pourquoi cela ne fonctionne pas sans un rechargement de page entière.Soit dit en passant, que voulez-vous dire exactement par «de façon transparente»? Y a-t-il des éléments qui restent sur chaque page et ne devraient pas être rechargés à nouveau en cliquant sur le lien? C'est comme si je l'avais implémenté dans le bac à sable où une image statique reste en haut de chaque page.
Découvrez le bac à sable .
C'est le
example.js
dossierEt voici le
my-external-library.js
dossier:la source