Skip to content

Commit 59b2a0e

Browse files
committed
support class/style in v-bind object
1 parent 351aef3 commit 59b2a0e

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

flow/vnode.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ declare interface VNodeData {
5353
};
5454
directives?: Array<VNodeDirective>;
5555
keepAlive?: boolean;
56+
[key: string]: any;
5657
}
5758

5859
declare type VNodeDirective = {

src/core/instance/render.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,14 @@ export function renderMixin (Vue: Class<Component>) {
165165
}
166166
const data = vnode.data
167167
for (const key in value) {
168-
const hash = asProp || config.mustUseProp(key)
169-
? data.domProps || (data.domProps = {})
170-
: data.attrs || (data.attrs = {})
171-
hash[key] = value[key]
168+
if (key === 'class' || key === 'style') {
169+
data[key] = value[key]
170+
} else {
171+
const hash = asProp || config.mustUseProp(key)
172+
? data.domProps || (data.domProps = {})
173+
: data.attrs || (data.attrs = {})
174+
hash[key] = value[key]
175+
}
172176
}
173177
}
174178
}

test/unit/features/directives/bind.spec.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,32 @@ describe('Directive v-bind', () => {
144144
}).then(done)
145145
})
146146

147+
it('bind object with class/style', done => {
148+
const vm = new Vue({
149+
template: '<input class="a" style="color:red" v-bind="test">',
150+
data: {
151+
test: {
152+
id: 'test',
153+
class: ['b', 'c'],
154+
style: { fontSize: '12px' }
155+
}
156+
}
157+
}).$mount()
158+
expect(vm.$el.id).toBe('test')
159+
expect(vm.$el.className).toBe('a b c')
160+
expect(vm.$el.style.color).toBe('red')
161+
expect(vm.$el.style.fontSize).toBe('12px')
162+
vm.test.id = 'hi'
163+
vm.test.class = ['d']
164+
vm.test.style = { fontSize: '14px' }
165+
waitForUpdate(() => {
166+
expect(vm.$el.id).toBe('hi')
167+
expect(vm.$el.className).toBe('a d')
168+
expect(vm.$el.style.color).toBe('red')
169+
expect(vm.$el.style.fontSize).toBe('14px')
170+
}).then(done)
171+
})
172+
147173
it('bind object as prop', done => {
148174
const vm = new Vue({
149175
template: '<input v-bind.prop="test">',

0 commit comments

Comments
 (0)