89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
/**
|
||
* 支持通过 name 路径批量/单项赋值 Pinia store 的工具方法
|
||
* @param store Pinia store 实例
|
||
* @param params { name: string, value: any }
|
||
* name 支持 a.b.c 形式嵌套赋值
|
||
*/
|
||
/**
|
||
* 用法示例:
|
||
* setStoreValue(userStore, { name: 'profile.avatar', value: 'xxx.png' })
|
||
* setStoreValueTyped(userStore, 'token', 'xxxx')
|
||
* setStoreValues(userStore, [{ name: 'token', value: 'xxx' }, { name: 'profile.avatar', value: 'img.png' }])
|
||
* getStoreValue(userStore, 'profile.avatar')
|
||
* resetStore(userStore, { token: '', profile: { avatar: '' } })
|
||
*/
|
||
export function setStoreValue<T extends object>(store: T, params: { name: string; value: any }): void {
|
||
const nameArr = params.name.split('.');
|
||
let obj: any = store;
|
||
if (nameArr.length >= 2) {
|
||
for (let i = 0; i < nameArr.length - 1; i++) {
|
||
if (!(nameArr[i] in obj)) {
|
||
obj[nameArr[i]] = {};
|
||
}
|
||
obj = obj[nameArr[i]];
|
||
}
|
||
obj[nameArr[nameArr.length - 1]] = params.value;
|
||
} else {
|
||
(store as any)[params.name] = params.value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 类型安全的嵌套属性赋值工具
|
||
* @param store Pinia store 实例
|
||
* @param path 属性路径(如 profile.avatar)
|
||
* @param value 赋值内容
|
||
*/
|
||
export function setStoreValueTyped<T, K extends keyof T>(store: T, path: K, value: T[K]): void;
|
||
export function setStoreValueTyped<T>(store: T, path: string, value: any): void {
|
||
const nameArr = path.split('.');
|
||
let obj: any = store;
|
||
if (nameArr.length >= 2) {
|
||
for (let i = 0; i < nameArr.length - 1; i++) {
|
||
if (!(nameArr[i] in obj)) {
|
||
obj[nameArr[i]] = {};
|
||
}
|
||
obj = obj[nameArr[i]];
|
||
}
|
||
obj[nameArr[nameArr.length - 1]] = value;
|
||
} else {
|
||
(store as any)[path] = value;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 批量赋值 Pinia store 工具方法
|
||
* @param store Pinia store 实例
|
||
* @param values { name: string, value: any }[]
|
||
*/
|
||
export function setStoreValues<T extends object>(store: T, values: Array<{ name: string; value: any }>): void {
|
||
values.forEach(item => setStoreValue(store, item));
|
||
}
|
||
|
||
/**
|
||
* 获取嵌套属性值
|
||
* @param store Pinia store 实例
|
||
* @param path 属性路径(如 profile.avatar)
|
||
* @returns 属性值
|
||
*/
|
||
export function getStoreValue<T>(store: T, path: string): any {
|
||
const nameArr = path.split('.');
|
||
let obj: any = store;
|
||
for (let i = 0; i < nameArr.length; i++) {
|
||
if (obj == null) return undefined;
|
||
obj = obj[nameArr[i]];
|
||
}
|
||
return obj;
|
||
}
|
||
|
||
/**
|
||
* 重置 Pinia store 为初始值
|
||
* @param store Pinia store 实例
|
||
* @param initial 初始值对象
|
||
*/
|
||
export function resetStore<T extends object>(store: T, initial: Partial<T>): void {
|
||
Object.keys(initial).forEach(key => {
|
||
(store as any)[key] = (initial as any)[key];
|
||
});
|
||
}
|