Skip to content

Commit 63054a5

Browse files
committed
does this help?
1 parent 60f5d7d commit 63054a5

1 file changed

Lines changed: 7 additions & 1 deletion

File tree

src/vanilla.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,17 @@ export function proxy<T extends object>(baseObject: T = {} as T): T {
192192
}
193193
let version = versionHolder[0]
194194
const listeners = new Set<Listener>()
195+
let listenerArrayCache: Listener[] | null = null
195196
const notifyUpdate = (
196197
op: Op | undefined,
197198
nextVersion = ++versionHolder[0],
198199
) => {
199200
if (version !== nextVersion) {
200201
checkVersion = version = nextVersion
201-
listeners.forEach((listener) => listener(op, nextVersion))
202+
listenerArrayCache ||= Array.from(listeners)
203+
for (let i = 0; i < listenerArrayCache.length; ++i) {
204+
listenerArrayCache[i]!(op, nextVersion)
205+
}
202206
}
203207
}
204208
let checkVersion = version
@@ -252,6 +256,7 @@ export function proxy<T extends object>(baseObject: T = {} as T): T {
252256
}
253257
const addListener = (listener: Listener) => {
254258
listeners.add(listener)
259+
listenerArrayCache = null
255260
if (listeners.size === 1) {
256261
propProxyStates.forEach(([propProxyState, prevRemove], prop) => {
257262
if (import.meta.env?.MODE !== 'production' && prevRemove) {
@@ -263,6 +268,7 @@ export function proxy<T extends object>(baseObject: T = {} as T): T {
263268
}
264269
const removeListener = () => {
265270
listeners.delete(listener)
271+
listenerArrayCache = null
266272
if (listeners.size === 0) {
267273
propProxyStates.forEach(([propProxyState, remove], prop) => {
268274
if (remove) {

0 commit comments

Comments
 (0)