【Web前端问题】初学 React Router 请教在 ES6 下 如何实现路由跳转前确认

根据 React Router 的官方文档:

React Router 提供一个 routerWillLeave 生命周期钩子,这使得 React 组件可以拦截正在发生的跳转,或在离开 route 前提示用户

链接:react-guide.github.io/react-router-cn/docs/guides/advanced/ConfirmingNavigation.html" rel="nofollow">跳转前确认 | React Router 中文文档

所以我目前是想在一个嵌套得较深的子组件内使用这个 routerWillLeave 钩子,由于我使用了 ES6,组件的代码类似下面这样:

class XXX extends XXX {

...

}

export default XXX;

所以没有办法使用文档中的 mixin 方法,我想到了使用 react-mixin,参考 StackOverFlow 写了下面的代码:

import reactMixin from 'react-mixin';

import { withRouter, Lifecycle } from 'react-router'

@reactMixin.decorate(Lifecycle)

class Page extends Component {

static propTypes = {

router: PropTypes.object,

route: PropTypes.object,

}

constructor(props, context) {

super(props, context);

this.state = {

unsaved: true,

}

}

componentDidMount() {

this.props.router.setRouteLeaveHook(this.props.route, () => {

if (this.state.unsaved)

return 'You have unsaved information, are you sure you want to leave this page?'

})

}

}

export default withRouter(Page)

打断点发现 this.props.route 是 undefined,随后根据文档说明,对顶层组件、父级组件都尝试了进行配置
mixin,但是配置后发现 route 会冲突,希望有解决过这类问题的各路高手能够帮忙。十分感谢

2017-03-25-121453.jpg

回答:

export default class XXX extends React.Component {

constructor(props) {

super(props);

this.props.router.setRouteLeaveHook(

this.props.route,

this.routerLeaveInformation

)

}

routerLeaveInformation() {

return 'You have unsaved information, are you sure you want to leave this page?';

}

}

这是v3版本的,其他版本没试

回答:

现在 React Router 已经发布 4.0 了,而你看的中文文档还是 0.13 版。

可以看看这个 https://reacttraining.cn/core...

回答:

这是v3版本的:

import React from 'react'

import { withRouter } from 'react-router'

class Page extends React.Component {

componentDidMount() {

this.props.router.setRouteLeaveHook(this.props.route, this.routerWillLeave)

}

routerWillLeave(nextLocation) {

if (true) {

return 'Oops...'

}

}

render() {

return (

<div>Something...</div>

)

}

}

export default withRouter(Page)

以上是 【Web前端问题】初学 React Router 请教在 ES6 下 如何实现路由跳转前确认 的全部内容, 来源链接: utcz.com/a/140228.html

回到顶部