【发布时间】:2020-12-05 21:00:43
【问题描述】:
TLDR
我可以检查一下关于
event poolingreact 逻辑的实现吗?
我想知道event pooling的原理:)
问题
当我深入研究 react 文档时,我看到了 event pooling。
所以,我很好奇event pooling 是什么,我对此进行了研究。
现在我意识到thread pooling。所以它的工作方式类似。所以我做了一些伪event pooling逻辑。
我想知道它是否有意义?
以及任何知道
event pooling实现在react包中的位置的人。
请给我评论
伪事件池
EventPool 伪实现
class EventPool {
private static instance: EventPool;
private taskQueue: Event[] = [];
private constructor() {
this.taskQueue = [];
}
public static shared() {
if (!EventPool.instance) {
EventPool.instance = new EventPool();
}
return EventPool.instance;
}
enqueue = (event: Event) => {
this.taskQueue = this.taskQueue.concat(event);
};
dequeue = (currentTarget: any) => {
this.taskQueue = this.taskQueue.filter(
(event: Event) => event.currentTarget === currentTarget
);
};
clear() {
// This function called before or after render
// (Commit -> Render -> EventPool.shared().clear()) or (Commit -> EventPool.shared().clear() -> Render)
this.taskQueue = this.taskQueue.filter((event) => event.isDone === true);
}
}
关于persist的事件伪实现
class Event {
persist = () => {
// This is executed before EventPool.shared.clear
EventPool.shared().dequeue(this);
};
}
参考
【问题讨论】:
-
React 17 removed event pooling,仅供参考...
-
哦,我明白了,但我只是想知道这个原理!
-
非常感谢帕特里克·罗伯茨!
-
你的
EventPool没有意义,不。目的是创建一个预分配的SyntheticEvent对象池,并重用这些实例以减少垃圾收集的负担。您的EventPool没有展示这种优化,事实上,使用每个filter()和concat()创建新的taskQueue数组实例会给垃圾收集带来更多 负担。 -
哦,我明白了!我只想知道真实事件池的逻辑:0 这只是我的伪代码!
filter()和concat()仅用于描述操作
标签: reactjs typescript event-handling pooling