欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

修復Next.js中window?is?not?defined方法詳解

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

引言

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

使用useEffect鉤子

useEffect鉤子總是在瀏覽器中運行,所以我們可以用它來確保我們的代碼只能從那里運行。關于鉤子的快速入門知識,請查看這篇文章。

下面是一個簡單應用的示例代碼,它將用戶最后一次訪問網(wǎng)站的時間存儲在本地存儲中。如果你不熟悉在React或Next.js中使用localStorage,可以看看我們這里的這個教程,它使用了類似的方法。這個方法是相同的,但有一個小的區(qū)別,那就是你可以在vanilla React組件的主體中使用localStorage,因為默認沒有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>;
}

運行這個,我們得到這個你可能熟悉的錯誤:

為了解決這個問題,讓我們引入一個自定義的鉤子,它涉及一個 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)把我們的邏輯移到了一個自定義的鉤子上,只是為了保持代碼的簡潔?,F(xiàn)在隨著我們代碼的改變,代碼將只在鉤子運行時運行,也就是在客戶端。

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

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

這段代碼更簡潔,而且由于 useEffect里面的鉤子只在客戶端運行,我們的錯誤就消失了

檢查窗口是否被定義

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

我們不能使用與之前相同的例子,因為這種方法有一個關鍵的區(qū)別。因為我們沒有等待組件的渲染,任何對頁面HTML的差異都會導致服務器端渲染的頁面版本與客戶端不同,我們會在Next.js中得到一個錯誤。

在這個例子中,我們將為窗口對象添加一個事件監(jiā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>
    );
}

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

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

以上就是修復Next.js中window is not defined方法詳解的詳細內容,更多關于Next.js window is not defined的資料請關注腳本之家其它相關文章!

相關文章

  • React hook 'useState' is called conditionally報錯解決

    React hook 'useState' is calle

    這篇文章主要為大家介紹了React hook 'useState' is called conditionally報錯解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • react hooks實現(xiàn)防抖節(jié)流的方法小結

    react hooks實現(xiàn)防抖節(jié)流的方法小結

    這篇文章主要介紹了react hooks實現(xiàn)防抖節(jié)流的幾種方法,文中通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-04-04
  • react中使用css的7中方式(最全總結)

    react中使用css的7中方式(最全總結)

    這篇文章主要介紹了react中使用css的7中方式(最全總結),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • react寫一個select組件的實現(xiàn)代碼

    react寫一個select組件的實現(xiàn)代碼

    這篇文章主要介紹了react寫一個select組件的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • React中使用async validator進行表單驗證的實例代碼

    React中使用async validator進行表單驗證的實例代碼

    react上進行表單驗證是很繁瑣的,在這里使用async-validator處理起來就變的很方便了,接下來通過本文給大家介紹React中使用async validator進行表單驗證的方法,需要的朋友可以參考下
    2018-08-08
  • React tsx生成隨機驗證碼

    React tsx生成隨機驗證碼

    這篇文章主要為大家詳細介紹了React tsx生成隨機驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • react中的forwardRef 和memo的區(qū)別解析

    react中的forwardRef 和memo的區(qū)別解析

    forwardRef和memo是React中用于性能優(yōu)化和組件復用的兩個高階函數(shù),本文給大家介紹react中的forwardRef 和memo的區(qū)別及適用場景,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • react-native動態(tài)切換tab組件的方法

    react-native動態(tài)切換tab組件的方法

    在APP中免不了要使用tab組件,有的是tab切換,也有的是tab分類切換.這篇文章主要介紹了react-native動態(tài)切換tab組件的方法,非常具有實用價值,需要的朋友可以參考下
    2018-07-07
  • React項目中報錯:Parsing error: The keyword 'import' is reservedeslint的問題及解決方法

    React項目中報錯:Parsing error: The keyword &a

    ESLint 默認使用的是 ES5 語法,如果你想使用 ES6 或者更新的語法,你需要在 ESLint 的配置文件如:.eslintrc.js等中設置 parserOptions,這篇文章主要介紹了React項目中報錯:Parsing error: The keyword 'import' is reservedeslint的問題及解決方法,需要的朋友可以參考下
    2023-12-12
  • React Native時間轉換格式工具類分享

    React Native時間轉換格式工具類分享

    這篇文章主要為大家分享了React Native時間轉換格式工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論