自定义 Hook 钩子,实现实时化更新本地缓存

简介: 自定义 Hook 钩子,实现实时化更新本地缓存
import { useState } from 'react';
/**
 * 创建一个持久化到 localStorage 的有状态的值,并创建一个函数来更新它。
 * @param {string} keyName:key
 * @param {string} defaultValue:初始值
 * @return {Function} storedValue:本地存储值,setValue:修改值的函数,removeValue:清除函数
 */
const useLocalStorage = (keyName, defaultValue) =>
{
  // 定义 storedValue
    const [storedValue, setStoredValue] = useState(() =>
    {
      // 此时的 try 可以捕获到 localStorage 可能抛出的错误
        try
        {
            const value = window.localStorage.getItem(keyName);
            if (value)
            {
                return JSON.parse(value);
            } else
            {
                window.localStorage.setItem(keyName, JSON.stringify(defaultValue));
                return defaultValue;
            }
        } catch (error)
        {
            console.error(error);
            return defaultValue;
        }
    });
    const setValue = newValue =>
    {
        try
        {
            window.localStorage.setItem(keyName, JSON.stringify(newValue));
        } catch (error)
        {
            throw (error)
        }
        setStoredValue(newValue);
    };
    const removeValue = () =>
    {
        try
        {
            window.localStorage.removeItem(keyName);
        } catch (error)
        {
            throw (error)
        }
        setStoredValue('');
    };
  // return 三个属性
    return [storedValue, setValue, removeValue];
};
export default useLocalStorage

使用

import useLocalStorage from './hooks/useLocalStorage '
const index = () =>
{
  // hooks 解构属性
    const [name, setName, clearName] = useLocalStorage('userName', 'NULL');
    const onChangeHandler = (e) =>
    {
        const { target } = e
        // 已经实时修改本地缓存
        setName(target.value)
    }
    const clearHandler = () =>
    {
        clearName()
    }
    return (
        <div>
            <h1>{name}</h1>
            <input value={name} onChange={onChangeHandler} />
            <button onClick={clearHandler}>Clear</button>
        </div>
    );
};
export default index
相关文章
|
7月前
|
缓存 NoSQL Redis
通过切面结合Redis自定义缓存注解
通过切面结合Redis自定义缓存注解
84 0
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
88 2
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】由Azure Redis是否可以自定义密码而引申出Azure PaaS的Redis服务是否可以和自建的Redis进行主从配置呢?
【Azure Redis 缓存】由Azure Redis是否可以自定义密码而引申出Azure PaaS的Redis服务是否可以和自建的Redis进行主从配置呢?
|
存储 设计模式 缓存
C# 实现 key-value 结构自定义缓存 CustomCache
C# 实现 key-value 结构自定义缓存 CustomCache
192 1
C# 实现 key-value 结构自定义缓存 CustomCache
|
存储 缓存 人工智能
CefSharp自定义缓存实现
本文介绍 CefSharp 的缓存实现,先来说说添加缓存的好处
|
缓存 NoSQL Java
[原创]SpringBoot 2.x Redis缓存乱码问题/自定义SpringBoot-Cache序列化方式
[原创]SpringBoot 2.x Redis缓存乱码问题/自定义SpringBoot-Cache序列化方式
[原创]SpringBoot 2.x Redis缓存乱码问题/自定义SpringBoot-Cache序列化方式
|
缓存 JSON Java
SpringBoot缓存注解@Cacheable之自定义key策略及缓存失效时间指定
上一篇博文介绍了Spring中缓存注解@Cacheable @CacheEvit @CachePut的基本使用,接下来我们将看一下更高级一点的知识点 (Spring系列缓存注解@Cacheable @CacheEvit @CachePut 使用姿势介绍)
1213 0
SpringBoot缓存注解@Cacheable之自定义key策略及缓存失效时间指定
|
存储 缓存 NoSQL
【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
原文:【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis 【.NET Core项目实战-统一认证平台】开篇及目录索引 上篇文章我们介绍了2种网关配置信息更新的方法和扩展Mysql存储,本篇我们将介绍如何使用Redis来实现网关的所有缓存功能,用到的文档及源码将会在GitHub上开源,每篇的源代码我将用分支的方式管理,本篇使用的分支为course3。
1193 0
|
缓存 NoSQL Java
springboot中使用自定义两级缓存
  工作中用到了springboot的缓存,使用起来挺方便的,直接引入redis或者ehcache这些缓存依赖包和相关缓存的starter依赖包,然后在启动类中加入@EnableCaching注解,然后在需要的地方就可以使用@Cacheable和@CacheEvict使用和删除缓存了。
3637 0