File tree Expand file tree Collapse file tree 2 files changed +56
-7
lines changed
test/unit/features/directives Expand file tree Collapse file tree 2 files changed +56
-7
lines changed Original file line number Diff line number Diff line change @@ -4,14 +4,18 @@ import { isObject } from 'shared/util'
4
4
5
5
export function genClassForVnode ( vnode : VNode ) : string {
6
6
let data = vnode . data
7
- // Important: check if this is a component container node
8
- // or a child component root node
9
- let i
10
- if ( ( i = vnode . child ) && ( i = i . _vnode . data ) ) {
11
- data = mergeClassData ( i , data )
7
+ let parentNode = vnode
8
+ let childNode = vnode
9
+ while ( childNode . child ) {
10
+ childNode = childNode . child . _vnode
11
+ if ( childNode . data ) {
12
+ data = mergeClassData ( childNode . data , data )
13
+ }
12
14
}
13
- if ( ( i = vnode . parent ) && ( i = i . data ) ) {
14
- data = mergeClassData ( data , i )
15
+ while ( ( parentNode = parentNode . parent ) ) {
16
+ if ( parentNode . data ) {
17
+ data = mergeClassData ( data , parentNode . data )
18
+ }
15
19
}
16
20
return genClassFromData ( data )
17
21
}
Original file line number Diff line number Diff line change @@ -93,6 +93,51 @@ describe('Directive v-bind:class', () => {
93
93
} ) . then ( done )
94
94
} )
95
95
96
+ it ( 'class merge between multiple nested components sharing same element' , done => {
97
+ const vm = new Vue ( {
98
+ template : `
99
+ <component1 :class="componentClass1">
100
+ <component2 :class="componentClass2">
101
+ <component3 :class="componentClass3">
102
+ some text
103
+ </component3>
104
+ </component2>
105
+ </component1>
106
+ ` ,
107
+ data : {
108
+ componentClass1 : 'componentClass1' ,
109
+ componentClass2 : 'componentClass2' ,
110
+ componentClass3 : 'componentClass3'
111
+ } ,
112
+ components : {
113
+ component1 : {
114
+ render ( ) {
115
+ return this . $slots . default [ 0 ]
116
+ }
117
+ } ,
118
+ component2 : {
119
+ render ( ) {
120
+ return this . $slots . default [ 0 ]
121
+ }
122
+ } ,
123
+ component3 : {
124
+ template : '<div class="staticClass"><slot></slot></div>'
125
+ }
126
+ }
127
+ } ) . $mount ( )
128
+ expect ( vm . $el . className ) . toBe ( 'staticClass componentClass3 componentClass2 componentClass1' )
129
+ vm . componentClass1 = 'c1'
130
+ waitForUpdate ( ( ) => {
131
+ expect ( vm . $el . className ) . toBe ( 'staticClass componentClass3 componentClass2 c1' )
132
+ vm . componentClass2 = 'c2'
133
+ } ) . then ( ( ) => {
134
+ expect ( vm . $el . className ) . toBe ( 'staticClass componentClass3 c2 c1' )
135
+ vm . componentClass3 = 'c3'
136
+ } ) . then ( ( ) => {
137
+ expect ( vm . $el . className ) . toBe ( 'staticClass c3 c2 c1' )
138
+ } ) . then ( done )
139
+ } )
140
+
96
141
it ( 'deep update' , done => {
97
142
const vm = new Vue ( {
98
143
template : '<div :class="test"></div>' ,
You can’t perform that action at this time.
0 commit comments