Обнаружение изменения маршрута с помощью 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';