|
1 | 1 | import Watcher from '../observer/watcher'
|
2 |
| -import { query, resolveAsset, hasOwn } from '../util/index' |
| 2 | +import { extend, query, resolveAsset, hasOwn } from '../util/index' |
3 | 3 | import { createElement, patch, updateListeners } from '../vdom/index'
|
4 | 4 | import { callHook } from './lifecycle'
|
5 | 5 | import { getPropValue } from './state'
|
@@ -40,28 +40,38 @@ function resolveSlots (vm, children) {
|
40 | 40 | }
|
41 | 41 | }
|
42 | 42 |
|
43 |
| -function mergeParentAttrs (vm, data, parentData) { |
| 43 | +function mergeParentData (vm, data, parentData) { |
44 | 44 | const props = vm.$options.props
|
45 | 45 | if (parentData.attrs) {
|
46 |
| - const attrs = data.attrs || (data.attrs = []) |
| 46 | + const attrs = data.attrs || (data.attrs = {}) |
47 | 47 | for (let key in parentData.attrs) {
|
48 | 48 | if (!hasOwn(props, key)) {
|
49 | 49 | attrs[key] = parentData.attrs[key]
|
50 | 50 | }
|
51 | 51 | }
|
52 | 52 | }
|
53 | 53 | if (parentData.props) {
|
54 |
| - |
| 54 | + const props = data.props || (data.props = {}) |
| 55 | + for (let key in parentData.props) { |
| 56 | + if (!hasOwn(props, key)) { |
| 57 | + props[key] = parentData.props[key] |
| 58 | + } |
| 59 | + } |
| 60 | + } |
| 61 | + if (parentData.staticClass) { |
| 62 | + data.staticClass = data.staticClass |
| 63 | + ? data.staticClass + ' ' + parentData.staticClass |
| 64 | + : parentData.staticClass |
| 65 | + } |
| 66 | + if (parentData.class) { |
| 67 | + extend((data.class || (data.class = {})), parentData.class) |
| 68 | + } |
| 69 | + if (parentData.style) { |
| 70 | + extend((data.style || (data.style = {})), parentData.style) |
55 | 71 | }
|
56 |
| -} |
57 |
| - |
58 |
| -function mergeParentDirectives (vm, data, parentData) { |
59 | 72 | if (parentData.directives) {
|
60 | 73 | data.directives = parentData.directives.conact(data.directives || [])
|
61 | 74 | }
|
62 |
| -} |
63 |
| - |
64 |
| -function updateParentCallbacks (vm, data, parentData) { |
65 | 75 | if (parentData.on) {
|
66 | 76 | updateListeners(parentData.on, data.on || {}, (event, handler) => {
|
67 | 77 | vm.$on(event, handler)
|
@@ -140,10 +150,7 @@ export function renderMixin (Vue) {
|
140 | 150 | vnode.key = _renderKey
|
141 | 151 | // update parent data
|
142 | 152 | if (_renderData) {
|
143 |
| - const data = vnode.data |
144 |
| - mergeParentAttrs(this, data, _renderData) |
145 |
| - mergeParentDirectives(this, data, _renderData) |
146 |
| - updateParentCallbacks(this, data, _renderData) |
| 153 | + mergeParentData(this, vnode.data, _renderData) |
147 | 154 | }
|
148 | 155 | return vnode
|
149 | 156 | }
|
|
0 commit comments