@@ -15,10 +15,11 @@ describe('Directive v-once', () => {
1515
1616 it ( 'should not rerender self and child component' , done => {
1717 const vm = new Vue ( {
18- template : `<div v-once>
19- <span>{{ a }}</span>
20- <item :b="a"></item>
21- </div>` ,
18+ template : `
19+ <div v-once>
20+ <span>{{ a }}</span>
21+ <item :b="a"></item>
22+ </div>` ,
2223 data : { a : 'hello' } ,
2324 components : {
2425 item : {
@@ -39,10 +40,11 @@ describe('Directive v-once', () => {
3940
4041 it ( 'should rerender parent but not self' , done => {
4142 const vm = new Vue ( {
42- template : `<div>
43- <span>{{ a }}</span>
44- <item v-once :b="a"></item>
45- </div>` ,
43+ template : `
44+ <div>
45+ <span>{{ a }}</span>
46+ <item v-once :b="a"></item>
47+ </div>` ,
4648 data : { a : 'hello' } ,
4749 components : {
4850 item : {
@@ -63,11 +65,12 @@ describe('Directive v-once', () => {
6365
6466 it ( 'should not rerender static sub nodes' , done => {
6567 const vm = new Vue ( {
66- template : `<div>
67- <span v-once>{{ a }}</span>
68- <item :b="a"></item>
69- <span>{{ suffix }}</span>
70- </div>` ,
68+ template : `
69+ <div>
70+ <span v-once>{{ a }}</span>
71+ <item :b="a"></item>
72+ <span>{{ suffix }}</span>
73+ </div>` ,
7174 data : {
7275 a : 'hello' ,
7376 suffix : '?'
@@ -92,6 +95,39 @@ describe('Directive v-once', () => {
9295 } ) . then ( done )
9396 } )
9497
98+ it ( 'should work with v-if' , done => {
99+ const vm = new Vue ( {
100+ data : {
101+ tester : true ,
102+ yes : 'y' ,
103+ no : 'n'
104+ } ,
105+ template : `
106+ <div>
107+ <div v-if="tester">{{ yes }}</div>
108+ <div v-else>{{ no }}</div>
109+ <div v-if="tester" v-once>{{ yes }}</div>
110+ <div v-else>{{ no }}</div>
111+ <div v-if="tester">{{ yes }}</div>
112+ <div v-else v-once>{{ no }}</div>
113+ <div v-if="tester" v-once>{{ yes }}</div>
114+ <div v-else v-once>{{ no }}</div>
115+ </div>
116+ `
117+ } ) . $mount ( )
118+ expectTextContent ( vm , 'yyyy' )
119+ vm . yes = 'yes'
120+ waitForUpdate ( ( ) => {
121+ expectTextContent ( vm , 'yesyyesy' )
122+ vm . tester = false
123+ } ) . then ( ( ) => {
124+ expectTextContent ( vm , 'nnnn' )
125+ vm . no = 'no'
126+ } ) . then ( ( ) => {
127+ expectTextContent ( vm , 'nononn' )
128+ } ) . then ( done )
129+ } )
130+
95131 it ( 'should work with v-for' , done => {
96132 const vm = new Vue ( {
97133 data : {
@@ -140,6 +176,43 @@ describe('Directive v-once', () => {
140176 } ) . then ( done )
141177 } )
142178
179+ it ( 'should work inside v-for with v-if' , done => {
180+ const vm = new Vue ( {
181+ data : {
182+ list : [
183+ { id : 0 , text : 'a' , tester : true , truthy : 'y' }
184+ ]
185+ } ,
186+ template : `
187+ <div>
188+ <div v-for="i in list" :key="i.id">
189+ <span v-if="i.tester" v-once>{{ i.truthy }}</span>
190+ <span v-else v-once>{{ i.text }}</span>
191+ <span v-if="i.tester" v-once>{{ i.truthy }}</span>
192+ <span v-else>{{ i.text }}</span>
193+ <span v-if="i.tester">{{ i.truthy }}</span>
194+ <span v-else v-once>{{ i.text }}</span>
195+ <span v-if="i.tester">{{ i.truthy }}</span>
196+ <span v-else>{{ i.text }}</span>
197+ </div>
198+ </div>
199+ `
200+ } ) . $mount ( )
201+
202+ expectTextContent ( vm , 'yyyy' )
203+
204+ vm . list [ 0 ] . truthy = 'yy'
205+ waitForUpdate ( ( ) => {
206+ expectTextContent ( vm , 'yyyyyy' )
207+ vm . list [ 0 ] . tester = false
208+ } ) . then ( ( ) => {
209+ expectTextContent ( vm , 'aaaa' )
210+ vm . list [ 0 ] . text = 'nn'
211+ } ) . then ( ( ) => {
212+ expectTextContent ( vm , 'annann' )
213+ } ) . then ( done )
214+ } )
215+
143216 it ( 'should warn inside non-keyed v-for' , ( ) => {
144217 const vm = new Vue ( {
145218 data : {
@@ -162,3 +235,7 @@ describe('Directive v-once', () => {
162235 expect ( `v-once can only be used inside v-for that is keyed.` ) . toHaveBeenWarned ( )
163236 } )
164237} )
238+
239+ function expectTextContent ( vm , text ) {
240+ expect ( vm . $el . textContent . replace ( / \r ? \n | \r | \s / g, '' ) ) . toBe ( text )
241+ }
0 commit comments