成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

實(shí)現(xiàn)一個(gè)自定義 React Hook:UseLocalStorageState

開發(fā) 前端
最近做需求,需要將數(shù)據(jù)保存到 localStorage 里,在組件初始化的時(shí)候獲取,然后修改該值的時(shí)候,要保存到本地的 localStorage 中。

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

最近做需求,需要將數(shù)據(jù)保存到 localStorage 里,在組件初始化的時(shí)候獲取,然后修改該值的時(shí)候,要保存到本地的 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>
);
}

很顯然,這些邏輯完全可以封裝為一個(gè) 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);
}
];
};

邏輯并不復(fù)雜。就是在讀和寫的時(shí)候,加上 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>
);
}

其實(shí)這個(gè)實(shí)現(xiàn)還是比較粗糙的,只支持字符串格式,如果你要保存對(duì)象,需要自己手動(dòng) JSON.parse 和 JSON.stringify 來擴(kuò)展了數(shù)據(jù)類型的范圍。

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

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 序列化和反序列方法如果不夠用,我們可以再加個(gè)自定義序列反序列化方法:

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);
}
];
};

其實(shí)優(yōu)秀的第三方 React Hook 庫 ahooks 也有這個(gè)實(shí)現(xiàn),我還是建議大家用一些比較成熟的輪子,我這里只是提供一下思路。

ahooks 的 useLocalStorageState 的源碼:

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

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2017-06-20 12:48:55

React Nativ自定義模塊Note.js

2024-06-13 09:50:45

2023-12-21 09:00:21

函數(shù)React 組件useEffect

2012-11-19 11:07:42

IBMdw

2020-09-18 10:12:24

KotlinTCP網(wǎng)絡(luò)協(xié)議

2023-09-27 22:10:47

Vue.jsJavaScript

2021-02-23 08:01:01

HooksReact架構(gòu)

2024-03-19 00:00:00

ReactJavaScript開發(fā)

2009-04-28 13:25:36

Ajax函數(shù)Java

2021-07-26 09:00:08

ReactHooks 項(xiàng)目

2021-03-09 15:23:45

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-01-06 05:25:56

項(xiàng)目Springboot應(yīng)用

2022-06-20 08:37:28

接口tokenAO

2009-09-07 22:00:15

LINQ自定義

2020-10-21 11:34:49

React Hook庫

2022-05-18 07:44:13

自定義菜單前端

2015-02-12 15:33:43

微信SDK

2009-06-17 16:00:03

Hibernate自定

2009-09-03 13:34:03

.NET自定義控件

2013-01-09 17:22:38

Android開發(fā)Camera
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产中文 | 99精品国产一区二区青青牛奶 | 国产日韩精品在线 | xxxxx黄色片| 综合视频在线 | 日韩色视频| 国产亚洲成av人片在线观看桃 | 99pao成人国产永久免费视频 | 爱综合 | 91免费观看视频 | 国产亚洲欧美在线 | 国产欧美三区 | 秋霞影院一区二区 | 91精品一区 | 亚洲网站在线观看 | 色黄视频在线 | 久久中文一区二区 | 精品久久久久久红码专区 | 亚洲视频欧美视频 | chinese中国真实乱对白 | 啪啪免费网站 | 日日夜夜精品免费视频 | 午夜成人免费视频 | 国产精品国产三级国产aⅴ无密码 | 国产成人精品免高潮在线观看 | 国产精品久久久久久久久久免费 | 久久最新 | 黑人中文字幕一区二区三区 | 一区在线视频 | 天天拍天天插 | 在线一级片 | 日韩一区在线播放 | 久久久久久九九九九 | 国产在线小视频 | 亚洲精品1区2区3区 91免费看片 | av国产精品毛片一区二区小说 | 不卡的av在线 | 亚洲乱码一区二区三区在线观看 | 国产日韩精品在线 | 亚洲精品1区 | 日韩欧美在线视频一区 |