react-router中离开确认组件Prompt

本文介绍了如何在React-Router 4中使用Prompt组件实现离开页面时的确认提示。当用户尝试离开包含未保存数据的页面时,系统会显示一个确认对话框。通过设置Prompt的属性和自定义消息,可以灵活控制用户的离开行为。文中还分享了在实际项目中结合ant-design-mobile的Modal对话框解决异步问题的技巧,将异步转换为同步,满足复杂场景的需求。
摘要由CSDN通过智能技术生成

在某些页面中,特别是设计到多个表单项填写的,产品需求要求:在离开页面时,需要提示用户当前页面的数据尚未保存,二次确认后才能离开页面。

大概效果如图:

幸运的是,在react-router 4中自带此类组件Prompt,这是官方示例

支持的参数也比较简单:

  1. when:设置是否启用Prompt功能。比如表单页未填写时,就不需要离开确认。
  2. message:string。设置Prompt提示内容
  3. message:function。此时返回参数分为true/false,即bool类型。返回false就继续停留在当前页面,返回true则跳转到新页面。

所以结合参数whenmessage function可以创造无限可能,比如指定提示框等,哈哈哈哈。下面给出两篇文章参考:

    <
React Router 提供了一些钩子函数来拦截路由,这样我们就可以在路由跳转之前或之后进行相关的操作。下面是一个简单的路由拦截示例: ```javascript import React from 'react'; import { BrowserRouter as Router, Route, Link, Redirect } from 'react-router-dom'; const isAuthenticated = true; const PrivateRoute = ({ component: Component, ...rest }) => ( <Route {...rest} render={(props) => ( isAuthenticated === true ? <Component {...props} /> : <Redirect to='/login' /> )} /> ); const LoginPage = () => ( <div> <h1>Login Page</h1> </div> ); const HomePage = () => ( <div> <h1>Home Page</h1> </div> ); const App = () => ( <Router> <div> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/login'>Login</Link></li> </ul> <hr /> <PrivateRoute exact path='/' component={HomePage} /> <Route path='/login' component={LoginPage} /> </div> </Router> ); export default App; ``` 在上面的代码,我们定义了一个 `PrivateRoute` 组件来实现路由拦截。如果用户已经认证,则展示 `component` 组件,否则重定向到登录页面。 另外,我们还定义了两个页面组件:`HomePage` 和 `LoginPage`。在 `App` 组件,我们使用 `PrivateRoute` 组件来保护 `HomePage` 组件,这样只有已经认证的用户才能访问该页面。 如果你想在路由跳转之前进行相关的操作,可以使用 `react-router` 提供的 `Prompt` 组件。下面是一个简单的示例: ```javascript import React, { useState } from 'react'; import { BrowserRouter as Router, Route, Link, Prompt } from 'react-router-dom'; const App = () => { const [isBlocking, setIsBlocking] = useState(false); const handleChange = (event) => { setIsBlocking(event.target.value.length > 0); }; return ( <Router> <div> <ul> <li><Link to='/'>Home</Link></li> <li><Link to='/about'>About</Link></li> </ul> <hr /> <Prompt when={isBlocking} message={location => `Are you sure you want to go to ${location.pathname}?`} /> <Route exact path='/' render={() => ( <div> <h1>Home Page</h1> <input type='text' onChange={handleChange} /> </div> )} /> <Route path='/about' render={() => ( <div> <h1>About Page</h1> </div> )} /> </div> </Router> ); }; export default App; ``` 在上面的代码,我们使用 `Prompt` 组件来拦截路由,在用户输入内容,如果尚未保存,就弹出提示框。提示框的内容可以通过 `message` 属性来设置。如果用户选择离开当前页面,则路由会跳转到目标页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值