Sfoglia il codice sorgente

fix(v-bind): respect .prop modifier on components (#6159)

AchillesJ 9 anni fa
parent
commit
06b9b0bbad

+ 2 - 2
src/compiler/parser/index.js

@@ -483,8 +483,8 @@ function processAttrs (el) {
             )
           }
         }
-        if (!el.component && (
-          isProp || platformMustUseProp(el.tag, el.attrsMap.type, name)
+        if (isProp || (
+          !el.component && platformMustUseProp(el.tag, el.attrsMap.type, name)
         )) {
           addProp(el, name, value)
         } else {

+ 19 - 0
test/unit/features/component/component.spec.js

@@ -187,6 +187,25 @@ describe('Component', () => {
     }).then(done)
   })
 
+  it('dynamic elements with domProps', done => {
+    const vm = new Vue({
+      template: '<component :is="view" :value.prop="val"></component>',
+      data: {
+        view: 'input',
+        val: 'hello'
+      }
+    }).$mount()
+    expect(vm.$el.tagName).toBe('INPUT')
+    expect(vm.$el.value).toBe('hello')
+    vm.view = 'textarea'
+    vm.val += ' world'
+    waitForUpdate(() => {
+      expect(vm.$el.tagName).toBe('TEXTAREA')
+      expect(vm.$el.value).toBe('hello world')
+      vm.view = ''
+    }).then(done)
+  })
+
   it('should compile parent template directives & content in parent scope', done => {
     const vm = new Vue({
       data: {

+ 8 - 0
test/unit/modules/compiler/parser.spec.js

@@ -463,6 +463,14 @@ describe('parser', () => {
     expect(ast.props).toBeUndefined()
   })
 
+  it('use prop when prop modifier was explicitly declared', () => {
+    const ast = parse('<component is="textarea" :value.prop="val" />', baseOptions)
+    expect(ast.attrs).toBeUndefined()
+    expect(ast.props.length).toBe(1)
+    expect(ast.props[0].name).toBe('value')
+    expect(ast.props[0].value).toBe('val')
+  })
+
   it('pre/post transforms', () => {
     const options = extend({}, baseOptions)
     const spy1 = jasmine.createSpy('preTransform')