You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js构建报错window未定义:localStorage访问问题求助

解决Next.js中useLocalStorage Hook的window未定义问题

问题现象

  • 预渲染页面"/dashboard"时触发ReferenceError: window is not defined错误
  • 以下页面导出时均出现相同错误:
    • /admin-users
    • /change-password
    • /countries
    • /dashboard
    • /feedback
    • /products
    • /user-device-mapping
    • /users
    • /login
    • /

问题原因

Next.js预渲染(静态生成/服务端渲染)阶段运行在Node.js环境,该环境不存在window对象。原Hook在初始化useState的回调中直接尝试访问window,导致服务端执行时报错。

修复方案

所有涉及window.localStorage的操作必须放在useEffect中执行(useEffect仅在客户端挂载后触发),初始化状态时直接使用传入的初始值,避免服务端执行时接触window。

修改后的useLocalStorage Hook代码

import { Dispatch, SetStateAction, useEffect, useState } from "react";

type UseLocalStorageReturn<T> = [T, Dispatch<SetStateAction<T>>];

const useLocalStorage = <T>(
  key: string,
  initialValue?: T
): UseLocalStorageReturn<T> => {
  // 服务端初始化时直接用初始值,不访问window
  const [storedValue, setStoredValue] = useState<T>(initialValue as T);

  // 客户端挂载后读取localStorage更新状态
  useEffect(() => {
    try {
      const storedItem = window.localStorage.getItem(key);
      const value = storedItem ? JSON.parse(storedItem) : initialValue;
      if (value !== undefined) {
        setStoredValue(value as T);
      }
    } catch (error) {
      console.error("读取localStorage失败:", error);
    }
  }, [key, initialValue]);

  const setLocalStorageValue: Dispatch<SetStateAction<T>> = (value) => {
    // 处理函数式更新的情况
    const newValue = typeof value === "function" 
      ? (value as (prev: T) => T)(storedValue) 
      : value;
    
    // 先更新本地状态
    setStoredValue(newValue);

    // 仅在客户端环境下更新localStorage
    if (typeof window !== "undefined") {
      try {
        window.localStorage.setItem(key, JSON.stringify(newValue));
      } catch (error) {
        console.error("更新localStorage失败:", error);
      }
    }
  };

  return [storedValue, setLocalStorageValue];
};

export default useLocalStorage;

使用说明

保持原有使用方式不变:

const [userData] = useLocalStorage('userData')

内容的提问来源于stack exchange,提问作者Shreyas Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:23:27