@@ -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