這篇文章給大家分享的是有關(guān)React組件如何實現(xiàn)卸載、路由跳轉(zhuǎn)以及頁面關(guān)閉之前進(jìn)行提示的功能的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
React組件卸載生命周期、路由跳轉(zhuǎn)和頁面關(guān)閉三者看起來有些類似的地方,比如都是當(dāng)前組件即將從視口消失,但實際上所觸發(fā)的事件均不相同。以一個實際案例出發(fā):
某單頁應(yīng)用的文章編輯頁用戶正在編輯文章,此時尚未保存。
當(dāng)用戶不小心要跳轉(zhuǎn)到另外一個路由時需要提醒用戶是否繼續(xù)跳轉(zhuǎn),這個過程需要觸發(fā)路由跳轉(zhuǎn)以及組件卸載;
而用戶不小心點了關(guān)閉標(biāo)簽頁按鈕,或刷新了頁面。這個過程觸發(fā)了頁面卸載事件;
在這個案例中我們需要實現(xiàn):
1. 用戶跳轉(zhuǎn)頁面時彈出提示框(路由采用histroy模式)
2. 用戶關(guān)閉頁面時彈出提示框
componentWillUnmount
首先這個鉤子函數(shù)是在組件卸載前調(diào)用的一個函數(shù),它并不能阻止當(dāng)前組件的卸載。所以不要想方設(shè)法在這里做提示,因為即便提示了,組件還是會卸載,文章還是會消失。
路由守衛(wèi)-<Prompt/>
為了實現(xiàn)第一個功能,需要一個跳轉(zhuǎn)路由之前進(jìn)行的判斷。在react-router-dom 4.0
之后取消了先前的路由守衛(wèi)(其實我沒研究過之前版本的,這個描述摘自網(wǎng)絡(luò))。在react-router-dom 4.0
之后,實現(xiàn)這個功能可以依靠<Prompt/>
組件。文檔鏈接↗
把這個組件添加到你的文章編輯頁組件的任意部分
import {Prompt} from 'react-router-dom'; const Editor=()=>{ return ( <div> <Prompt when={true} message={location => '文章要保存吼,確定離開嗎?'} /> </div> ) }
這里有一點需要注意,使用<Prompt/>時,你的路由跳轉(zhuǎn)必須通過<Link/>實現(xiàn),而不能依靠<a/>原生標(biāo)簽。
點擊取消時就會留在當(dāng)前頁面。至此已經(jīng)實現(xiàn)了路由跳轉(zhuǎn)時提醒用戶進(jìn)行保存的功能。
窗口關(guān)閉事件-beforeunload
實現(xiàn)第二個功能需要依靠對窗口的監(jiān)聽。React應(yīng)用中對于窗口事件的應(yīng)用遠(yuǎn)沒有DOM事件頻繁,所以好久沒碰到還是有點手生的。最關(guān)鍵的就是,應(yīng)該在何時進(jìn)行監(jiān)聽?
應(yīng)該在組件掛載時監(jiān)聽事件,組件卸載時移除事件監(jiān)聽。因為我已經(jīng)開始全面采用hooks新特性了,所以這里使用到useEffect。
import React,{useEffect} from 'react'; const Editor=()=>{ //監(jiān)聽窗口事件 useEffect(() => { const listener = ev => { ev.preventDefault(); ev.returnValue='文章要保存吼,確定離開嗎?'; }; window.addEventListener('beforeunload', listener); return () => { window.removeEventListener('beforeunload', listener) } }, []); //return ... }
這里有幾個需要注意的地方:
1、useEffect第二個參數(shù)為空數(shù)組,表示只調(diào)用了componentDidMount和componentWillUnmount兩個鉤子
2、事件監(jiān)聽和移除的第二個參數(shù)為同一個事件處理函數(shù)
3、在beforeunload事件中的confirm,prompt,alert會被忽略。取而代之的是一個瀏覽器內(nèi)置的對話框。(參考:MDN|beforeunload)
4、必須要有returnValue且為非空字符串,但是在某些瀏覽器中這個值并不會作為彈窗信
感謝各位的閱讀!關(guān)于React組件如何實現(xiàn)卸載、路由跳轉(zhuǎn)以及頁面關(guān)閉之前進(jìn)行提示的功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章標(biāo)題:React組件如何實現(xiàn)卸載、路由跳轉(zhuǎn)以及頁面關(guān)閉之前進(jìn)行提示的功能-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.chinadenli.net/article18/dpdjgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、移動網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、企業(yè)建站、云服務(wù)器、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)