feat: support v-bind .prop & .attr modifiers
Also allows render function usage like the following:
```js
h({
'.prop': 1, // force set as property
'^attr': 'foo' // force set as attribute
})
```
This commit is contained in:
@@ -24,43 +24,42 @@ export const patchProp: DOMRendererOptions['patchProp'] = (
|
||||
parentSuspense,
|
||||
unmountChildren
|
||||
) => {
|
||||
switch (key) {
|
||||
// special
|
||||
case 'class':
|
||||
patchClass(el, nextValue, isSVG)
|
||||
break
|
||||
case 'style':
|
||||
patchStyle(el, prevValue, nextValue)
|
||||
break
|
||||
default:
|
||||
if (isOn(key)) {
|
||||
// ignore v-model listeners
|
||||
if (!isModelListener(key)) {
|
||||
patchEvent(el, key, prevValue, nextValue, parentComponent)
|
||||
}
|
||||
} else if (shouldSetAsProp(el, key, nextValue, isSVG)) {
|
||||
patchDOMProp(
|
||||
el,
|
||||
key,
|
||||
nextValue,
|
||||
prevChildren,
|
||||
parentComponent,
|
||||
parentSuspense,
|
||||
unmountChildren
|
||||
)
|
||||
} else {
|
||||
// special case for <input v-model type="checkbox"> with
|
||||
// :true-value & :false-value
|
||||
// store value as dom properties since non-string values will be
|
||||
// stringified.
|
||||
if (key === 'true-value') {
|
||||
;(el as any)._trueValue = nextValue
|
||||
} else if (key === 'false-value') {
|
||||
;(el as any)._falseValue = nextValue
|
||||
}
|
||||
patchAttr(el, key, nextValue, isSVG, parentComponent)
|
||||
}
|
||||
break
|
||||
if (key === 'class') {
|
||||
patchClass(el, nextValue, isSVG)
|
||||
} else if (key === 'style') {
|
||||
patchStyle(el, prevValue, nextValue)
|
||||
} else if (isOn(key)) {
|
||||
// ignore v-model listeners
|
||||
if (!isModelListener(key)) {
|
||||
patchEvent(el, key, prevValue, nextValue, parentComponent)
|
||||
}
|
||||
} else if (
|
||||
key[0] === '.'
|
||||
? ((key = key.slice(1)), true)
|
||||
: key[0] === '^'
|
||||
? ((key = key.slice(1)), false)
|
||||
: shouldSetAsProp(el, key, nextValue, isSVG)
|
||||
) {
|
||||
patchDOMProp(
|
||||
el,
|
||||
key,
|
||||
nextValue,
|
||||
prevChildren,
|
||||
parentComponent,
|
||||
parentSuspense,
|
||||
unmountChildren
|
||||
)
|
||||
} else {
|
||||
// special case for <input v-model type="checkbox"> with
|
||||
// :true-value & :false-value
|
||||
// store value as dom properties since non-string values will be
|
||||
// stringified.
|
||||
if (key === 'true-value') {
|
||||
;(el as any)._trueValue = nextValue
|
||||
} else if (key === 'false-value') {
|
||||
;(el as any)._falseValue = nextValue
|
||||
}
|
||||
patchAttr(el, key, nextValue, isSVG, parentComponent)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user