Кнопка перехвата / обработки браузера в React-router?

Я использую вкладки Material-ui, которые управляются, и я использую их для ссылок (React-router), таких как:

    <Tab value={0} label="dashboard" containerElement={<Link to="/dashboard/home"/>}/>
    <Tab value={1} label="users" containerElement={<Link to="/dashboard/users"/>} />
  <Tab value={2} label="data" containerElement={<Link to="/dashboard/data"/>} />

Если я currenty visting dashboard / data, и я нажимаю кнопку "Назад" браузера Я иду (например) на панель мониторинга/пользователей, но выделенная вкладка все еще остается на панели мониторинга/данных (значение=2)

Я могу изменить, установив состояние, но я не знаю, как обрабатывать событие при нажатии кнопки "Назад" браузера?

Я нашел это:

window.onpopstate = this.onBackButtonEvent;

но это называется каждый раз, когда состояние изменяется (не только на событие кнопки Назад)

4 ответов


вот как я закончил это делать:

componentDidMount() {
    this._isMounted = true;
    window.onpopstate = ()=> {
      if(this._isMounted) {
        const { hash } = location;
        if(hash.indexOf('home')>-1 && this.state.value!==0)
          this.setState({value: 0})
        if(hash.indexOf('users')>-1 && this.state.value!==1)
          this.setState({value: 1})
        if(hash.indexOf('data')>-1 && this.state.value!==2)
          this.setState({value: 2})
      }
    }
  }

спасибо всем за помощь lol


это немного старый вопрос, и вы, вероятно, уже получили свой ответ, но для таких людей, как я, которые нуждались в этом, я оставляю этот ответ.

использование react-router сделало работу простой как таковой:

import { browserHistory } from 'react-router';

componentDidMount() {
    super.componentDidMount();

    this.onScrollNearBottom(this.scrollToLoad);

    this.backListener = browserHistory.listen(location => {
      if (location.action === "POP") {
        // Do your stuff
      }
    });
  }

componentWillUnmount() {
    super.componentWillUnmount();
    // Unbind listener
    this.backListener();
}

версия 3.x API маршрутизатора React имеет набор утилит вы можете использовать, чтобы выставить событие кнопки "Назад", прежде чем событие регистрируется в истории браузера. Сначала вы должны обернуть свой компонент в withRouter() компонент более высокого порядка. Затем вы можете использовать setRouteLeaveHook() функция, которая принимает любой route объект с допустимым path свойство и функция обратного вызова.

import {Component} from 'react';
import {withRouter} from 'react-router';

class Foo extends Component {
  componentDidMount() {
    this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave);
  }

  routerWillLeave(nextState) { // return false to block navigation, true to allow
    if (nextState.action === 'POP') {
      // handle "Back" button clicks here
    }
  }
}

export default withRouter(Foo);

я использовал withrouter hoc, чтобы получить History prop и просто написать метод componentDidMount ():

componentDidMount() {
    if (this.props.history.action === "POP") {
        // custom back button implementation
    }
}