1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/missyoyo-eui

Клонировать/Скачать
react-router.md 7.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 05:51 431073f

Использование react-router с EUI

EUI не предписывает использование какой-либо конкретной библиотеки маршрутизации, и мы также не хотим нести бремя поддержки компонентов, специфичных для маршрутизатора. По этим причинам EUI не публикует никаких инструментов для работы с react-router (или любой другой библиотекой маршрутизации). Однако интеграция EUI с react-router на стороне потребителя довольно проста.

Как работает react-router

Ссылки в react-router принимают свойство to и преобразуют его в свойства href и onClick под капотом. onClick используется для перемещения в новое местоположение истории, а href позволяет открыть ссылку в новой вкладке. Любой механизм интеграции EUI с react-router должен связывать свойство to с свойствами href и onClick компонентов EUI.

react-router 3.x

Чтобы включить эти методы, вам необходимо сделать экземпляр 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/missyoyo-eui.git
git@api.gitlife.ru:oschina-mirror/missyoyo-eui.git
oschina-mirror
missyoyo-eui
missyoyo-eui
master