修复Next.js中window is not defined方法详解

 更新时间:2022年12月13日 09:28:45   作者:Jovie  
这篇文章主要为大家介绍了修复Next.js中window is not defined方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

这个问题与Next.js的服务器端渲染有关。Next.js默认会尝试为您的网站使用SSR。这意味着,由于我们是在服务器上而不是在浏览器中,所以 "窗口 "对象并不存在。解决这个问题的方法是强迫Next.js在浏览器中运行你的代码,我将解释如何做到这一点。

使用useEffect钩子

useEffect钩子总是在浏览器中运行,所以我们可以用它来确保我们的代码只能从那里运行。关于钩子的快速入门知识,请查看这篇文章。

下面是一个简单应用的示例代码,它将用户最后一次访问网站的时间存储在本地存储中。如果你不熟悉在React或Next.js中使用localStorage,可以看看我们这里的这个教程,它使用了类似的方法。这个方法是相同的,但有一个小的区别,那就是你可以在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;
}

我已经把我们的逻辑移到了一个自定义的钩子上,只是为了保持代码的简洁。现在随着我们代码的改变,代码将只在钩子运行时运行,也就是在客户端。

然后我们可以将我们的组件更新为。

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

这段代码更简洁,而且由于 useEffect里面的钩子只在客户端运行,我们的错误就消失了

检查窗口是否被定义

另一种方法是在我们运行代码之前简单地检查窗口对象是否被定义。如果代码在服务器上运行,由于我们不在浏览器中,窗口对象就不存在。

我们不能使用与之前相同的例子,因为这种方法有一个关键的区别。因为我们没有等待组件的渲染,任何对页面HTML的差异都会导致服务器端渲染的页面版本与客户端不同,我们会在Next.js中得到一个错误。

在这个例子中,我们将为窗口对象添加一个事件监听器,以跟踪页面上的点击和它们的位置。

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现在很高兴了

希望这两种方法中的一种能帮助解决你的问题。我推荐第一种方法,因为它涵盖了大多数情况,而且你不必处理Next.js发现渲染不匹配的可能性。

以上就是修复Next.js中window is not defined方法详解的详细内容,更多关于Next.js window is not defined的资料请关注脚本之家其它相关文章!

相关文章

  • react render props模式实现组件复用示例

    react render props模式实现组件复用示例

    本文主要介绍了react render props模式实现组件复用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • React点击事件的两种写法小结

    React点击事件的两种写法小结

    这篇文章主要介绍了React点击事件的两种写法小结,具有很好的参考价值,希望对大家有所帮助。
    2022-12-12
  • 你知道怎么在 HTML 页面中使用 React吗

    你知道怎么在 HTML 页面中使用 React吗

    这篇文章主要为大家详细介绍了如何在HTML页面中使用 React,使用使用js模块化的方式开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • React Context原理深入理解源码示例分析

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

    这篇文章主要为大家介绍了React Context原理深入理解源码示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • React教程之封装一个Portal可复用组件的方法

    React教程之封装一个Portal可复用组件的方法

    react的核心之一是组件,下面这篇文章主要给大家介绍了关于React教程之封装一个Portal可复用组件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2018-01-01
  • React中的useState和useEffect详细解析

    React中的useState和useEffect详细解析

    useState和useEffect是React的两个重要Hook,用于组件状态管理和处理副作用,useState允许添加状态变量,控制组件渲染,而useEffect用于执行渲染后的副作用操作,本文给大家介绍React中的useState和useEffect详细解析,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • React中useState的理解和使用案例

    React中useState的理解和使用案例

    Hook是React16.8的新增特性,它可以让你在不编写class的情况下使用state以及其他的React特性,本文中讲解的useState就是React中的其中一个Hook,这篇文章主要给大家介绍了关于React中useState理解和使用的相关资料,需要的朋友可以参考下
    2024-03-03
  • React使用React.lazy和Suspense实现组件懒加载

    React使用React.lazy和Suspense实现组件懒加载

    React 提供了 React.lazy 和 Suspense 这两个好东西,能让我们实现组件的懒加载,下面就跟随小编一起来了解一下如何使用它们实现懒加载的具体步骤吧
    2025-03-03
  • 浅谈React碰到v-if

    浅谈React碰到v-if

    这篇文章主要介绍了浅谈React碰到v-if,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • react 报错Module build failed: BrowserslistError: Unknown browser query `dead`问题的解决方法

    react 报错Module build failed: Browserslis

    这篇文章主要介绍了react 报错Module build failed: BrowserslistError: Unknown browser query `dead`问题的解决方法,需要的朋友可以参考下
    2023-06-06

最新评论