-
Notifications
You must be signed in to change notification settings - Fork 707
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: 添加observedData * feat: 修改错误 * fix: 修复单测报错问题 * feat: 完善数据源事件 * fix: 修复数据源事件调用组件方法时报错的异常 * fix: 修复多个相同类型的数据源数据变化的事件混淆的问题 * chore: 删除无用代码 * feat: 默认使用SimpleObservedData * feat: 删除无用代码 --------- Co-authored-by: marchyang <[email protected]>
- Loading branch information
Showing
18 changed files
with
314 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
49 changes: 49 additions & 0 deletions
49
packages/data-source/src/observed-data/DeepObservedData.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
import State from 'deep-state-observer'; | ||
|
||
import { ObservedData } from './ObservedData'; | ||
|
||
const ignoreFirstCall = <F extends (...args: any[]) => any>(fn: F) => { | ||
let calledTimes = 0; | ||
return (...args: Parameters<F>) => { | ||
if (calledTimes === 0) { | ||
calledTimes += 1; | ||
return; | ||
} | ||
return fn(...args); | ||
}; | ||
}; | ||
|
||
export class DeepObservedData extends ObservedData { | ||
state?: State; | ||
subscribers = new Map<string, Map<Function, () => void>>(); | ||
constructor(initialData: Record<string, any>) { | ||
super(); | ||
this.state = new State(initialData); | ||
} | ||
update = (data: any, path?: string) => { | ||
this.state?.update(path ?? '', data); | ||
}; | ||
on = (path: string, callback: (newVal: any) => void) => { | ||
// subscribe 会立即执行一次,ignoreFirstCall 会忽略第一次执行 | ||
const unsubscribe = this.state!.subscribe(path, ignoreFirstCall(callback)); | ||
|
||
// 把取消监听的函数保存下来,供 off 时调用 | ||
const pathSubscribers = this.subscribers.get(path) ?? new Map<Function, () => void>(); | ||
pathSubscribers.set(callback, unsubscribe); | ||
this.subscribers.set(path, pathSubscribers); | ||
}; | ||
off = (path: string, callback: (newVal: any) => void) => { | ||
const pathSubscribers = this.subscribers.get(path); | ||
if (!pathSubscribers) return; | ||
|
||
pathSubscribers.get(callback)?.(); | ||
pathSubscribers.delete(callback); | ||
}; | ||
getData = (path: string) => (!this.state ? {} : this.state?.get(path)); | ||
destroy = () => { | ||
// 销毁所有未被取消的监听 | ||
this.subscribers.forEach((pathSubscribers) => { | ||
pathSubscribers.forEach((unsubscribe) => unsubscribe()); | ||
}); | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
export abstract class ObservedData { | ||
abstract update(data: any, path?: string): void; | ||
|
||
abstract on(path: string, callback: (newVal: any) => void): void; | ||
|
||
abstract off(path: string, callback: (newVal: any) => void): void; | ||
|
||
abstract getData(path: string): any; | ||
|
||
abstract destroy(): void; | ||
} |
38 changes: 38 additions & 0 deletions
38
packages/data-source/src/observed-data/SimpleObservedData.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import { EventEmitter } from 'events'; | ||
|
||
import { getValueByKeyPath, setValueByKeyPath } from '@tmagic/utils'; | ||
|
||
import { ObservedData } from './ObservedData'; | ||
|
||
export class SimpleObservedData extends ObservedData { | ||
data: Record<string, any> = {}; | ||
private event = new EventEmitter(); | ||
|
||
constructor(initialData: Record<string, any>) { | ||
super(); | ||
this.data = initialData; | ||
} | ||
update(data: any, path?: string): void { | ||
if (path) { | ||
setValueByKeyPath(path, data, this.data); | ||
} else { | ||
this.data = data; | ||
} | ||
|
||
const changeEvent = { | ||
updateData: data, | ||
path: path ?? '', | ||
}; | ||
this.event.emit(path ?? '', changeEvent); | ||
} | ||
on(path: string, callback: (newVal: any) => void): void { | ||
this.event.on(path, callback); | ||
} | ||
off(path: string, callback: (newVal: any) => void): void { | ||
this.event.off(path, callback); | ||
} | ||
getData(path: string) { | ||
return path ? getValueByKeyPath(path, this.data) : this.data; | ||
} | ||
destroy(): void {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
export { ObservedData } from './ObservedData'; | ||
export { DeepObservedData } from './DeepObservedData'; | ||
export { SimpleObservedData } from './SimpleObservedData'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.