關(guān)于react-router中的Prompt組件使用心得
在最近的react項(xiàng)目中, 遇到了一個(gè)需求, 點(diǎn)擊圖片的時(shí)候, 會(huì)出現(xiàn)一個(gè)大圖預(yù)覽, 其實(shí)就是一個(gè)遮罩層, 專門用來顯示大圖的, 但因?yàn)槭且粋€(gè)APP, 所以難免會(huì)有用戶點(diǎn)開大圖后, 不用正常的關(guān)閉按鈕關(guān)閉大圖遮罩層, 而是點(diǎn)擊手機(jī)的返回鍵,這樣就會(huì)造成頁面后退, 而不僅僅只是關(guān)閉遮罩層了, 所以在此, 我決定使用react-router里的Prompt組件
Prompt
組件作用
該組件主要作用是,在用戶準(zhǔn)備離開該頁面時(shí), 彈出提示, 返回true或者false, 如果為true, 則離開頁面, 如果為false, 則停留在該頁面
引入Prompt組件
import {Prompt } from "react-router-dom";
基本用法1
prompt組件里有一個(gè)message屬性,該屬性就是在用戶離開頁面時(shí), 所提示的文字內(nèi)容
<Prompt message="您確定要離開該頁面嗎?" />
基本用法2
prompt組件中還有一個(gè)when屬性, 就是渲染該組件的條件, 應(yīng)該傳入一個(gè)布爾值,值為true時(shí),則渲染該組件
<Prompt message="您確定要離開該頁面嗎?" when={this.state.isOpen} />
基本用法3
prompt組件的message屬性,同時(shí)還可以傳入一個(gè)方法來接收要傳入的文字, 但是要注意的是, 使用三元運(yùn)算符操作, 可以向其中直接傳入文字, 但是如果使用if else來做判斷,那么將無法直接向其中傳入文字
<Prompt message = {() => { this.state.isOpen? false: "您確定要離開該頁面嗎?" }} />
基本用法3(拓展)
在我的工作項(xiàng)目中,想要實(shí)現(xiàn)的一種效果就是, 當(dāng)用戶,在瀏覽大圖時(shí), 按下手機(jī)的返回按鈕時(shí), 將大圖遮罩層關(guān)閉,并且保留在當(dāng)前頁面, 而如果用戶沒有點(diǎn)開大圖時(shí),按下了手機(jī)的返回按鈕時(shí), 則提示用戶是否離開, 這里通過this.state.isOpen來控制大圖預(yù)覽遮罩層的顯示和隱藏, 上面說過, if else判斷無法向組價(jià)中直接傳入文字內(nèi)容, 但是幸好, message能夠接收一個(gè)方法, 而這個(gè)方法, 最終只需要返回一個(gè)true或者false就可以, 不管中間你寫什么樣的代碼都無所謂
<Prompt message = {(location)=>{ if(!this.state.open) { let leave = window.confirm("您確定要離開該頁面嗎?") if(!leave) { return false } }else { this.setState({ open: false }) return false } }} />
在上面的代碼中, 我在message中傳入了一個(gè)函數(shù) , 首先是判斷大圖預(yù)覽有沒有被打開, 如果沒有打開, 則通過調(diào)用window.confirm的方法, 設(shè)置網(wǎng)頁的彈出層,如果用戶點(diǎn)擊取消, 則返回false
補(bǔ)充:React-Router <Prompt> 的使用
使用場(chǎng)景:在離開頁面之前,需要判斷當(dāng)前編輯的內(nèi)容是否已經(jīng)保存,如果沒保存,則彈出提示框,提示用戶保存。
查看 API 文檔
【總結(jié)】:Prompt 有兩個(gè)屬性:message
-當(dāng)用戶離開頁面時(shí)給出的提示信息,when
-是否渲染,設(shè)置為 true 時(shí),離開頁面時(shí)總會(huì)渲染,設(shè)置為 false 時(shí),離開頁面時(shí)不會(huì)渲染。我們就可以利用when
設(shè)置渲染的時(shí)機(jī),當(dāng)用戶對(duì)頁面內(nèi)容進(jìn)行編輯,且未保存時(shí)離開,設(shè)置when=true
,其他情況設(shè)置when=false
。
代碼
import { Button, Form, Input, Modal } from "antd"; import { useState } from "react"; import { Prompt, useHistory } from "react-router-dom"; export default function PromptDemo() { const history = useHistory(); const [form] = Form.useForm(); const [isPrompt, setPrompt] = useState(false); const handlePrompt = () => { if (!isPrompt) { return true; } Modal.confirm({ title: "未保存", content: "當(dāng)前內(nèi)容未保存,確認(rèn)退出嗎?", onOk: () => { setPrompt(false); history.goBack(); } }); return false; }; const onFinish = (values: any) => { setPrompt(false); console.log(values); }; return ( <div style={{ width: "300px", padding: "40px" }}> <Prompt when={isPrompt} message={handlePrompt} /> <Form form={form} labelCol={{ span: 6 }} onFinish={onFinish}> <Form.Item label="姓名" name="name"> <Input onChange={() => setPrompt(true)} /> </Form.Item> <Form.Item label="手機(jī)號(hào)" name="mobile"> <Input onChange={() => setPrompt(true)} /> </Form.Item> <Form.Item> <Button type="primary" htmlType="submit"> 保存 </Button> <Button htmlType="button" style={{ marginLeft: "24px" }} onClick={() => history.goBack()} > 返回 </Button> </Form.Item> </Form> </div> ); }
到此這篇關(guān)于關(guān)于react-router中的Prompt組件使用心得的文章就介紹到這了,更多相關(guān)react router中Prompt組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談使用React.setState需要注意的三點(diǎn)
本篇文章主要介紹了淺談使用React.setState需要注意的三點(diǎn),提出了三點(diǎn)對(duì) React 新手來說是很容易忽略的地方,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12React Antd中如何設(shè)置表單只輸入數(shù)字
這篇文章主要介紹了React Antd中如何設(shè)置表單只輸入數(shù)字問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06react實(shí)現(xiàn)簡(jiǎn)單的拖拽功能
這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)簡(jiǎn)單的拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03React Hook用法示例詳解(6個(gè)常見hook)
這篇文章主要介紹了React Hook用法詳解(6個(gè)常見hook),本文通過實(shí)例代碼給大家介紹了6個(gè)常見hook,需要的朋友可以參考下2021-04-04