]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: $children compat
authorEvan You <yyx990803@gmail.com>
Tue, 6 Apr 2021 20:51:11 +0000 (16:51 -0400)
committerEvan You <yyx990803@gmail.com>
Wed, 7 Apr 2021 20:19:24 +0000 (16:19 -0400)
packages/runtime-core/src/compat/children.ts [new file with mode: 0644]
packages/runtime-core/src/compat/deprecations.ts
packages/runtime-core/src/compat/instance.ts

diff --git a/packages/runtime-core/src/compat/children.ts b/packages/runtime-core/src/compat/children.ts
new file mode 100644 (file)
index 0000000..c444d2e
--- /dev/null
@@ -0,0 +1,28 @@
+import { ShapeFlags } from '@vue/shared/src'
+import { ComponentInternalInstance } from '../component'
+import { ComponentPublicInstance } from '../componentPublicInstance'
+import { VNode } from '../vnode'
+import { DeprecationTypes, warnDeprecation } from './deprecations'
+
+export function getInstanceChildren(
+  instance: ComponentInternalInstance
+): ComponentPublicInstance[] {
+  __DEV__ && warnDeprecation(DeprecationTypes.INSTANCE_CHILDREN)
+  const root = instance.subTree
+  const children: ComponentPublicInstance[] = []
+  if (root) {
+    walk(root, children)
+  }
+  return children
+}
+
+function walk(vnode: VNode, children: ComponentPublicInstance[]) {
+  if (vnode.component) {
+    children.push(vnode.component.proxy!)
+  } else if (vnode.shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
+    const vnodes = vnode.children as VNode[]
+    for (let i = 0; i < vnodes.length; i++) {
+      walk(vnodes[i], children)
+    }
+  }
+}
index f71d77ff040c07923178381fa34878fe71898961..a371649c12be2304c2feea4e1e6c93ae6d5069a9 100644 (file)
@@ -20,6 +20,7 @@ export const enum DeprecationTypes {
   INSTANCE_DESTROY,
   INSTANCE_EVENT_EMITTER,
   INSTANCE_EVENT_HOOKS,
+  INSTANCE_CHILDREN,
 
   OPTIONS_DATA_FN,
   OPTIONS_DATA_MERGE,
@@ -148,6 +149,13 @@ const deprecations: Record<DeprecationTypes, DeprecationData> = {
     link: `https://v3.vuejs.org/api/composition-api.html#lifecycle-hooks`
   },
 
+  [DeprecationTypes.INSTANCE_CHILDREN]: {
+    message:
+      `vm.$children has been removed. Consider refactoring your logic ` +
+      `to avoid relying on direct access to child components.`,
+    link: `https://v3.vuejs.org/guide/migration/children.html`
+  },
+
   [DeprecationTypes.OPTIONS_DATA_FN]: {
     message:
       `The "data" option can no longer be a plain object. ` +
index a7158addbfb804fe6f84f88aee8b9d2353eb07a9..557706f26da97de41c22ab734789a909b86ffe73 100644 (file)
@@ -1,5 +1,6 @@
 import { extend, NOOP } from '@vue/shared'
 import { PublicPropertiesMap } from '../componentPublicInstance'
+import { getInstanceChildren } from './children'
 import { DeprecationTypes, warnDeprecation } from './deprecations'
 import { off, on, once } from './eventEmitter'
 
@@ -33,6 +34,7 @@ export function installCompatInstanceProperties(map: PublicPropertiesMap) {
     },
     $on: i => on.bind(null, i),
     $once: i => once.bind(null, i),
-    $off: i => off.bind(null, i)
+    $off: i => off.bind(null, i),
+    $children: getInstanceChildren
   } as PublicPropertiesMap)
 }