feat(core): node新增registerMethod方法,用于组件注册供其他组件通过事件配置调用

This commit is contained in:
roymondchen 2025-03-06 20:08:47 +08:00
parent c8e1cffca9
commit ff07147270

View File

@ -32,6 +32,10 @@ interface EventCache {
args: any[]; args: any[];
} }
interface Methods {
[key: string]: (...args: any[]) => any;
}
export interface NodeOptions { export interface NodeOptions {
config: MNode; config: MNode;
page?: Page; page?: Page;
@ -45,7 +49,7 @@ class Node extends EventEmitter {
[key: string]: any; [key: string]: any;
}; };
public events: EventConfig[] = []; public events: EventConfig[] = [];
public instance?: any; public instance?: any = {};
public page?: Page; public page?: Page;
public parent?: Node; public parent?: Node;
public app: TMagicApp; public app: TMagicApp;
@ -69,6 +73,7 @@ class Node extends EventEmitter {
const { events, style } = data; const { events, style } = data;
this.events = events || []; this.events = events || [];
this.style = style || {}; this.style = style || {};
this.instance.config = data;
this.emit('update-data', data); this.emit('update-data', data);
} }
@ -76,6 +81,22 @@ class Node extends EventEmitter {
this.eventQueue.push(event); this.eventQueue.push(event);
} }
public registerMethod(methods: Methods) {
if (!methods) {
return;
}
if (!this.instance) {
this.instance = {};
}
for (const [key, fn] of Object.entries(methods)) {
if (typeof fn === 'function') {
this.instance[key] = fn;
}
}
}
public async runHookCode(hook: string, params?: Record<string, any>) { public async runHookCode(hook: string, params?: Record<string, any>) {
if (typeof this.data[hook] === 'function') { if (typeof this.data[hook] === 'function') {
// 兼容旧的数据格式 // 兼容旧的数据格式
@ -137,12 +158,23 @@ class Node extends EventEmitter {
this.listenLifeSafe(); this.listenLifeSafe();
}); });
this.instance = instance; if (instance) {
this.registerMethod(instance);
if (instance.config) {
this.setData(instance.config);
}
}
await this.runHookCode('created'); await this.runHookCode('created');
}); });
this.once('mounted', async (instance: any) => { this.once('mounted', async (instance: any) => {
this.instance = instance; if (instance) {
this.registerMethod(instance);
if (instance.config) {
this.setData(instance.config);
}
}
for (let eventConfig = this.eventQueue.shift(); eventConfig; eventConfig = this.eventQueue.shift()) { for (let eventConfig = this.eventQueue.shift(); eventConfig; eventConfig = this.eventQueue.shift()) {
if (typeof instance[eventConfig.method] === 'function') { if (typeof instance[eventConfig.method] === 'function') {