|
|
@@ -36,7 +36,9 @@ function onCompositionEnd(e: Event) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-type ModelDirective<T> = ObjectDirective<T & { _assign: AssignerFn }>
|
|
|
+const assignKey = Symbol('_assign')
|
|
|
+
|
|
|
+type ModelDirective<T> = ObjectDirective<T & { [assignKey]: AssignerFn }>
|
|
|
|
|
|
// We are exporting the v-model runtime directly as vnode hooks so that it can
|
|
|
// be tree-shaken in case v-model is never used.
|
|
|
@@ -44,7 +46,7 @@ export const vModelText: ModelDirective<
|
|
|
HTMLInputElement | HTMLTextAreaElement
|
|
|
> = {
|
|
|
created(el, { modifiers: { lazy, trim, number } }, vnode) {
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
const castToNumber =
|
|
|
number || (vnode.props && vnode.props.type === 'number')
|
|
|
addEventListener(el, lazy ? 'change' : 'input', e => {
|
|
|
@@ -56,7 +58,7 @@ export const vModelText: ModelDirective<
|
|
|
if (castToNumber) {
|
|
|
domValue = looseToNumber(domValue)
|
|
|
}
|
|
|
- el._assign(domValue)
|
|
|
+ el[assignKey](domValue)
|
|
|
})
|
|
|
if (trim) {
|
|
|
addEventListener(el, 'change', () => {
|
|
|
@@ -78,7 +80,7 @@ export const vModelText: ModelDirective<
|
|
|
el.value = value == null ? '' : value
|
|
|
},
|
|
|
beforeUpdate(el, { value, modifiers: { lazy, trim, number } }, vnode) {
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
// avoid clearing unresolved text. #2302
|
|
|
if ((el as any).composing) return
|
|
|
if (document.activeElement === el && el.type !== 'range') {
|
|
|
@@ -106,12 +108,12 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
|
|
|
// #4096 array checkboxes need to be deep traversed
|
|
|
deep: true,
|
|
|
created(el, _, vnode) {
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
addEventListener(el, 'change', () => {
|
|
|
const modelValue = (el as any)._modelValue
|
|
|
const elementValue = getValue(el)
|
|
|
const checked = el.checked
|
|
|
- const assign = el._assign
|
|
|
+ const assign = el[assignKey]
|
|
|
if (isArray(modelValue)) {
|
|
|
const index = looseIndexOf(modelValue, elementValue)
|
|
|
const found = index !== -1
|
|
|
@@ -138,7 +140,7 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
|
|
|
// set initial checked on mount to wait for true-value/false-value
|
|
|
mounted: setChecked,
|
|
|
beforeUpdate(el, binding, vnode) {
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
setChecked(el, binding, vnode)
|
|
|
}
|
|
|
}
|
|
|
@@ -163,13 +165,13 @@ function setChecked(
|
|
|
export const vModelRadio: ModelDirective<HTMLInputElement> = {
|
|
|
created(el, { value }, vnode) {
|
|
|
el.checked = looseEqual(value, vnode.props!.value)
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
addEventListener(el, 'change', () => {
|
|
|
- el._assign(getValue(el))
|
|
|
+ el[assignKey](getValue(el))
|
|
|
})
|
|
|
},
|
|
|
beforeUpdate(el, { value, oldValue }, vnode) {
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
if (value !== oldValue) {
|
|
|
el.checked = looseEqual(value, vnode.props!.value)
|
|
|
}
|
|
|
@@ -187,7 +189,7 @@ export const vModelSelect: ModelDirective<HTMLSelectElement> = {
|
|
|
.map((o: HTMLOptionElement) =>
|
|
|
number ? looseToNumber(getValue(o)) : getValue(o)
|
|
|
)
|
|
|
- el._assign(
|
|
|
+ el[assignKey](
|
|
|
el.multiple
|
|
|
? isSetModel
|
|
|
? new Set(selectedVal)
|
|
|
@@ -195,7 +197,7 @@ export const vModelSelect: ModelDirective<HTMLSelectElement> = {
|
|
|
: selectedVal[0]
|
|
|
)
|
|
|
})
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
},
|
|
|
// set value in mounted & updated because <select> relies on its children
|
|
|
// <option>s.
|
|
|
@@ -203,7 +205,7 @@ export const vModelSelect: ModelDirective<HTMLSelectElement> = {
|
|
|
setSelected(el, value)
|
|
|
},
|
|
|
beforeUpdate(el, _binding, vnode) {
|
|
|
- el._assign = getModelAssigner(vnode)
|
|
|
+ el[assignKey] = getModelAssigner(vnode)
|
|
|
},
|
|
|
updated(el, { value }) {
|
|
|
setSelected(el, value)
|