diff --git a/src/runtime/instance/render.js b/src/runtime/instance/render.js index 80b17bc1..c4a5efad 100644 --- a/src/runtime/instance/render.js +++ b/src/runtime/instance/render.js @@ -40,8 +40,8 @@ function resolveSlots (vm, children) { } function mergeParentAttrs (vm, data, parentData) { + const props = vm.$options.props if (parentData.attrs) { - const props = vm.$options.props const attrs = data.attrs || (data.attrs = []) for (let key in parentData.attrs) { if (!hasOwn(props, key)) { @@ -49,6 +49,9 @@ function mergeParentAttrs (vm, data, parentData) { } } } + if (parentData.props) { + + } } function mergeParentDirectives (vm, data, parentData) { @@ -65,6 +68,30 @@ function updateParentCallbacks (vm, data, parentData) { } } +function updateProps (vm, data) { + const attrs = data.attrs + const props = data.props + if (attrs || props) { + for (let key in vm.$options.props) { + let altKey = hyphenate(key) + let newVal = + getPropValue(attrs, key, altKey) || + getPropValue(props, key, altKey) + if (vm[key] !== newVal) { + vm[key] = newVal + } + } + } +} + +function getPropValue (hash, key, altKey) { + return hash + ? hasOwn(hash, key) + ? hash[key] + : hash[altKey] + : undefined +} + export function renderMixin (Vue) { // shorthands used in render functions Vue.prototype.__h__ = createElement @@ -92,16 +119,8 @@ export function renderMixin (Vue) { return } // set props - this will trigger update if any of them changed - const attrs = data && data.attrs - if (attrs) { - for (let key in this.$options.props) { - let newVal = hasOwn(attrs, key) - ? attrs[key] - : attrs[hyphenate(key)] - if (this[key] !== newVal) { - this[key] = newVal - } - } + if (data) { + updateProps(this, data) } }