Скажем, я использую 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 })
Но удачи в том, чтобы разобраться в этом самостоятельно. Оставьте комментарий, если знаете способ получше.