使用 useState 和 useContext React Hooks 持久化 localStorage

2024-02-11

我已经设置了一个提供程序来为用户共享一些状态useContext。因此,我试图利用本地存储来保存用户图像(头像等)的一些状态

首先,我尝试保留用户的头像,本质上是从 Express 中保存他们的 ID,然后在调用 Cloudinary(一种图像托管服务)时使用它。

我想我已经很接近了(因为我得到了头像的默认图像占位符),但我无法设置本地存储。

import React, { useState, useEffect } from 'react';
import dynamic from 'next/dynamic';

var initialState = {
  userId: null,
  avatar: '/static/uploads/profile-avatars/placeholder.jpg'
};

var UserContext = React.createContext();

function getLocalStorage() {
  return Object.keys(initialState).forEach(item => {
    dynamic(
      () =>
        Object.keys(initialState).forEach(
          val => (initialState[window.localStorage.getItem(item)] = val)
        ),
      {
        ssr: false
      }
    );
  });
}

function setLocalStorage() {
  Object.keys(initialState).forEach(item => {
    console.log('item setLocalStorage', item);
    dynamic(
      () =>
        window.localStorage.setItem(
          item,
          Object.values(initialState).forEach(item => item)
        ),
      {
        ssr: false
      }
    );
  });
}

function UserProvider({ children }) {
  var [userImages, setUserImages] = useState(() => getLocalStorage() || initialState);

  var [userId, setUserId] = useState(userImages.userId);

  useEffect(() => {
    setLocalStorage();
  }, [userId]);

  return (
    <UserContext.Provider
      value={{
        userImages,
        setUserImages,
        userId,
        setUserId
      }}
    >
      {children}
    </UserContext.Provider>
  );
}

export default UserContext;

export { UserProvider };

预先感谢您,父亲节快乐!


我相信next/dynamic在这种情况下不需要。 ES2020dynamic import()用于动态导入 JavaScript 模块(包括 React 组件)。在这里你没有导入任何东西。

此外,键和值localStorage始终采用字符串格式。这就是为什么你可以跳过nullvalue(或者它将被转换为字符串“null”)。我建议您使用以下方法将整个用户状态存储为一个对象JSON.stringify.

So the setLocalStorage() and getLocalStorage()将:

function setLocalStorage(key, value) {
  try {
    window.localStorage.setItem(key, JSON.stringify(value));
  } catch (e) {
    // catch possible errors:
    // https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API
  }
}

function getLocalStorage(key, initialValue) {
  try {
    const value = window.localStorage.getItem(key);
    return value ? JSON.parse(value) : initialValue;
  } catch (e) {
    // if error, return initial value
    return initialValue;
  }
}

然后,您可以在UserProvider如下:

function UserProvider({ children }) {
  const [user, setUser] = useState(() => getLocalStorage("user", initialState));

  useEffect(() => {
    setLocalStorage("user", user);
  }, [user]);

  return (
    <UserContext.Provider
      value={{
        userId: user.id,
        userAvatar: user.avatar,
        userImages: user.images,
        setUserId: (id) => setUser({ ...user, id }),
        setUserAvatar: (avatar) => setUser({ ...user, avatar }),
        setUserImages: (images) => setUser({ ...user, images }),
      }}
    >
      {children}
    </UserContext.Provider>
  );
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 useState 和 useContext React Hooks 持久化 localStorage 的相关文章

  • 使用酶测试反应确认窗口

    我在 React 中有一个按钮 当用户单击它时 它会打开一个简单的确认窗口 在我添加confirm方法之前 下面的测试是绿色的 添加后确认它是红色的 我需要如何更改测试才能与附加确认一起使用 反应删除按钮 const DeleteButto
  • create-react-app 中的 public/manifest.json 文件是什么?

    我知道 chrome 扩展使用 manifest json 但在这里 它也被用作其他东西 内容 short name React App name Create React App Sample icons src favicon ico
  • React textarea 的值是只读的,但需要更新

    我的 React 应用程序中有一个文本区域 其中填充了一个值 我希望更新此文本区域并提交表单以更新数据库中的行
  • 使用 Highcharts 和 React 创建条形图 - 出现未找到渲染 div 的错误

    我正在尝试在我的 Web 应用程序中使用 Highcharts 创建条形图 该应用程序在前端使用 React 下面是我的仪表板 tsx 文件的片段 我基本上只是从 JSFiddle 复制并粘贴了代码 http jsfiddle net 8q
  • 如何将文件从 ReactJS 上传到 Express 端点

    在我当前正在开发的应用程序中 有几个文件表单是通过以下方式提交的superagent到 Express API 端点 例如 图像数据的发布方式如下 handleSubmit function evt var imageData new Fo
  • React 中大括号的使用

    我正在尝试学习 React 我在使用花括号时遇到问题 JSX 和 JS 之间使用大括号的区别 在下面的代码中 大括号 1 表示 现在是 JS 为什么有花括号 2 它已经在花括号区域内了吗 var React require react va
  • 未处理的拒绝(ChunkLoadError):加载块 1 失败

    我基本上想做一个poc将我的主应用程序的某些部分提取到一个单独的包中 我已在我的 git 存储库中构建了一个示例单独包myapp poc ui https github com prabhatmishra33 myapp poc ui 现在
  • 正确处理麦克风音频的 React Hooks

    我正在尝试编写一个 React Hook 来处理流音频到 AudioContext 并使用 Meyda 进行分析 https meyda js org https meyda js org 我已经设法使流正常工作并能够提取我想要的数据 但是
  • Chrome 上的 BetterJsPop 错误是什么?

    我在 Chrome 上使用 React js 应用程序时遇到此错误 但在 Mozilla 上它运行得很好 有谁知道这意味着什么或者这个错误指的是什么 VM1407 20 Uncaught TypeError Cannot redefine
  • 访问react组件中的scss变量时出现问题

    按照链接进行操作https mattferderer com use sass variables in typescript and javascript https mattferderer com use sass variables
  • useReducer 未同步更新状态的问题

    根据React docs 当你有复杂的情况时 useReducer 通常比 useState 更好 涉及多个子值或下一个状态时的状态逻辑 取决于前一个 1 有人可以解释一下为什么吗useReducer不是同步更新状态吗 const redu
  • ReactJS React-pdf 错误“无法加载 PDF 文件。”经过一些尝试

    我创建了一个 React js 应用程序create react app我正在尝试react pdf查看 pdf 我遇到的问题是我的代码有时有效 有时无效 当我第一次加载应用程序时 pdf 总是加载得很好 但如果我访问网站上的其他链接 ur
  • React:将组件作为 prop 传递,而不使用 this.props.children

    我有这个组件Foo js a svg component with a star svg icon import IconStar from react svg icons call a button with a custom icon
  • 如何禁用 mui 文本字段自动完成?

    我正在使用最新版本的 mui 我有一个包含邮政编码字段的用户联系信息表单 如果值为空 我不希望此字段自动完成 但它会随着浏览器中保存的电子邮件自动完成 这是我到目前为止所尝试过的 自动完成 关闭 自动完成 关闭 自动完成 不 这是我的文本字
  • 使用单个 shell 脚本运行 React 和 Flask

    我构建了一个使用 ReactJS 作为前端和 Flask 作为中间件的应用程序 我可以使用以下命令序列来执行它 npm start cd Equation Solver python m flask run 执行第一个命令后 我必须打开另一
  • 如何在Vite配置中更改antd主题?

    是一个由Vite和React antd组成的项目 我想在 vite config ts 中动态处理 antd 主题 如果您能告诉我如何修改 React 组件中的 less modifyVars 值 我将不胜感激 这是当前屏幕 光状态 htt
  • 表单验证后 isValid 保持 false

    我有一个自定义验证函数 但即使它没有返回错误 表单仍然无效 我将以下属性传递给 Formik validate import files gt return import files values length 0 import files
  • ReactDOM 使用同一个类来渲染多个元素?

    我有多个元素使用相同的类并具有相同的内容 所以我可以使用 ReactDOM 来渲染它们 而不是 ReactDOM render
  • jsx转js后dom未定义错误

    我创建了一个 jsx 文件 如下所示 jsx dom function use strict define jquery react react dom function React ReactDOM var AppView React c
  • npx create-react-app myapp 命令抛出错误

    我想在 React 中创建一个应用程序 我已经安装了最新的 Node js 当我运行命令时出现错误 PS C Users Kumar Sanket Desktop React Redux gt npx create react app my

随机推荐