Обнаружение изменения маршрута с помощью react-router

Я должен реализовать некоторую бизнес-логику в зависимости от истории просмотра.

что я хочу сделать, это что-то вроде этого:

reactRouter.onUrlChange(url => {
   this.history.push(url);
});

есть ли способ получить обратный вызов от react-router при обновлении URL-адреса?

2 ответов


вы можете использовать history.listen().js

ReactDOM.render(
      <BrowserRouter>
            <AppContainer>
                   <Route exact path="/" Component={...} />
                   <Route exact path="/Home" Component={...} />
           </AppContainer>
        </BrowserRouter>,
  document.getElementById('root')
);

а потом в AppContainer.js

class App extends Component {

  componentWillMount() {
    this.unlisten = this.props.history.listen((location, action) => {
      console.log("on route change");
    });
  }
  componentWillUnmount() {
      this.unlisten();
  }
  render() {
     return (
         <div>{this.props.children}</div>
      );
  }
}
export default withRouter(App);

из истории docs:

вы можете слушать изменения в текущем местоположении, используя history.listen:

history.listen((location, action) => {
      console.log(`The current URL is ${location.pathname}${location.search}${location.hash}`)
  console.log(`The last navigation action was ${action}`)
})

объект location реализует подмножество окна.местоположение интерфейс, в том числе:

**location.pathname** - The path of the URL
**location.search** - The URL query string
**location.hash** - The URL hash fragment

местоположения также могут иметь следующие свойства:

расположение.государство - некоторое дополнительное состояние для этого расположение, которое не находится в URL (поддерживается в createBrowserHistory и createMemoryHistory)

location.key - уникальная строка, представляющая это местоположение (поддерживается в createBrowserHistory и createMemoryHistory)

действие является одним из PUSH, REPLACE, or POP в зависимости от того, как пользователь добрался до текущего URL.

при использовании react-router v3 вы можете использовать history.listen() С history пакет, как упоминалось выше, или вы также можете использовать browserHistory.listen()

вы можно настроить и использовать ваши маршруты, как

import {browserHistory} from 'react-router';

class App extends React.Component {

    componentDidMount() {
          this.unlisten = browserHistory.listen( location =>  {
                console.log('route changes');

           });

    }
    componentWillUnmount() {
        this.unlisten();

    }
    render() {
        return (
               <Route path="/" onChange={yourHandler} component={AppContainer}>
                   <IndexRoute component={StaticContainer}  />
                   <Route path="/a" component={ContainerA}  />
                   <Route path="/b" component={ContainerB}  />
            </Route>
        )
    }
} 

если вы хотите слушать history объект в мире, вам придется создать его самостоятельно и передать его в Router. Тут вы можете слушать его с его listen() способ:

// Use Router from react-router, not BrowserRouter.
import { Router } from 'react-router';

// Create history object.
import createHistory from 'history/createBrowserHistory';
const history = createHistory();

// Listen to history changes.
// You can unlisten by calling the constant (`unlisten()`).
const unlisten = history.listen((location, action) => {
  console.log(action, location.pathname, location.state);
});

// Pass history to Router.
<Router history={history}>
   ...
</Router>

еще лучше, если вы создадите объект истории как модуль, так что вы можете легко импортировать его в любом месте вам может понадобиться (например,import history from './history';