Просмотр исходного кода

fix: v-bind object should be overridable by single bindings (#9653)

fix #9641
GU Yiling 7 лет назад
Родитель
Сommit
0b57380f10

+ 5 - 3
src/core/instance/render-helpers/bind-object-props.js

@@ -7,7 +7,8 @@ import {
   isObject,
   toObject,
   isReservedAttribute,
-  camelize
+  camelize,
+  hyphenate
 } from 'core/util/index'
 
 /**
@@ -45,12 +46,13 @@ export function bindObjectProps (
             : data.attrs || (data.attrs = {})
         }
         const camelizedKey = camelize(key)
-        if (!(key in hash) && !(camelizedKey in hash)) {
+        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:${camelizedKey}`] = function ($event) {
+            on[`update:${key}`] = function ($event) {
               value[key] = $event
             }
           }

+ 2 - 3
test/unit/features/directives/bind.spec.js

@@ -234,7 +234,7 @@ describe('Directive v-bind', () => {
       template: `<test v-bind="test" data-foo="foo" dataBar="bar"/>`,
       components: {
         test: {
-          template: '<div :data-foo="dataFoo" :data-bar="dataBar"></div>',
+          template: '<div>{{ dataFoo }} {{ dataBar }}</div>',
           props: ['dataFoo', 'dataBar']
         }
       },
@@ -245,8 +245,7 @@ describe('Directive v-bind', () => {
         }
       }
     }).$mount()
-    expect(vm.$el.getAttribute('data-foo')).toBe('foo')
-    expect(vm.$el.getAttribute('data-bar')).toBe('bar')
+    expect(vm.$el.textContent).toBe('foo bar')
   })
 
   it('.sync modifier with bind object', done => {