在Next.js中,我使用以下代码:

  const [card, setcard] = useState([]);

  useEffect(() => {
    localStorage.setItem('items', JSON.stringify(card));
  }, [card]);

  useEffect(() => {
    const items = JSON.parse(localStorage.getItem('items'));
    if (items) {
      setcard(items);
    }
  }, []);

我可以看到,当卡的值更改时,本地存储会向我显示卡的值,这是一个JSON,所以当我刷新时,我只看到这个[]

我使用了这个教程:https://www.freecodecamp.org/news/how-to-use-localstorage-with-react-hooks-to-set-and-get-items/

我如何修复代码,这样我才不会在刷新后丢失卡的价值?

另外,我使用cookies像这样存储card,它很有效,但当我的JSON中的项变得更大时,cookie不再存储;这就是我想使用本地存储的原因.

示例:

  const [card, setcard] = useState(() => eval(getCookie('card') || []));
  setCookie('card', JSON.stringify(card), {
    path: '/',
    maxAge: 60 * 60 * 24,
    HttpOnly: true,
    Secure: true,
  });

推荐答案

问题是,您的前useEffect(带有依赖数组[card])在您的useEffect钩子之前被触发,而没有任何依赖array.您可能可以通过颠倒它们的顺序来修复它,但我会做得更彻底,只有在看到您提供的默认[]以外的内容时,才会让具有[card]依赖项数组的变量执行保存.有一种方法可以做到这一点:

// Outside the component
const defaultCard = [];

function YourComponent() {
    const [card, setCard] = useState(defaultCard);

    useEffect(() => {
        const items = JSON.parse(localStorage.getItem("items"));
        if (items) {
            setCard(items);
        }
    }, []);

    useEffect(() => {
        if (card !== defaultCard) { // Note we're checking *object identity* here
            localStorage.setItem("items", JSON.stringify(card));
        }
    }, [card]);
    
    // ...
}

使用对象标识使得代码永远不会保存我们用作默认的specific空数组(但是will存储一个空数组,该空数组是由用户故意移除所有卡片而产生的).

或者,不要依赖效果来保存array.取而代之的是,为setCard人准备一个包装纸:

function YourComponent() {
    const [card, setCardWorker] = useState(defaultCard);

    const setCard = useCallback(
        (card) => {
            localStorage.setItem("items", JSON.stringify(card));
            setCardWorker(card);
        },
        [setCardWorker]
    );

    useEffect(() => {
        const items = JSON.parse(localStorage.getItem("items"));
        if (items) {
            setCard(items);
        }
    }, []);
    
    // ...code using `setCard` to update `card` as things are added and removed...
}

(I've used 100 rather than 101 in these because the vastly common standard is to capitalize the noun after 102 in these things rather than use all lower-case.

Javascript相关问答推荐

添加/删除时React图像上传重新渲染上传的图像

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

在分区内迭代分区

将json数组项转换为js中的扁平

如何在使用fast-xml-parser构建ML时包括属性值?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

字节数组通过echo框架传输到JS blob

类型自定义lazy Promise. all

TypeScript索引签名模板限制

Angular material 拖放堆叠的牌副,悬停时自动展开&

在Vite React库中添加子模块路径

构造HTML表单以使用表单数据创建对象数组

使用POST请求时,Req.Body为空

为什么客户端没有收到来自服务器的响应消息?

postman 预请求中的hmac/sha256内标识-从js示例转换

react 路由如何使用从加载器返回的数据

我怎样才能得到一个数组的名字在另一个数组?

select 2-删除js插入的项目将其保留为选项

使用VITE开发服务器处理错误

Google OAuth 2.0库和跨域开放程序的问题-策略错误