]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-dom): allow force updating value bindings for controlled inputs
authorEvan You <yyx990803@gmail.com>
Tue, 30 Jun 2020 15:23:09 +0000 (11:23 -0400)
committerEvan You <yyx990803@gmail.com>
Tue, 30 Jun 2020 15:23:09 +0000 (11:23 -0400)
fix #1471

packages/runtime-core/src/renderer.ts
packages/runtime-dom/src/directives/vModel.ts
packages/runtime-dom/src/index.ts
packages/runtime-dom/src/patchProp.ts

index 4dfc2ab6630a52d652be43701a044e468410d3ab..4b6785ea5658045ab4e818754a1294c97af3b258 100644 (file)
@@ -96,6 +96,7 @@ export interface RendererOptions<
     parentSuspense?: SuspenseBoundary | null,
     unmountChildren?: UnmountChildrenFn
   ): void
+  forcePatchProp?(el: HostElement, key: string): boolean
   insert(el: HostNode, parent: HostElement, anchor?: HostNode | null): void
   remove(el: HostNode): void
   createElement(
@@ -383,6 +384,7 @@ function baseCreateRenderer(
     insert: hostInsert,
     remove: hostRemove,
     patchProp: hostPatchProp,
+    forcePatchProp: hostForcePatchProp,
     createElement: hostCreateElement,
     createText: hostCreateText,
     createComment: hostCreateComment,
@@ -845,7 +847,10 @@ function baseCreateRenderer(
             const key = propsToUpdate[i]
             const prev = oldProps[key]
             const next = newProps[key]
-            if (prev !== next) {
+            if (
+              next !== prev ||
+              (hostForcePatchProp && hostForcePatchProp(el, key))
+            ) {
               hostPatchProp(
                 el,
                 key,
@@ -969,7 +974,10 @@ function baseCreateRenderer(
         if (isReservedProp(key)) continue
         const next = newProps[key]
         const prev = oldProps[key]
-        if (next !== prev) {
+        if (
+          next !== prev ||
+          (hostForcePatchProp && hostForcePatchProp(el, key))
+        ) {
           hostPatchProp(
             el,
             key,
index 2caab0a78a156bbba4e8d5af78b0a0225d88c368..34008ecc9d8fb0fc57768adb3e50293b622dfef5 100644 (file)
@@ -75,11 +75,8 @@ export const vModelText: ModelDirective<
       addEventListener(el, 'change', onCompositionEnd)
     }
   },
-  beforeUpdate(el, { value, oldValue, modifiers: { trim, number } }, vnode) {
+  beforeUpdate(el, { value, modifiers: { trim, number } }, vnode) {
     el._assign = getModelAssigner(vnode)
-    if (value === oldValue) {
-      return
-    }
     if (document.activeElement === el) {
       if (trim && el.value.trim() === value) {
         return
index 0dbdd846ecbeedc3fbc78899c141471c8b603eca..89a87c3ed8d0860af83316cb740c0570cfb21c25 100644 (file)
@@ -10,7 +10,7 @@ import {
   RootHydrateFunction
 } from '@vue/runtime-core'
 import { nodeOps } from './nodeOps'
-import { patchProp } from './patchProp'
+import { patchProp, forcePatchProp } from './patchProp'
 // Importing from the compiler, will be tree-shaken in prod
 import { isFunction, isString, isHTMLTag, isSVGTag, extend } from '@vue/shared'
 
@@ -21,7 +21,7 @@ declare module '@vue/reactivity' {
   }
 }
 
-const rendererOptions = extend({ patchProp }, nodeOps)
+const rendererOptions = extend({ patchProp, forcePatchProp }, nodeOps)
 
 // lazy create the renderer - this makes core renderer logic tree-shakable
 // in case the user only imports reactivity utilities from Vue.
index 4aa8c010c08d7f702854f8e1f2c2d1d3a2c96b0f..bd30e8aac96b7ed6a1073356eccfa6ca1cc6b8dc 100644 (file)
@@ -8,7 +8,12 @@ import { RendererOptions } from '@vue/runtime-core'
 
 const nativeOnRE = /^on[a-z]/
 
-export const patchProp: RendererOptions<Node, Element>['patchProp'] = (
+type DOMRendererOptions = RendererOptions<Node, Element>
+
+export const forcePatchProp: DOMRendererOptions['forcePatchProp'] = (_, key) =>
+  key === 'value'
+
+export const patchProp: DOMRendererOptions['patchProp'] = (
   el,
   key,
   prevValue,