Browse Source

feat: inheritAttrs

Evan You 7 years ago
parent
commit
b5db956f9a

+ 1 - 0
packages/core/src/component.ts

@@ -21,6 +21,7 @@ export interface ComponentClass extends Flatten<typeof Component> {
 export interface FunctionalComponent<P = Data> extends RenderFunction<P> {
   pure?: boolean
   props?: ComponentPropsOptions<P>
+  inheritAttrs?: boolean
 }
 
 // this interface is merged with the class type

+ 1 - 0
packages/core/src/componentOptions.ts

@@ -13,6 +13,7 @@ export interface ComponentOptions<D = Data, P = Data> {
   computed?: ComponentComputedOptions<D, P>
   watch?: ComponentWatchOptions<D, P>
   render?: RenderFunction<P>
+  inheritAttrs?: boolean
   // TODO other options
   readonly [key: string]: any
 }

+ 8 - 3
packages/core/src/componentUtils.ts

@@ -71,7 +71,11 @@ export function renderInstanceRoot(instance: MountedComponent) {
       }
     }
   }
-  return normalizeComponentRoot(vnode, instance.$parentVNode)
+  return normalizeComponentRoot(
+    vnode,
+    instance.$parentVNode,
+    instance.$options.inheritAttrs
+  )
 }
 
 export function teardownComponentInstance(instance: MountedComponent) {
@@ -88,7 +92,8 @@ export function teardownComponentInstance(instance: MountedComponent) {
 
 export function normalizeComponentRoot(
   vnode: any,
-  componentVNode: VNode | null
+  componentVNode: VNode | null,
+  inheritAttrs: boolean | void
 ): VNode {
   if (vnode == null) {
     vnode = createTextVNode('')
@@ -104,7 +109,7 @@ export function normalizeComponentRoot(
       (flags & VNodeFlags.COMPONENT || flags & VNodeFlags.ELEMENT)
     ) {
       const parentData = componentVNode.data
-      if (parentData != null) {
+      if (parentData != null && inheritAttrs !== false) {
         let extraData: any = null
         for (const key in parentData) {
           // attrs/class/style bindings on parentVNode are merged down to child

+ 4 - 2
packages/core/src/createRenderer.ts

@@ -278,7 +278,8 @@ export function createRenderer(options: RendererOptions) {
       // functional component
       const subTree = (vnode.children = normalizeComponentRoot(
         (tag as FunctionalComponent)(data || EMPTY_OBJ, slots || EMPTY_OBJ),
-        vnode
+        vnode,
+        (tag as FunctionalComponent).inheritAttrs
       ))
       el = vnode.el = mount(subTree, null, parentComponent, isSVG, null)
     }
@@ -562,7 +563,8 @@ export function createRenderer(options: RendererOptions) {
     if (shouldUpdate) {
       const nextTree = (nextVNode.children = normalizeComponentRoot(
         render(nextProps || EMPTY_OBJ, nextSlots || EMPTY_OBJ),
-        nextVNode
+        nextVNode,
+        render.inheritAttrs
       ))
       patch(prevTree, nextTree, container, parentComponent, isSVG)
       nextVNode.el = nextTree.el