vue
Version:
Reactive, component-oriented view layer for modern web interfaces.
65 lines (60 loc) • 1.49 kB
JavaScript
/* @flow */
import config from 'core/config'
import {
warn,
isObject,
toObject,
isReservedAttribute,
camelize,
hyphenate
} from 'core/util/index'
/**
* Runtime helper for merging v-bind="object" into a VNode's data.
*/
export function bindObjectProps (
data: any,
tag: string,
value: any,
asProp: boolean,
isSync?: boolean
): VNodeData {
if (value) {
if (!isObject(value)) {
process.env.NODE_ENV !== 'production' && warn(
'v-bind without argument expects an Object or Array value',
this
)
} else {
if (Array.isArray(value)) {
value = toObject(value)
}
let hash
for (const key in value) {
if (
key === 'class' ||
key === 'style' ||
isReservedAttribute(key)
) {
hash = data
} else {
const type = data.attrs && data.attrs.type
hash = asProp || config.mustUseProp(tag, type, key)
? data.domProps || (data.domProps = {})
: data.attrs || (data.attrs = {})
}
const camelizedKey = camelize(key)
const hyphenatedKey = hyphenate(key)
if (!(camelizedKey in hash) && !(hyphenatedKey in hash)) {
hash[key] = value[key]
if (isSync) {
const on = data.on || (data.on = {})
on[`update:${key}`] = function ($event) {
value[key] = $event
}
}
}
}
}
}
return data
}