React組件如何實(shí)現(xiàn)卸載、路由跳轉(zhuǎn)以及頁(yè)面關(guān)閉之前進(jìn)行提示的功能-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)React組件如何實(shí)現(xiàn)卸載、路由跳轉(zhuǎn)以及頁(yè)面關(guān)閉之前進(jìn)行提示的功能的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)公司是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:響應(yīng)式網(wǎng)站開(kāi)發(fā)、成都品牌網(wǎng)站建設(shè)成都營(yíng)銷網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。

React組件卸載生命周期、路由跳轉(zhuǎn)和頁(yè)面關(guān)閉三者看起來(lái)有些類似的地方,比如都是當(dāng)前組件即將從視口消失,但實(shí)際上所觸發(fā)的事件均不相同。以一個(gè)實(shí)際案例出發(fā):

某單頁(yè)應(yīng)用的文章編輯頁(yè)用戶正在編輯文章,此時(shí)尚未保存。

當(dāng)用戶不小心要跳轉(zhuǎn)到另外一個(gè)路由時(shí)需要提醒用戶是否繼續(xù)跳轉(zhuǎn),這個(gè)過(guò)程需要觸發(fā)路由跳轉(zhuǎn)以及組件卸載;

而用戶不小心點(diǎn)了關(guān)閉標(biāo)簽頁(yè)按鈕,或刷新了頁(yè)面。這個(gè)過(guò)程觸發(fā)了頁(yè)面卸載事件;

在這個(gè)案例中我們需要實(shí)現(xiàn):

1. 用戶跳轉(zhuǎn)頁(yè)面時(shí)彈出提示框(路由采用histroy模式)

2. 用戶關(guān)閉頁(yè)面時(shí)彈出提示框

componentWillUnmount

首先這個(gè)鉤子函數(shù)是在組件卸載前調(diào)用的一個(gè)函數(shù),它并不能阻止當(dāng)前組件的卸載。所以不要想方設(shè)法在這里做提示,因?yàn)榧幢闾崾玖耍M件還是會(huì)卸載,文章還是會(huì)消失。

路由守衛(wèi)-<Prompt/>

為了實(shí)現(xiàn)第一個(gè)功能,需要一個(gè)跳轉(zhuǎn)路由之前進(jìn)行的判斷。在react-router-dom 4.0 之后取消了先前的路由守衛(wèi)(其實(shí)我沒(méi)研究過(guò)之前版本的,這個(gè)描述摘自網(wǎng)絡(luò))。在react-router-dom 4.0之后,實(shí)現(xiàn)這個(gè)功能可以依靠<Prompt/>組件。文檔鏈接↗

把這個(gè)組件添加到你的文章編輯頁(yè)組件的任意部分

import {Prompt} from 'react-router-dom';
const Editor=()=>{
    return (
        <div>
          <Prompt
           when={true}
            message={location => '文章要保存吼,確定離開(kāi)嗎?'}
          />
        </div>
    )
}

這里有一點(diǎn)需要注意,使用<Prompt/>時(shí),你的路由跳轉(zhuǎn)必須通過(guò)<Link/>實(shí)現(xiàn),而不能依靠<a/>原生標(biāo)簽。
點(diǎn)擊取消時(shí)就會(huì)留在當(dāng)前頁(yè)面。至此已經(jīng)實(shí)現(xiàn)了路由跳轉(zhuǎn)時(shí)提醒用戶進(jìn)行保存的功能。

窗口關(guān)閉事件-beforeunload

實(shí)現(xiàn)第二個(gè)功能需要依靠對(duì)窗口的監(jiān)聽(tīng)。React應(yīng)用中對(duì)于窗口事件的應(yīng)用遠(yuǎn)沒(méi)有DOM事件頻繁,所以好久沒(méi)碰到還是有點(diǎn)手生的。最關(guān)鍵的就是,應(yīng)該在何時(shí)進(jìn)行監(jiān)聽(tīng)?

應(yīng)該在組件掛載時(shí)監(jiān)聽(tīng)事件,組件卸載時(shí)移除事件監(jiān)聽(tīng)。因?yàn)槲乙呀?jīng)開(kāi)始全面采用hooks新特性了,所以這里使用到useEffect。

import React,{useEffect} from 'react';

const Editor=()=>{

 //監(jiān)聽(tīng)窗口事件
    useEffect(() => {
        const listener = ev => {
            ev.preventDefault();
            ev.returnValue='文章要保存吼,確定離開(kāi)嗎?';
        };
       window.addEventListener('beforeunload', listener);
        return () => {
           window.removeEventListener('beforeunload', listener)
        }
    }, []);
    
//return ...
}

這里有幾個(gè)需要注意的地方:

1、useEffect第二個(gè)參數(shù)為空數(shù)組,表示只調(diào)用了componentDidMount和componentWillUnmount兩個(gè)鉤子

2、事件監(jiān)聽(tīng)和移除的第二個(gè)參數(shù)為同一個(gè)事件處理函數(shù)

3、在beforeunload事件中的confirm,prompt,alert會(huì)被忽略。取而代之的是一個(gè)瀏覽器內(nèi)置的對(duì)話框。(參考:MDN|beforeunload)

4、必須要有returnValue且為非空字符串,但是在某些瀏覽器中這個(gè)值并不會(huì)作為彈窗信

感謝各位的閱讀!關(guān)于React組件如何實(shí)現(xiàn)卸載、路由跳轉(zhuǎn)以及頁(yè)面關(guān)閉之前進(jìn)行提示的功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

文章標(biāo)題:React組件如何實(shí)現(xiàn)卸載、路由跳轉(zhuǎn)以及頁(yè)面關(guān)閉之前進(jìn)行提示的功能-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://bm7419.com/article18/dpdjgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、移動(dòng)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈、企業(yè)建站云服務(wù)器、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)