Tôi đang kết xuất các thành phần từ thư viện mẫu bên ngoài (node_modules). Trong Ứng dụng chính của tôi, tôi chuyển Link
ví dụ của mình từ react-router-dom
thành phần thư viện bên ngoài của mình như vậy:
import { Link } from 'react-router-dom';
import { Heading } from 'my-external-library';
const articleWithLinkProps = {
url: `/article/${article.slug}`,
routerLink: Link,
};
<Heading withLinkProps={articleWithLinkProps} />
Trong thư viện của tôi, nó hiển thị Link
như vậy:
const RouterLink = withLinkProps.routerLink;
<RouterLink
to={withLinkProps.url}
>
{props.children}
</RouterLink>
Các RouterLink
dường như hiển thị chính xác, và thậm chí điều hướng đến URL khi nhấp vào.
Vấn đề của tôi là RouterLink
dường như đã tách ra khỏi react-router-dom
ví dụ Ứng dụng của tôi . Khi tôi nhấp Heading
, nó "điều hướng" cứng, đăng lại trang thay vì định tuyến ở đó liền mạch như Link
bình thường.
Tôi không chắc chắn những gì cần cố gắng vào thời điểm này để cho phép nó điều hướng liền mạch. Bất kỳ trợ giúp hoặc lời khuyên sẽ được đánh giá cao, cảm ơn bạn trước.
Chỉnh sửa: Hiển thị cách Bộ định tuyến của tôi được thiết lập.
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 ), trừ khi bạn có một ràng buộc đặc biệt để thực thi bằng cách sử dụng các phiên bản react-redux
và react-router
thư viện lỗi thời , bạn nên xem xét chuyển sang các phiên bản mới hơn, vì nó có thể khắc phục vấn đề của bạn ). Hoặc bạn thực hiện nâng cấp, hoặc bạn nên cung cấp các phiên bản chính xác của react
, react-router-redux
, react-redux
và react-router-dom
dự án của bạn hiện đang sử dụng vì vậy chúng tôi có một cơ hội để tìm một giải pháp vá.
<Link>
thành phần của bạn được chuyển cho lib bên ngoài của bạn như là một đối số hoặc đạo cụ? điều đó sẽ cho phép linh hoạt hơn và cách xử lý điều hướng sạch sẽ của nó.