EUI не предписывает использование какой-либо конкретной библиотеки маршрутизации, и мы также не хотим нести бремя поддержки компонентов, специфичных для маршрутизатора. По этим причинам EUI не публикует никаких инструментов для работы с react-router
(или любой другой библиотекой маршрутизации). Однако интеграция EUI с react-router
на стороне потребителя довольно проста.
Ссылки в react-router
принимают свойство to
и преобразуют его в свойства href
и onClick
под капотом. onClick
используется для перемещения в новое местоположение истории, а href
позволяет открыть ссылку в новой вкладке. Любой механизм интеграции EUI с react-router
должен связывать свойство to
с свойствами href
и onClick
компонентов EUI.
Чтобы включить эти методы, вам необходимо сделать экземпляр router
доступным вне контекста React. Один из способов сделать это — назначить его глобально доступному синглтону в корневом компоненте вашего приложения.
Примечание: В качестве альтернативы использованию контекста напрямую вы можете использовать HOC withRouter
(https://github.com/ReactTraining/react-router/blob/v3/docs/API.md#withroutercomponent-options).
import { registerRouter } from './routing';
// App — это корневой компонент вашего приложения.
class App extends Component {
static contextTypes = {
router: PropTypes.shape({
createHref: PropTypes.func.isRequired,
push: PropTypes.func.isRequired,
}).isRequired,
}
constructor(...args) {
super(...args);
// Поделитесь маршрутизатором с приложением, не требуя React или контекста.
registerRouter(this.context.router);
}
}
ReactDOM.render(
<Router history={history}>
<Route path="/" component={App} />,
</Router>,
appRoot
)
Обратите внимание, что при использовании HMR вам потребуется повторно зарегистрировать маршрутизатор после горячей перезагрузки.
componentDidUpdate() {
// Вы можете добавить сюда некоторые условия, чтобы исключить эту логику из производственной сборки, например, `if (process.env.NODE_ENV !== 'production' && module.hot)`
this.registerRouter();
}
Вы можете создать сервис routing.js
, чтобы предоставить метод registerRouter
, а также вашу функцию преобразования (здесь она называется getRouterLinkProps
). Сайт документации EUI использует этот подход (../src-docs/src/services/routing/routing.js). Реакт-роутер 4.x
Общий доступ к router на глобальном уровне
Настройка немного отличается в реакт-роутере 4.х. Чтобы включить эти методы, вам нужно сделать экземпляр router доступным вне контекста React. Один из способов сделать это — назначить его глобально доступному синглтону в корневом компоненте вашего приложения.
import { registerRouter } from './routing';
// App — это корневой компонент вашего приложения.
class App extends Component {
static contextTypes = {
router: PropTypes.shape({
history: PropTypes.shape({
push: PropTypes.func.isRequired,
createHref: PropTypes.func.isRequired
}).isRequired
}).isRequired
}
constructor(...args) {
super(...args);
// Поделитесь маршрутизатором с приложением без использования React или контекста.
registerRouter(this.context.router);
}
}
// <App> *должен* быть дочерним элементом <Router>, потому что <App> зависит от контекста, предоставленного <Router>
ReactDOM.render(
<Router>
<App />,
</Router>,
appRoot
)
Горячая перезагрузка модуля
Routing.js сервис
Вы можете создать сервис routing.js, чтобы предоставить метод registerRouter, а также вашу функцию преобразования (здесь она называется getRouterLinkProps).
// routing.js
import { createLocation } from 'history';
const isModifiedEvent = event => !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);
const isLeftClickEvent = event => event.button === 0;
let router;
export const registerRouter = reactRouter => {
router = reactRouter;
};
/**
* Логика генерации href и обработчиков onClick из свойства `to` в значительной степени заимствована из
* https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/Link.js.
*/
export const getRouterLinkProps = to => {
const location = typeof to === "string"
? createLocation(to, null, null, router.history.location)
: to;
const href = router.history.createHref(location);
const onClick = event => {
if (event.defaultPrevented) {
return;
}
// Если установлен атрибут target (например, для "_blank"), пусть браузер обрабатывает ссылку.
if (event.target.getAttribute('target')) {
return;
}
if (isModifiedEvent(event) || !isLeftClickEvent(event)) {
return;
}
// Предотвратить обычное поведение ссылки, которое вызывает обновление браузера.
event.preventDefault();
router.history.push(location);
};
return {href, onClick}
};
Реакт-роутер 5.x
В реакт-роутере версии 5.0 обработка контекста изменилась, и мы больше не можем полагаться на неё. Решение состоит в том, чтобы создать HOC extractRouter, который будет перехватывать маршрутизатор и отправлять его вашему пользовательскому обработчику.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )