React 路由器 v4 路由 onchange 事件
React router v4 route onchange event
有什么方法可以在使用 react router v4.1 更改路由时触发事件?我需要在每次路线更改时触发一个功能。我在通用 react-redux 应用程序的客户端使用来自 react-router-dom
的 BrowserRouter
和 Switch
。
我通过使用附加组件包装我的应用程序解决了这个问题。该组件在 Route
中使用,因此它也可以访问 history
属性。
<BrowserRouter>
<Route component={App} />
</BrowserRouter>
App
组件订阅历史变化,所以我可以在路由变化时做一些事情:
export class App extends React.Component {
componentWillMount() {
const { history } = this.props;
this.unsubscribeFromHistory = history.listen(this.handleLocationChange);
this.handleLocationChange(history.location);
}
componentWillUnmount() {
if (this.unsubscribeFromHistory) this.unsubscribeFromHistory();
}
handleLocationChange = (location) => {
// Do something with the location
}
render() {
// Render the rest of the application with its routes
}
}
不确定这是否是在 V4 中执行此操作的正确方法,但我没有在路由器本身上找到任何其他扩展点,所以这似乎可以代替。希望对您有所帮助。
编辑:也许您也可以通过将 <Route />
包装在您自己的组件中并使用类似 componentWillUpdate
的东西来检测位置变化来实现相同的目标。
反应:v15.x,反应路由器:v4.x
components/core/App.js:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { BrowserRouter } from 'react-router-dom';
class LocationListener extends Component {
static contextTypes = {
router: PropTypes.object
};
componentDidMount() {
this.handleLocationChange(this.context.router.history.location);
this.unlisten =
this.context.router.history.listen(this.handleLocationChange);
}
componentWillUnmount() {
this.unlisten();
}
handleLocationChange(location) {
// your staff here
console.log(`- - - location: '${location.pathname}'`);
}
render() {
return this.props.children;
}
}
export class App extends Component {
...
render() {
return (
<BrowserRouter>
<LocationListener>
...
</LocationListener>
</BrowserRouter>
);
}
}
index.js:
import App from 'components/core/App';
render(<App />, document.querySelector('#root'));
有什么方法可以在使用 react router v4.1 更改路由时触发事件?我需要在每次路线更改时触发一个功能。我在通用 react-redux 应用程序的客户端使用来自 react-router-dom
的 BrowserRouter
和 Switch
。
我通过使用附加组件包装我的应用程序解决了这个问题。该组件在 Route
中使用,因此它也可以访问 history
属性。
<BrowserRouter>
<Route component={App} />
</BrowserRouter>
App
组件订阅历史变化,所以我可以在路由变化时做一些事情:
export class App extends React.Component {
componentWillMount() {
const { history } = this.props;
this.unsubscribeFromHistory = history.listen(this.handleLocationChange);
this.handleLocationChange(history.location);
}
componentWillUnmount() {
if (this.unsubscribeFromHistory) this.unsubscribeFromHistory();
}
handleLocationChange = (location) => {
// Do something with the location
}
render() {
// Render the rest of the application with its routes
}
}
不确定这是否是在 V4 中执行此操作的正确方法,但我没有在路由器本身上找到任何其他扩展点,所以这似乎可以代替。希望对您有所帮助。
编辑:也许您也可以通过将 <Route />
包装在您自己的组件中并使用类似 componentWillUpdate
的东西来检测位置变化来实现相同的目标。
反应:v15.x,反应路由器:v4.x
components/core/App.js:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { BrowserRouter } from 'react-router-dom';
class LocationListener extends Component {
static contextTypes = {
router: PropTypes.object
};
componentDidMount() {
this.handleLocationChange(this.context.router.history.location);
this.unlisten =
this.context.router.history.listen(this.handleLocationChange);
}
componentWillUnmount() {
this.unlisten();
}
handleLocationChange(location) {
// your staff here
console.log(`- - - location: '${location.pathname}'`);
}
render() {
return this.props.children;
}
}
export class App extends Component {
...
render() {
return (
<BrowserRouter>
<LocationListener>
...
</LocationListener>
</BrowserRouter>
);
}
}
index.js:
import App from 'components/core/App';
render(<App />, document.querySelector('#root'));