]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: simplify lifecycle hook call logic
authorEvan You <yyx990803@gmail.com>
Thu, 25 Mar 2021 20:48:51 +0000 (16:48 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 25 Mar 2021 20:48:51 +0000 (16:48 -0400)
packages/runtime-core/src/componentOptions.ts

index 604531da677cfec584a22bea381699f7d9c8103f..e101a8c96a7aef128a676a0ad69e84141bf69453 100644 (file)
@@ -816,59 +816,31 @@ function callSyncHook(
   instance: ComponentInternalInstance,
   globalMixins: ComponentOptions[]
 ) {
-  callHookFromMixins(name, type, globalMixins, instance)
-  const { extends: base, mixins } = options
-  if (base) {
-    callHookFromExtends(name, type, base, instance)
-  }
-  if (mixins) {
-    callHookFromMixins(name, type, mixins, instance)
-  }
-  const selfHook = options[name]
-  if (selfHook) {
-    callWithAsyncErrorHandling(selfHook.bind(instance.proxy!), instance, type)
+  for (let i = 0; i < globalMixins.length; i++) {
+    callHookWithMixinAndExtends(name, type, globalMixins[i], instance)
   }
+  callHookWithMixinAndExtends(name, type, options, instance)
 }
 
-function callHookFromExtends(
+function callHookWithMixinAndExtends(
   name: 'beforeCreate' | 'created',
   type: LifecycleHooks,
-  base: ComponentOptions,
+  options: ComponentOptions,
   instance: ComponentInternalInstance
 ) {
-  if (base.extends) {
-    callHookFromExtends(name, type, base.extends, instance)
-  }
-  const chainedMixins = base.mixins
-  if (chainedMixins) {
-    callHookFromMixins(name, type, chainedMixins, instance)
-  }
-  const baseHook = base[name]
-  if (baseHook) {
-    callWithAsyncErrorHandling(baseHook.bind(instance.proxy!), instance, type)
+  const { extends: base, mixins } = options
+  const selfHook = options[name]
+  if (base) {
+    callHookWithMixinAndExtends(name, type, base, instance)
   }
-}
-
-function callHookFromMixins(
-  name: 'beforeCreate' | 'created',
-  type: LifecycleHooks,
-  mixins: ComponentOptions[],
-  instance: ComponentInternalInstance
-) {
-  for (let i = 0; i < mixins.length; i++) {
-    const chainedMixins = mixins[i].mixins
-    const chainedExtends = mixins[i].extends
-    if (chainedExtends) {
-      callHookFromExtends(name, type, chainedExtends, instance)
-    }
-    if (chainedMixins) {
-      callHookFromMixins(name, type, chainedMixins, instance)
-    }
-    const fn = mixins[i][name]
-    if (fn) {
-      callWithAsyncErrorHandling(fn.bind(instance.proxy!), instance, type)
+  if (mixins) {
+    for (let i = 0; i < mixins.length; i++) {
+      callHookWithMixinAndExtends(name, type, mixins[i], instance)
     }
   }
+  if (selfHook) {
+    callWithAsyncErrorHandling(selfHook.bind(instance.proxy!), instance, type)
+  }
 }
 
 function applyMixins(