File tree Expand file tree Collapse file tree 2 files changed +90
-2
lines changed Expand file tree Collapse file tree 2 files changed +90
-2
lines changed Original file line number Diff line number Diff line change 4
4
effect ,
5
5
ref ,
6
6
WritableComputedRef ,
7
- isReadonly
7
+ isReadonly ,
8
+ setComputedScheduler
8
9
} from '../src'
9
10
10
11
describe ( 'reactivity/computed' , ( ) => {
@@ -198,4 +199,58 @@ describe('reactivity/computed', () => {
198
199
x . effect . stop ( )
199
200
expect ( x . value ) . toBe ( 1 )
200
201
} )
202
+
203
+ describe ( 'with scheduler' , ( ) => {
204
+ const p = Promise . resolve ( )
205
+ const defer = ( fn ?: any ) => ( fn ? p . then ( fn ) : p )
206
+ beforeEach ( ( ) => {
207
+ setComputedScheduler ( defer )
208
+ } )
209
+
210
+ afterEach ( ( ) => {
211
+ setComputedScheduler ( undefined )
212
+ } )
213
+
214
+ test ( 'should only trigger once on multiple mutations' , async ( ) => {
215
+ const src = ref ( 0 )
216
+ const c = computed ( ( ) => src . value )
217
+ const spy = jest . fn ( )
218
+ effect ( ( ) => {
219
+ spy ( c . value )
220
+ } )
221
+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
222
+ src . value = 1
223
+ src . value = 2
224
+ src . value = 3
225
+ // not called yet
226
+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
227
+ await defer ( )
228
+ // should only trigger once
229
+ expect ( spy ) . toHaveBeenCalledTimes ( 2 )
230
+ expect ( spy ) . toHaveBeenCalledWith ( c . value )
231
+ } )
232
+
233
+ test ( 'should not trigger if value did not change' , async ( ) => {
234
+ const src = ref ( 0 )
235
+ const c = computed ( ( ) => src . value % 2 )
236
+ const spy = jest . fn ( )
237
+ effect ( ( ) => {
238
+ spy ( c . value )
239
+ } )
240
+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
241
+ src . value = 1
242
+ src . value = 2
243
+
244
+ await defer ( )
245
+ // should not trigger
246
+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
247
+
248
+ src . value = 3
249
+ src . value = 4
250
+ src . value = 5
251
+ await defer ( )
252
+ // should trigger because latest value changes
253
+ expect ( spy ) . toHaveBeenCalledTimes ( 2 )
254
+ } )
255
+ } )
201
256
} )
Original file line number Diff line number Diff line change @@ -10,7 +10,8 @@ import {
10
10
inject ,
11
11
Ref ,
12
12
watch ,
13
- SetupContext
13
+ SetupContext ,
14
+ computed
14
15
} from '@vue/runtime-test'
15
16
16
17
describe ( 'renderer: component' , ( ) => {
@@ -321,4 +322,36 @@ describe('renderer: component', () => {
321
322
expect ( serializeInner ( root ) ) . toBe ( `` )
322
323
expect ( ids ) . toEqual ( [ ids [ 0 ] , ids [ 0 ] + 1 , ids [ 0 ] + 2 ] )
323
324
} )
325
+
326
+ test ( 'computed that did not change should not trigger re-render' , async ( ) => {
327
+ const src = ref ( 0 )
328
+ const c = computed ( ( ) => src . value % 2 )
329
+ const spy = jest . fn ( )
330
+ const App = {
331
+ render ( ) {
332
+ spy ( )
333
+ return c . value
334
+ }
335
+ }
336
+
337
+ const root = nodeOps . createElement ( 'div' )
338
+ render ( h ( App ) , root )
339
+ expect ( serializeInner ( root ) ) . toBe ( `0` )
340
+ expect ( spy ) . toHaveBeenCalledTimes ( 1 )
341
+
342
+ // verify it updates
343
+ src . value = 1
344
+ src . value = 2
345
+ src . value = 3
346
+ await nextTick ( )
347
+ expect ( serializeInner ( root ) ) . toBe ( `1` )
348
+ expect ( spy ) . toHaveBeenCalledTimes ( 2 ) // should only update once
349
+
350
+ // verify it updates
351
+ src . value = 4
352
+ src . value = 5
353
+ await nextTick ( )
354
+ expect ( serializeInner ( root ) ) . toBe ( `1` )
355
+ expect ( spy ) . toHaveBeenCalledTimes ( 2 ) // should not need to update
356
+ } )
324
357
} )
You can’t perform that action at this time.
0 commit comments