Skip to content

Commit a3ae458

Browse files
authored
refactor: syntactic sugar 🍬 unref replace isRef (#29)
* style: optimized code * refactor: syntactic sugar 🍬 unref replace isRef
1 parent 413c19b commit a3ae458

File tree

13 files changed

+269
-292
lines changed

13 files changed

+269
-292
lines changed

README.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
## 📚 文档
2727

28-
查看 <a href="http://nelsonyong.gitee.io/docs/hooks" target="_blank">文档指南</a>
28+
查看 <a href="https://nelsonyong.gitee.io/docs/hooks" target="_blank">文档指南</a>
2929

3030
## ✨ 特性
3131

packages/hooks/docs/.vitepress/config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export default defineConfig({
3434
{ text: '首页', link: '/' },
3535
{ text: 'Hooks', link: '/useRequest/' },
3636
{
37-
text: '演练场 (PC)',
37+
text: 'Playground',
3838
link: 'http://43.138.187.142:9000/vue-hooks-plus/vhp-playground/',
3939
},
4040
isGithub
@@ -43,7 +43,7 @@ export default defineConfig({
4343
link: 'http://nelsonyong.gitee.io/docs/hooks/',
4444
}
4545
: {
46-
text: 'github 镜像',
46+
text: 'Github 站点',
4747
link: 'https://inhiblabcore.github.io/docs/hooks/',
4848
},
4949
{
Lines changed: 78 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,105 @@
11
/* eslint-disable no-empty */
2-
import { isRef, ref, Ref, UnwrapRef, watchEffect } from 'vue'
2+
import { unref, ref, Ref, UnwrapRef, watchEffect } from 'vue'
33

44
export interface IFuncUpdater<T> {
5-
(previousState?: T): T
5+
(previousState?: T): T
66
}
77
export interface IFuncStorage {
8-
(): Storage
8+
(): Storage
99
}
1010

1111
export interface Options<T> {
12-
serializer?: (value: T) => string
13-
deserializer?: (value: string) => T
12+
serializer?: (value: T) => string
13+
deserializer?: (value: string) => T
1414
}
1515

1616
export interface OptionsWithDefaultValue<T> extends Options<T> {
17-
defaultValue: T | IFuncUpdater<T>
17+
defaultValue: T | IFuncUpdater<T>
1818
}
1919

20-
export type StorageStateResult<T> = [
21-
Ref<T> | Ref<undefined>,
22-
(value?: T | IFuncUpdater<T>) => void
23-
]
20+
export type StorageStateResult<T> = [Ref<T> | Ref<undefined>, (value?: T | IFuncUpdater<T>) => void]
2421
export type StorageStateResultHasDefaultValue<T> = [
25-
Ref<T> | Ref<undefined>,
26-
(value?: T | IFuncUpdater<T> | undefined) => void
22+
Ref<T> | Ref<undefined>,
23+
(value?: T | IFuncUpdater<T> | undefined) => void,
2724
]
2825

2926
function isFunction<T>(obj: any): obj is T {
30-
return typeof obj === 'function'
27+
return typeof obj === 'function'
3128
}
3229

3330
export function createUseStorageState(getStorage: () => Storage | undefined) {
34-
function useStorageState<T>(
35-
key: Ref<string> | string,
36-
options?: OptionsWithDefaultValue<T>
37-
): StorageStateResultHasDefaultValue<T>
31+
function useStorageState<T>(
32+
key: Ref<string> | string,
33+
options?: OptionsWithDefaultValue<T>,
34+
): StorageStateResultHasDefaultValue<T>
3835

39-
function useStorageState<T>(
40-
key: Ref<string> | string,
41-
options?: Options<T> & OptionsWithDefaultValue<T>
42-
) {
43-
let storage: Storage | undefined
44-
try {
45-
storage = getStorage()
46-
} catch (err) {
47-
console.error(err)
48-
}
36+
function useStorageState<T>(
37+
key: Ref<string> | string,
38+
options?: Options<T> & OptionsWithDefaultValue<T>,
39+
) {
40+
let storage: Storage | undefined
41+
try {
42+
storage = getStorage()
43+
} catch (err) {
44+
console.error(err)
45+
}
4946

50-
const serializer = (value: T) => {
51-
if (options?.serializer) {
52-
return options?.serializer(value)
53-
}
54-
return JSON.stringify(value)
55-
}
47+
const serializer = (value: T) => {
48+
if (options?.serializer) {
49+
return options?.serializer(value)
50+
}
51+
return JSON.stringify(value)
52+
}
5653

57-
const deserializer = (value: string) => {
58-
if (options?.deserializer) {
59-
return options?.deserializer(value)
60-
}
61-
return JSON.parse(value)
62-
}
54+
const deserializer = (value: string) => {
55+
if (options?.deserializer) {
56+
return options?.deserializer(value)
57+
}
58+
return JSON.parse(value)
59+
}
6360

64-
function getStoredValue() {
65-
try {
66-
const raw = storage?.getItem(isRef(key) ? key.value : key)
67-
if (raw) {
68-
return deserializer(raw)
69-
}
70-
} catch (e) {
71-
console.error(e)
72-
}
73-
if (isFunction<IFuncUpdater<T>>(options?.defaultValue)) {
74-
return options?.defaultValue()
75-
}
76-
return options?.defaultValue
77-
}
78-
const state = ref<T | undefined>(getStoredValue())
79-
watchEffect(() => {
80-
if (key) state.value = getStoredValue()
81-
})
61+
function getStoredValue() {
62+
try {
63+
const raw = storage?.getItem(unref(key))
64+
if (raw) {
65+
return deserializer(raw)
66+
}
67+
} catch (e) {
68+
console.error(e)
69+
}
70+
if (isFunction<IFuncUpdater<T>>(options?.defaultValue)) {
71+
return options?.defaultValue()
72+
}
73+
return options?.defaultValue
74+
}
75+
const state = ref<T | undefined>(getStoredValue())
76+
watchEffect(() => {
77+
if (key) state.value = getStoredValue()
78+
})
8279

83-
const updateState = (value?: T | IFuncUpdater<T>) => {
84-
if (typeof value === 'undefined') {
85-
state.value = undefined
86-
storage?.removeItem(isRef(key) ? key.value : key)
87-
} else if (isFunction<IFuncUpdater<T>>(value)) {
88-
const currentState = value(state.value as T)
89-
try {
90-
state.value = currentState as UnwrapRef<T>
91-
storage?.setItem(
92-
isRef(key) ? key.value : key,
93-
serializer(currentState)
94-
)
95-
} catch (e) {
96-
console.error(e)
97-
}
98-
} else {
99-
try {
100-
state.value = value as UnwrapRef<T>
101-
storage?.setItem(isRef(key) ? key.value : key, serializer(value))
102-
} catch (e) {
103-
console.error(e)
104-
}
105-
}
106-
}
80+
const updateState = (value?: T | IFuncUpdater<T>) => {
81+
if (typeof value === 'undefined') {
82+
state.value = undefined
83+
storage?.removeItem(unref(key))
84+
} else if (isFunction<IFuncUpdater<T>>(value)) {
85+
const currentState = value(state.value as T)
86+
try {
87+
state.value = currentState as UnwrapRef<T>
88+
storage?.setItem(unref(key), serializer(currentState))
89+
} catch (e) {
90+
console.error(e)
91+
}
92+
} else {
93+
try {
94+
state.value = value as UnwrapRef<T>
95+
storage?.setItem(unref(key), serializer(value))
96+
} catch (e) {
97+
console.error(e)
98+
}
99+
}
100+
}
107101

108-
return [state, updateState]
109-
}
110-
return useStorageState
102+
return [state, updateState]
103+
}
104+
return useStorageState
111105
}

0 commit comments

Comments
 (0)