自定义 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
相关文章
|
2月前
|
缓存 NoSQL Redis
通过切面结合Redis自定义缓存注解
通过切面结合Redis自定义缓存注解
30 0
|
存储 设计模式 缓存
C# 实现 key-value 结构自定义缓存 CustomCache
C# 实现 key-value 结构自定义缓存 CustomCache
149 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 使用姿势介绍)
1131 0
SpringBoot缓存注解@Cacheable之自定义key策略及缓存失效时间指定
|
存储 缓存 NoSQL
【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis
原文:【.NET Core项目实战-统一认证平台】第五章 网关篇-自定义缓存Redis 【.NET Core项目实战-统一认证平台】开篇及目录索引 上篇文章我们介绍了2种网关配置信息更新的方法和扩展Mysql存储,本篇我们将介绍如何使用Redis来实现网关的所有缓存功能,用到的文档及源码将会在GitHub上开源,每篇的源代码我将用分支的方式管理,本篇使用的分支为course3。
1179 0
|
缓存 NoSQL Java
springboot中使用自定义两级缓存
  工作中用到了springboot的缓存,使用起来挺方便的,直接引入redis或者ehcache这些缓存依赖包和相关缓存的starter依赖包,然后在启动类中加入@EnableCaching注解,然后在需要的地方就可以使用@Cacheable和@CacheEvict使用和删除缓存了。
3617 0
|
缓存 Java
Confluence 6 升级自定义的站点和空间关闭缓存
Velocity 被配置在内存中使用缓存模板。当你在 Confluence 中编辑了页面的模板文件,Confluence 知道文件进行了编辑,将会重新从磁盘中载入模板文件。
983 0

相关实验场景

更多