需求 当前页面数据修改后未保存时,对路由跳转进行拦截 参考

    原理 Prompt的message属性除了字符串还可以传递一个函数

    这个函数 return true 的时候路由可以正常切换,

    return false 时候路由切换就被拦截

    下文中的 ConfirmModal 参考 Ant Design — 基于Modal.confirm()的二次封装

    1. import React, {Component} from 'react';
    2. import {Prompt} from 'react-router';
    3. class Demo extends Component {
    4. state = {
    5. isPrompt: false, // true 数据未编辑
    6. };
    7. handlePrompt = location => {
    8. /**
    9. * return true 路由正常
    10. * return false 路由切换被拦截
    11. * */
    12. const {history} = this.props;
    13. if (!this.state.isPrompt) {
    14. // 数据编辑过了 离开页面时候要判断是不是要保存
    15. this.isUpdate = false; // 进入编辑提示框后将数据更新关闭,不然点击关闭后还会循环打开提示框
    16. const data = {
    17. title: '提示',
    18. content: '您还未保存页面内容,确定需要离开吗?',
    19. okText: '保存离开',
    20. cancelText: '不保存离开'
    21. };
    22. ConfirmModal(
    23. data,
    24. close => {
    25. this.setState({isPrompt: true}, () => {
    26. console.log(1);
    27. history.push({pathname: location.pathname, state: location.state});
    28. close();
    29. });
    30. },
    31. close => {
    32. this.setState({isPrompt: true}, () => {
    33. console.log(2);
    34. history.push({pathname: location.pathname, state: location.state});
    35. close();
    36. });
    37. }
    38. );
    39. return false;
    40. }
    41. return true;
    42. };
    43. render() {
    44. return(
    45. <div>
    46. <Prompt message={this.handlePrompt} />
    47. </div>;
    48. )
    49. }
    50. isUpdate = true; //用于判断是否执行数据更新
    51. componentDidUpdate() {
    52. if (this.isUpdate) {
    53. const res = _.isEqual(this.state.parameter, this.state.sourceData);
    54. this.state.isPrompt = res;
    55. }
    56. }
    57. }
    58. export default a;