Files
nexus-hub/stores/componentStore.ts
2025-03-22 17:15:35 +00:00

70 lines
1.8 KiB
TypeScript

import { DraggablePropsType } from "@/components/Draggable/Draggable";
import { makeAutoObservable, reaction } from "mobx";
import { debounce } from 'lodash';
class ComponentsStore {
components: DraggablePropsType[] = [];
constructor() {
makeAutoObservable(this);
this.loadFromLocalStorage(); // 初始化加载
// 监听 components 变化自动保存(防抖版)
reaction(
() => this.components.slice(), // 深度监听变化
debounce(() => this.saveToLocalStorage(), 500)
);
}
// 初始化时从本地存储加载
private loadFromLocalStorage() {
if (window === undefined) {
return
}
const data = localStorage.getItem("componentsStore");
if (data) {
try {
this.components = JSON.parse(data);
} catch (e) {
console.error("Failed to parse stored components", e);
}
}
}
// 防抖保存到本地存储
private saveToLocalStorage = debounce(() => {
localStorage.setItem("componentsStore", JSON.stringify(this.components));
}, 100);
// 以下方法会触发自动保存
initComponent(componentsList: DraggablePropsType[]) {
this.components = componentsList || [];
}
changeComponent(updatedComponent: DraggablePropsType) {
this.components = this.components.map(item =>
item.id === updatedComponent.id ? updatedComponent : item
);
}
deleteComponent(targetComponent: DraggablePropsType) {
this.components = this.components.filter(
item => item.id !== targetComponent.id
);
}
addComponent(widgetsId: string, data:Record<string, unknown>) {
this.components.push({
id: String(this.components.length),
x: 0,
y: 0,
width: 0,
height: 0,
widgetsId,
data,
})
}
}
export default new ComponentsStore();