最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

修復(fù)Next.js中window?is?not?defined方法詳解

 更新時(shí)間:2022年12月13日 09:28:45   作者:Jovie  
這篇文章主要為大家介紹了修復(fù)Next.js中window?is?not?defined方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

這個(gè)問(wèn)題與Next.js的服務(wù)器端渲染有關(guān)。Next.js默認(rèn)會(huì)嘗試為您的網(wǎng)站使用SSR。這意味著,由于我們是在服務(wù)器上而不是在瀏覽器中,所以 "窗口 "對(duì)象并不存在。解決這個(gè)問(wèn)題的方法是強(qiáng)迫Next.js在瀏覽器中運(yùn)行你的代碼,我將解釋如何做到這一點(diǎn)。

使用useEffect鉤子

useEffect鉤子總是在瀏覽器中運(yùn)行,所以我們可以用它來(lái)確保我們的代碼只能從那里運(yùn)行。關(guān)于鉤子的快速入門知識(shí),請(qǐng)查看這篇文章。

下面是一個(gè)簡(jiǎn)單應(yīng)用的示例代碼,它將用戶最后一次訪問(wèn)網(wǎng)站的時(shí)間存儲(chǔ)在本地存儲(chǔ)中。如果你不熟悉在React或Next.js中使用localStorage,可以看看我們這里的這個(gè)教程,它使用了類似的方法。這個(gè)方法是相同的,但有一個(gè)小的區(qū)別,那就是你可以在vanilla React組件的主體中使用localStorage,因?yàn)槟J(rèn)沒(méi)有SSR:

function updateLastSeen() {
    const lastSeen = window.localStorage.getItem('last-seen') ?? new Date();
    window.localStorage.setItem('last-seen', new Date().toString());
    return lastSeen;
}
function WindowPage() {
    const lastSeen = updateLastSeen();
    return <div>Last Seen: {lastSeen}</div>;
}

運(yùn)行這個(gè),我們得到這個(gè)你可能熟悉的錯(cuò)誤:

為了解決這個(gè)問(wèn)題,讓我們引入一個(gè)自定義的鉤子,它涉及一個(gè) useEffect。

function useLastSeen() {
    const [lastSeen, setLastSeen] = useState(null);
    const retrieved = useRef(false); //To get around strict mode running the hook twice
    useEffect(() => {
        if (retrieved.current) return;
        retrieved.current = true;
        setLastSeen(updateLastSeen());
    }, []);
    return lastSeen;
}

我已經(jīng)把我們的邏輯移到了一個(gè)自定義的鉤子上,只是為了保持代碼的簡(jiǎn)潔。現(xiàn)在隨著我們代碼的改變,代碼將只在鉤子運(yùn)行時(shí)運(yùn)行,也就是在客戶端。

然后我們可以將我們的組件更新為。

function WindowPage() {
    const lastSeen = useLastSeen();
    return (
        <div>
            Last Seen: {lastSeen}
        </div>
    );
}

這段代碼更簡(jiǎn)潔,而且由于 useEffect里面的鉤子只在客戶端運(yùn)行,我們的錯(cuò)誤就消失了

檢查窗口是否被定義

另一種方法是在我們運(yùn)行代碼之前簡(jiǎn)單地檢查窗口對(duì)象是否被定義。如果代碼在服務(wù)器上運(yùn)行,由于我們不在瀏覽器中,窗口對(duì)象就不存在。

我們不能使用與之前相同的例子,因?yàn)檫@種方法有一個(gè)關(guān)鍵的區(qū)別。因?yàn)槲覀儧](méi)有等待組件的渲染,任何對(duì)頁(yè)面HTML的差異都會(huì)導(dǎo)致服務(wù)器端渲染的頁(yè)面版本與客戶端不同,我們會(huì)在Next.js中得到一個(gè)錯(cuò)誤。

在這個(gè)例子中,我們將為窗口對(duì)象添加一個(gè)事件監(jiān)聽(tīng)器,以跟蹤頁(yè)面上的點(diǎn)擊和它們的位置。

const isBrowser = () => typeof window !== 'undefined'; //The approach recommended by Next.js
function WindowPage() {
    const [lastClick, setLastClick] = useState('');
    if (isBrowser()) { //Only add the event listener client-side
        window.addEventListener('click', (e) =>
            setLastClick(`${e.pageX}, ${e.pageY}`)
        );
    }
    return (
        <div className="m-auto rounded bg-violet-600 p-10 font-bold text-white shadow">
            Click at: {lastClick}
        </div>
    );
}

正如我們所看到的,代碼并沒(méi)有在服務(wù)器上運(yùn)行,所以Next.js現(xiàn)在很高興了

希望這兩種方法中的一種能幫助解決你的問(wèn)題。我推薦第一種方法,因?yàn)樗w了大多數(shù)情況,而且你不必處理Next.js發(fā)現(xiàn)渲染不匹配的可能性。

以上就是修復(fù)Next.js中window is not defined方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Next.js window is not defined的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • react render props模式實(shí)現(xiàn)組件復(fù)用示例

    react render props模式實(shí)現(xiàn)組件復(fù)用示例

    本文主要介紹了react render props模式實(shí)現(xiàn)組件復(fù)用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • React點(diǎn)擊事件的兩種寫法小結(jié)

    React點(diǎn)擊事件的兩種寫法小結(jié)

    這篇文章主要介紹了React點(diǎn)擊事件的兩種寫法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • 你知道怎么在 HTML 頁(yè)面中使用 React嗎

    你知道怎么在 HTML 頁(yè)面中使用 React嗎

    這篇文章主要為大家詳細(xì)介紹了如何在HTML頁(yè)面中使用 React,使用使用js模塊化的方式開(kāi)發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • React?Context原理深入理解源碼示例分析

    React?Context原理深入理解源碼示例分析

    這篇文章主要為大家介紹了React?Context原理深入理解源碼示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React教程之封裝一個(gè)Portal可復(fù)用組件的方法

    React教程之封裝一個(gè)Portal可復(fù)用組件的方法

    react的核心之一是組件,下面這篇文章主要給大家介紹了關(guān)于React教程之封裝一個(gè)Portal可復(fù)用組件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • React中的useState和useEffect詳細(xì)解析

    React中的useState和useEffect詳細(xì)解析

    useState和useEffect是React的兩個(gè)重要Hook,用于組件狀態(tài)管理和處理副作用,useState允許添加狀態(tài)變量,控制組件渲染,而useEffect用于執(zhí)行渲染后的副作用操作,本文給大家介紹React中的useState和useEffect詳細(xì)解析,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • React中useState的理解和使用案例

    React中useState的理解和使用案例

    Hook是React16.8的新增特性,它可以讓你在不編寫class的情況下使用state以及其他的React特性,本文中講解的useState就是React中的其中一個(gè)Hook,這篇文章主要給大家介紹了關(guān)于React中useState理解和使用的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • React使用React.lazy和Suspense實(shí)現(xiàn)組件懶加載

    React使用React.lazy和Suspense實(shí)現(xiàn)組件懶加載

    React 提供了 React.lazy 和 Suspense 這兩個(gè)好東西,能讓我們實(shí)現(xiàn)組件的懶加載,下面就跟隨小編一起來(lái)了解一下如何使用它們實(shí)現(xiàn)懶加載的具體步驟吧
    2025-03-03
  • 淺談React碰到v-if

    淺談React碰到v-if

    這篇文章主要介紹了淺談React碰到v-if,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • react 報(bào)錯(cuò)Module build failed: BrowserslistError: Unknown browser query `dead`問(wèn)題的解決方法

    react 報(bào)錯(cuò)Module build failed: Browserslis

    這篇文章主要介紹了react 報(bào)錯(cuò)Module build failed: BrowserslistError: Unknown browser query `dead`問(wèn)題的解決方法,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

六枝特区| 长沙市| 太原市| 平武县| 黔南| 闽侯县| 江永县| 平舆县| 漯河市| 柘荣县| 洪雅县| 昂仁县| 惠水县| 宿州市| 张掖市| 阿鲁科尔沁旗| 兴国县| 百色市| 揭阳市| 铜陵市| 三穗县| 白河县| 丹江口市| 东港市| 泰和县| 西华县| 兰州市| 平乐县| 赤峰市| 顺昌县| 汶上县| 新竹县| 奇台县| 车险| 连平县| 惠来县| 大兴区| 赤水市| 大足县| 大方县| 涡阳县|