From 83e6a35c6f72dc63254ffd012f99ccd397c4e958 Mon Sep 17 00:00:00 2001 From: e_the <52271267+ethesky-rcplatformhk@users.noreply.github.com> Date: Wed, 9 Mar 2022 21:00:23 +0800 Subject: [PATCH] perf(reactive-vue): optimize vue3 tracker performance consumption of multiple instances (#2911) * fix(reactive-vue): fix vue3 render dependency collection broken * perf(reactive-vue): optimize vue3 tracker performance consumption of multiple instances --- lerna.json | 4 +--- packages/reactive-vue/src/hooks/useObserver.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/lerna.json b/lerna.json index b5cc89b907d..63726cb4fe6 100644 --- a/lerna.json +++ b/lerna.json @@ -2,9 +2,7 @@ "version": "2.0.14", "npmClient": "yarn", "useWorkspaces": true, - "npmClientArgs": [ - "--ignore-engines" - ], + "npmClientArgs": ["--ignore-engines"], "command": { "version": { "forcePublish": true, diff --git a/packages/reactive-vue/src/hooks/useObserver.ts b/packages/reactive-vue/src/hooks/useObserver.ts index 196b029cb2b..e515194299a 100644 --- a/packages/reactive-vue/src/hooks/useObserver.ts +++ b/packages/reactive-vue/src/hooks/useObserver.ts @@ -1,5 +1,5 @@ import { Tracker } from '@formily/reactive' -import { getCurrentInstance, onBeforeUnmount, isVue3 } from 'vue-demi' +import { getCurrentInstance, onBeforeUnmount, isVue3, nextTick } from 'vue-demi' import { IObserverOptions } from '../types' /* istanbul ignore next */ @@ -23,8 +23,8 @@ export const useObserver = (options?: IObserverOptions) => { }, set(newValue) { vm['_updateEffectRun'] = newValue.run + disposeTracker() const newTracker = () => { - disposeTracker() tracker = new Tracker(() => { if (options?.scheduler && typeof options.scheduler === 'function') { options.scheduler(update) @@ -33,15 +33,15 @@ export const useObserver = (options?: IObserverOptions) => { } }) } - const update = function () { - newTracker() - let refn: any = null + let runUpdate = () => { tracker?.track(() => { - refn = vm['_updateEffectRun'].call(newValue) + vm['_updateEffectRun'].call(newValue) }) - return refn } - + const update = function () { + nextTick(runUpdate) + } + newTracker() newValue.run = update vm['_updateEffect'] = newValue },