File tree Expand file tree Collapse file tree 4 files changed +56
-30
lines changed Expand file tree Collapse file tree 4 files changed +56
-30
lines changed Original file line number Diff line number Diff line change 5
5
markReactive ,
6
6
reactive ,
7
7
ref ,
8
+ customRef ,
8
9
Ref ,
9
10
set ,
10
11
shallowReactive ,
Original file line number Diff line number Diff line change 9
9
} from './reactive'
10
10
export {
11
11
ref ,
12
+ customRef ,
12
13
isRef ,
13
14
Ref ,
14
15
createRef ,
Original file line number Diff line number Diff line change @@ -128,6 +128,26 @@ export function toRefs<T extends Data = Data>(obj: T): ToRefs<T> {
128
128
return ret
129
129
}
130
130
131
+ export type CustomRefFactory < T > = (
132
+ track : ( ) => void ,
133
+ trigger : ( ) => void
134
+ ) => {
135
+ get : ( ) => T
136
+ set : ( value : T ) => void
137
+ }
138
+
139
+ export function customRef < T > ( factory : CustomRefFactory < T > ) : Ref < T > {
140
+ const version = ref ( 0 )
141
+ return createRef (
142
+ factory (
143
+ ( ) => void version . value ,
144
+ ( ) => {
145
+ ++ version . value
146
+ }
147
+ )
148
+ )
149
+ }
150
+
131
151
export function toRef < T extends object , K extends keyof T > (
132
152
object : T ,
133
153
key : K
Original file line number Diff line number Diff line change 1
1
import {
2
2
ref ,
3
+ customRef ,
3
4
reactive ,
4
5
isRef ,
5
6
toRef ,
@@ -308,34 +309,37 @@ describe('reactivity/ref', () => {
308
309
expect ( dummyY ) . toBe ( 5 )
309
310
} )
310
311
311
- // test('customRef', () => {
312
- // let value = 1;
313
- // let _trigger: () => void;
314
-
315
- // const custom = customRef((track, trigger) => ({
316
- // get() {
317
- // track();
318
- // return value;
319
- // },
320
- // set(newValue: number) {
321
- // value = newValue;
322
- // _trigger = trigger;
323
- // },
324
- // }));
325
-
326
- // expect(isRef(custom)).toBe(true);
327
-
328
- // let dummy;
329
- // watchEffect(() => {
330
- // dummy = custom.value;
331
- // }, {flush: 'sync'});
332
- // expect(dummy).toBe(1);
333
-
334
- // custom.value = 2;
335
- // // should not trigger yet
336
- // expect(dummy).toBe(1);
337
-
338
- // _trigger!();
339
- // expect(dummy).toBe(2);
340
- // });
312
+ test ( 'customRef' , ( ) => {
313
+ let value = 1
314
+ let _trigger : ( ) => void
315
+
316
+ const custom = customRef ( ( track , trigger ) => ( {
317
+ get ( ) {
318
+ track ( )
319
+ return value
320
+ } ,
321
+ set ( newValue : number ) {
322
+ value = newValue
323
+ _trigger = trigger
324
+ } ,
325
+ } ) )
326
+
327
+ expect ( isRef ( custom ) ) . toBe ( true )
328
+
329
+ let dummy
330
+ watchEffect (
331
+ ( ) => {
332
+ dummy = custom . value
333
+ } ,
334
+ { flush : 'sync' }
335
+ )
336
+ expect ( dummy ) . toBe ( 1 )
337
+
338
+ custom . value = 2
339
+ // should not trigger yet
340
+ expect ( dummy ) . toBe ( 1 )
341
+
342
+ _trigger ! ( )
343
+ expect ( dummy ) . toBe ( 2 )
344
+ } )
341
345
} )
You can’t perform that action at this time.
0 commit comments