亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

React組件卸載、路由跳轉(zhuǎn)、頁面關(guān)閉(刷新)之前進(jìn)行提示

leanote / 1974人閱讀

摘要:組件卸載生命周期路由跳轉(zhuǎn)和頁面關(guān)閉三者看起來有些類似的地方,比如都是當(dāng)前組件即將從視口消失,但實(shí)際上所觸發(fā)的事件均不相同。至此已經(jīng)實(shí)現(xiàn)了路由跳轉(zhuǎn)時(shí)提醒用戶進(jìn)行保存的功能。

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

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

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

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

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

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

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

componentWillUnmount

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

路由守衛(wèi)-

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

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

import {Prompt} from "react-router-dom";
const Editor=()=>{
    return (
        
"文章要保存吼,確定離開嗎?"} />
) }

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

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

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

應(yīng)該在組件掛載時(shí)監(jiān)聽事件,組件卸載時(shí)移除事件監(jiān)聽。因?yà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 ...
}

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

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

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

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101121.html

相關(guān)文章

  • react-router v4.x 源碼拾遺1

    摘要:還是先來一段官方的基礎(chǔ)使用案例,熟悉一下整體的代碼流程中使用了端常用到的等一些常用組件,作為的頂層組件來獲取的和設(shè)置回調(diào)函數(shù)來更新。 react-router是react官方推薦并參與維護(hù)的一個(gè)路由庫,支持瀏覽器端、app端、服務(wù)端等常見場景下的路由切換功能,react-router本身不具備切換和跳轉(zhuǎn)路由的功能,這些功能全部由react-router依賴的history庫完成,his...

    itvincent 評論0 收藏0
  • react-router v4.x 源碼拾遺1

    摘要:還是先來一段官方的基礎(chǔ)使用案例,熟悉一下整體的代碼流程中使用了端常用到的等一些常用組件,作為的頂層組件來獲取的和設(shè)置回調(diào)函數(shù)來更新。 react-router是react官方推薦并參與維護(hù)的一個(gè)路由庫,支持瀏覽器端、app端、服務(wù)端等常見場景下的路由切換功能,react-router本身不具備切換和跳轉(zhuǎn)路由的功能,這些功能全部由react-router依賴的history庫完成,his...

    Joyven 評論0 收藏0
  • 徹底理清前端單頁面應(yīng)用(SPA)的實(shí)現(xiàn)原理 【精讀源碼】

    showImg(https://segmentfault.com/img/bVbvOmp?w=1612&h=888); 隨著React Vue前端框架的興起,出現(xiàn)了Vue-router,react-router-dom等前端路由管理庫,利用他們構(gòu)建出來的單頁面應(yīng)用,也是越來越接近原生的體驗(yàn),再也不是以前的點(diǎn)擊標(biāo)簽跳轉(zhuǎn)頁面,刷新整個(gè)頁面了,那么他們的原理是什么呢? 優(yōu)質(zhì)gitHub開源練手項(xiàng)目: ...

    xiaodao 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<