av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

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

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

最近做需求,需要將數(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 (

changeValue(e.target.value)}/>

);
}

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

setValue(e.target.value)} />

);
}

其實(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 (

value={value.name}
onChange={(e) => setValue({ name: e.target.value })}
/>

);
}

另外,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。


網(wǎng)站欄目:實(shí)現(xiàn)一個(gè)自定義ReactHook:UseLocalStorageState
文章地址:http://uogjgqi.cn/article/djcigjo.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流