在 React 中使用自定义 useLocalStorage Hook 的本地存储 我们的方法 创建 Hook 测试我们的新 Hook

2025-06-07

在 React 中使用自定义 useLocalStorage Hook 来使用本地存储

我们的方法

创建钩子

测试我们的新钩子

我们可能会用到的一种浏览器端数据存储工具是本地存储。在本文中,我们将通过自定义 useLocalStorage hook 在 React 中使用本地存储。


如果您喜欢本教程,请给予💓、🦄或🔖并考虑:


我们的方法

为了解决这个问题,让我们将其分解成几个部分。

  1. 提供本地存储密钥。本地存储基于键值对,因此我们需要能够key为存储的数据提供密钥。
  2. 提供默认值。如果提供的 下的本地存储中没有现有数据key,我们需要defualtValue为我们的数据提供一个。
  3. 将本地存储值加载到状态中(如果不存在本地存储值,则加载默认值)。我们仍会在应用中维护状态信息,因此仍然可以使用useState钩子。区别在于,如果本地存储值存在,我们会先使用它,然后再考虑用户提供的defaultValue
  4. 将状态数据保存到本地存储。当状态数据发生变化时,我们需要确保本地存储保持最新。因此,每当变量发生任何变化时,我们都需要运行一个 effect 来同步本地存储。
  5. 公开状态变量和 setter。与钩子类似useState,我们的useLocalStorage钩子将返回一个包含两个元素的数组。第一个元素是变量,第二个元素是该变量的 setter。

创建钩子

让我们创建钩子!如上所述,钩子将接受两个输入:key将在 中使用的localStorage,以及defaultValue将在 中使用的 ,即使尚未输入任何内容localStorage

useLocalStorage.js

export const useLocalStorage = (key, defaultValue) => {};
Enter fullscreen mode Exit fullscreen mode

接下来,让我们在localStorage提供的下加载任何数据key

export const useLocalStorage = (key, defaultValue) => {
  const stored = localStorage.getItem(key);
};
Enter fullscreen mode Exit fullscreen mode

现在我们知道状态变量的初始值就是这个stored值。但是localStorage,如果provided 下还没有内容key,我们将默认使用用户提供的defaultValue

注意:由于localStorage数据存储为字符串,我们确保JSON.parse从那里检索的任何数据。

export const useLocalStorage = (key, defaultValue) => {
  const stored = localStorage.getItem(key);
  const initial = stored ? JSON.parse(stored) : defaultValue;
};
Enter fullscreen mode Exit fullscreen mode

现在我们有了initial状态的值,我们可以使用常规的useState钩子格式并返回状态变量及其设置器。

import { useState } from 'react';

export const useLocalStorage = (key, defaultValue) => {
  const stored = localStorage.getItem(key);
  const initial = stored ? JSON.parse(stored) : defaultValue;
  const [value, setValue] = useState(initial);
  return [value, setValue];
};
Enter fullscreen mode Exit fullscreen mode

快完成了!我们还有一个需求没有满足:我们需要将数据保存到localStorage更改时的状态。我喜欢用一个在数据更改useEffect时触发的钩子来做这件事value

import { useState, useEffect } from 'react';

export const useLocalStorage = (key, defaultValue) => {
  const stored = localStorage.getItem(key);
  const initial = stored ? JSON.parse(stored) : defaultValue;
  const [value, setValue] = useState(initial);

  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value));
  }, [key, value]);

  return [value, setValue];
};
Enter fullscreen mode Exit fullscreen mode

搞定!只要value发生变化,我们的效果就会运行,这意味着我们会将localStorage要设置的项目设置为JSON.stringify我们的value。需要注意的是, providedkey也是我们效果的依赖项,因此为了完整性,我们将其包含在依赖项数组中即使我们并不期望它真的会改变。

测试我们的新钩子

让我们来试试这个钩子吧!我们将创建一个简单的组件,它有一个文本输入框,其值基于我们的useLocalStorage钩子。

App.jsx

import React from 'react';
import { useLocalStorage } from './useLocalStorage';

function App() {
  const [name, setName] = useLocalStorage('username', 'John');
  return (
    <input
      value={name}
      onChange={e => {
        setName(e.target.value);
      }}
    />
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

现在运行我们的应用。我们可以看到,首次运行应用时,状态name变量默认为字符串John。但是,当我们更改该值并刷新页面时,状态变量的值就默认为localStorage

useLocalStorage 正在使用中

成功!

文章来源:https://dev.to/nas5w/using-local-storage-in-react-with-your-own-custom-uselocalstorage-hook-45eo
PREV
React 服务器组件与服务器端渲染 (SSR) 之间的区别 SSR 完全取决于初始页面加载 React 服务器组件始终在服务器上渲染 React 服务器组件更有可能减少包大小 结论
NEXT
在单页应用程序中使用 Cookie 到标头的 CSRF 令牌 什么是 CSRF 攻击?CORS 能保护我免受 CSRF 攻击吗?那么什么能保护我免受 CSRF 攻击?在单页应用程序中使用 Cookie 来获取 CSRF 令牌 为什么我喜欢在 SPA 的 Cookie 中获取 CSRF 令牌 重要配置说明 未来:SameSite Cookie