Скажем, я использую React Router в проекте и делаю маршрутизатор доступным для компонента через Context следующим образом:

class MyComponent extends Component {
  static contextTypes = {
    router: React.PropTypes.object.isRequired
  }
  render() {
    console.log(this.context.router)
  }
}

Выход из объекта дает мне следующее:

(Кроме того: кто-нибудь знает, где находится какая-либо документация для этого объекта? Я ничего не могу найти на сайте React Router, поэтому я открыл для него проблему.)

Существует функция .listenBefore (), которая позволяет мне выполнять функцию перед переходом маршрута, что я нашел очень полезным для закрытия раскрывающегося меню навигации при нажатии на параметр, который выполняет переход на новую страницу.

componentDidMount() {
  this.context.router.listenBefore(() =>
    this.setState({ isDropdownOpen: false })
  )
}

Проблема в том, что если он прикреплен к компоненту, который регулярно монтируется и размонтируется, слушатель зависает и в конечном итоге начинает выдавать ошибки при вызове .setState () на размонтированном компоненте.

Решение этой проблемы состоит в том, чтобы узнать, что .listenBefore () возвращает функцию обратного вызова, которая удаляет слушателя, но мне потребовалась неделя, чтобы понять это.

function listenBefore(hook) {
  return history.listenBefore(function (location, callback) {
    _runTransitionHook2['default'](
      hook,
      addQuery(location),
      callback
    );
  });
}

Итак, решение этой проблемы выглядит примерно так:

componentDidMount() {
    this.removeListener = this.context.router.listenBefore(this.closeDropdown)
  }
componentWillUnmount() {
    this.removeListener()
  }
closeDropdown = () => this.setState({ isOpen: false })

Но удачи в том, чтобы разобраться в этом самостоятельно. Оставьте комментарий, если знаете способ получше.