本文介绍了一个Vue框架下的可重置的响应式状态创建函数,用于创建出可重置的reactive。
源码
useResettableState.ts
import { reactive } from 'vue';
import { cloneDeep } from 'lodash-es';
/**
* 创建一个可重置的响应式状态
* @param initialStateFactory 返回初始状态的函数
* @returns 包含响应式 state 和 reset 方法的对象
*/
export function useResettableState<T extends Record<string, any>>(initialStateFactory: () => T) {
// 获取初始状态并深度克隆(用于后续重置)
const initialState = cloneDeep(initialStateFactory());
// 创建响应式状态(深度克隆避免引用共享)
const state = reactive(cloneDeep(initialState)) as T;
/**
* 重置状态为初始值
*/
const reset = (): void => {
const freshState = cloneDeep(initialState);
// 清除当前所有属性(处理动态增删字段的场景)
Object.keys(state).forEach((key) => {
delete (state as Record<string, any>)[key];
});
// 恢复初始结构
Object.keys(freshState).forEach((key) => {
(state as Record<string, any>)[key] = freshState[key];
});
};
return {
state,
reset,
};
}
使用示例
import { useResettableState } from '@/tools/composables/useResettableState';
// 一个表单对象
const { state: stateForm, reset: resetStateForm } = useResettableState(() => ({
name: '',
type: 'user' as 'user' | 'system'
isEnabled: true,
file: undefined as File | undefined,
}));
function submitForm() {
// 模拟提交
...
// 提交成功后重置表单
resetStateForm();
}