静态NextJS站点中的localStorage:引用错误:localStorage未定义

e3bfsja2  于 2023-10-18  发布在  其他
关注(0)|答案(4)|浏览(224)

我试图在NextJS静态站点上使用localStorage,但遇到localStorage is not defined错误。
我的错误显示的组件代码是:

export default function Category() {

const [cart, setCart] = useState(
        localStorage.getItem("myCart") || ""
    );

 useEffect(() => {
        localStorage.setItem("myCart", cart);
    }, [cart]);

function addItem() {
            setCart("item")   
    }

return (
<>
<button onClick={addItem}>Add</button>)
</>
);
}

有没有办法在NextJS静态站点上使用localStorage,或者我做错了什么?
谢谢你,谢谢

8fsztsew

8fsztsew1#

使用use-persisted-state

import createPersistedState from 'use-persisted-state';

const useCartState = createPersistedState('cart');

export default function Category() {
     
  const [cart, setCart] = useCartState('');

  function addItem() {
    setCart("item");
  }

  return (
    <>
      <button onClick={addItem}>Add</button>)
    </>
  );
}
plupiseo

plupiseo2#

localStorage可以通过window对象获得。由于Next.js运行了两次代码,一次是在SSR期间在服务器中,一次是在客户端中,因此在SSR期间它将无法访问window对象,因此出现错误。
您需要检查window对象是否存在,然后像这样访问localStorage-

!!window ? window.localStorage.getItem("myCart") : ""

检查window对象是否存在于环境中,如果存在,则从localStorage获取值,否则返回空字符串。

3gtaxfhh

3gtaxfhh3#

这就是如何使用一种称为惰性初始化的技术来实现它。在组件之上创建函数。

const getInitialState =()=>localStorage.getItem("myCart");
export default function Category() {

const [cart, setCart] = useState(
        getInitialState || ""
    );

 useEffect(() => {
        localStorage.setItem("myCart", cart);
    }, [cart]);

function addItem() {
            setCart("item")   
    }

return (
<>
<button onClick={addItem}>Add</button>)
</>
);
}
5n0oy7gb

5n0oy7gb4#

const getInitialState =()=>typeof window !== 'undefined' 
    ? localStorage.getItem('myCart') 
    : undefined;
export default function Category() {

const [cart, setCart] = useState(
        getInitialState || ""
    );

      useEffect(() => {
    if (typeof window !== 'undefined') {
      localStorage.setItem("myCart", cart);
    }
  }, [cart]);

function addItem() {
            setCart("item")   
    }

return (
<>
<button onClick={addItem}>Add</button>)
</>
);
}

相关问题