实现一个自定义 React Hook:UseLocalStorageState

开发 前端
最近做需求,需要将数据保存到 localStorage 里,在组件初始化的时候获取,然后修改该值的时候,要保存到本地的 localStorage 中。

大家好,我是前端西瓜哥。

最近做需求,需要将数据保存到 localStorage 里,在组件初始化的时候获取,然后修改该值的时候,要保存到本地的 localStorage 中。

倒是并不难。

function App() {
const STORAGE_NAME = 'app_theme';
const defaultVal = '前端西瓜哥'
const [value, setValue] = useState(() => {
const storage = localStorage.getItem(STORAGE_NAME);
return storage || defaultVal;
})
const changeValue = (val) => {
localStorage.setItem(STORAGE_NAME, val);
setValue(val);
}
return (
<div>
<input value={value} onChange={e => changeValue(e.target.value)}/>
</div>
);
}

很显然,这些逻辑完全可以封装为一个 React Hook,名字很容易想到为 useLocalStorageState。

const useLocalStorageState = (key, defaultValue) => {
const data = localStorage.getItem(key);
const [value, setValue] = useState(data || defaultValue);
return [
value,
(val) => {
localStorage.setItem(key, val);
setValue(val);
}
];
};

逻辑并不复杂。就是在读和写的时候,加上 localStorage 的读写逻辑就好了。

用法如下:

function App() {
const STORAGE_NAME = "app_theme";
const defaultVal = "前端西瓜哥";
const [value, setValue] = useLocalStorageState(STORAGE_NAME, defaultVal);
return (
<div>
<input value={value} onChange={e => setValue(e.target.value)} />
</div>
);
}

其实这个实现还是比较粗糙的,只支持字符串格式,如果你要保存对象,需要自己手动 JSON.parse 和 JSON.stringify 来扩展了数据类型的范围。

我们可以加一下序列化和反序列化支持:

const useLocalStorageState = (key, defaultValue) => {
const data = localStorage.getItem(key);
const [value, setValue] = useState(JSON.parse(data || defaultValue));
return [
value,
(val) => {
localStorage.setItem(key, JSON.stringify(val));
setValue(val);
}
];
};
// 使用
function App() {
const STORAGE_NAME = "app_theme";
const defaultVal = { name: "前端西瓜哥" };
const [value, setValue] = useLocalStorageState(STORAGE_NAME, defaultVal);
return (
<div>
<input
value={value.name}
onChange={(e) => setValue({ name: e.target.value })}
/>
</div>
);
}

另外,JSON 序列化和反序列方法如果不够用,我们可以再加个自定义序列反序列化方法:

const useLocalStorageState = (key, defaultValue, serializer, deserializer) => {
defaultValue = localStorage.getItem(key) || defaultValue;
const [value, setValue] = useState(
deserializer ? deserializer(defaultValue) : JSON.parse(defaultValue)
);
return [
value,
(val) => {
localStorage.setItem(
key,
serializer ? serializer(val) : JSON.stringify(val)
);
setValue(val);
}
];
};

其实优秀的第三方 React Hook 库 ahooks 也有这个实现,我还是建议大家用一些比较成熟的轮子,我这里只是提供一下思路。

ahooks 的 useLocalStorageState 的源码:

https://github.com/alibaba/hooks/blob/v3.4.0/packages/hooks/src/useLocalStorageState/index.ts。

责任编辑:姜华 来源: 今日头条
相关推荐

2017-06-20 12:48:55

React Nativ自定义模块Note.js

2024-06-13 09:50:45

2023-12-21 09:00:21

函数React 组件useEffect

2020-09-18 10:12:24

KotlinTCP网络协议

2012-11-19 11:07:42

IBMdw

2021-02-23 08:01:01

HooksReact架构

2023-09-27 22:10:47

Vue.jsJavaScript

2024-03-19 00:00:00

ReactJavaScript开发

2009-04-28 13:25:36

Ajax函数Java

2021-03-09 15:23:45

鸿蒙HarmonyOS应用开发

2021-07-26 09:00:08

ReactHooks 项目

2021-01-06 05:25:56

项目Springboot应用

2009-09-07 22:00:15

LINQ自定义

2020-10-21 11:34:49

React Hook库

2022-06-20 08:37:28

接口tokenAO

2015-02-12 15:33:43

微信SDK

2022-04-01 15:59:22

SQLPostgreSQL审计

2013-01-09 17:22:38

Android开发Camera

2022-03-01 16:09:06

OpenHarmon鸿蒙单选组件

2023-01-03 07:40:27

自定义滑块组件
点赞
收藏

51CTO技术栈公众号