feat: inheritAttrs

This commit is contained in:
Evan You 2018-09-23 23:28:21 -04:00
parent ddd55fae54
commit b5db956f9a
4 changed files with 14 additions and 5 deletions

View File

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

View File

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

View File

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

View File

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