@@ -109,39 +109,41 @@ def dispatch(
109
109
@overload
110
110
def use_effect (
111
111
function : None = None ,
112
- args : Sequence [Any ] | ellipsis | None = ...,
112
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
113
113
) -> Callable [[_EffectApplyFunc ], None ]:
114
114
...
115
115
116
116
117
117
@overload
118
118
def use_effect (
119
119
function : _EffectApplyFunc ,
120
- args : Sequence [Any ] | ellipsis | None = ...,
120
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
121
121
) -> None :
122
122
...
123
123
124
124
125
125
def use_effect (
126
126
function : Optional [_EffectApplyFunc ] = None ,
127
- args : Sequence [Any ] | ellipsis | None = ...,
127
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
128
128
) -> Optional [Callable [[_EffectApplyFunc ], None ]]:
129
129
"""See the full :ref:`Use Effect` docs for details
130
130
131
131
Parameters:
132
132
function:
133
133
Applies the effect and can return a clean-up function
134
- args:
135
- Dependencies for the effect. If provided the effect will only trigger when
136
- these args change.
134
+ dependencies:
135
+ Dependencies for the effect. The effect will only trigger if the identity
136
+ of any value in the given sequence changes (i.e. their :func:`id` is
137
+ different). By default these are inferred based on local variables that are
138
+ referenced by the given function.
137
139
138
140
Returns:
139
141
If not function is provided, a decorator. Otherwise ``None``.
140
142
"""
141
143
hook = current_hook ()
142
144
143
- args = _try_to_infer_closure_args (function , args )
144
- memoize = use_memo (args = args )
145
+ dependencies = _try_to_infer_closure_values (function , dependencies )
146
+ memoize = use_memo (dependencies = dependencies )
145
147
last_clean_callback : Ref [Optional [_EffectCleanFunc ]] = use_ref (None )
146
148
147
149
def add_effect (function : _EffectApplyFunc ) -> None :
@@ -221,34 +223,39 @@ def dispatch(action: _ActionType) -> None:
221
223
@overload
222
224
def use_callback (
223
225
function : None = None ,
224
- args : Sequence [Any ] | ellipsis | None = ...,
226
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
225
227
) -> Callable [[_CallbackFunc ], _CallbackFunc ]:
226
228
...
227
229
228
230
229
231
@overload
230
232
def use_callback (
231
233
function : _CallbackFunc ,
232
- args : Sequence [Any ] | ellipsis | None = ...,
234
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
233
235
) -> _CallbackFunc :
234
236
...
235
237
236
238
237
239
def use_callback (
238
240
function : Optional [_CallbackFunc ] = None ,
239
- args : Sequence [Any ] | ellipsis | None = ...,
241
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
240
242
) -> Union [_CallbackFunc , Callable [[_CallbackFunc ], _CallbackFunc ]]:
241
243
"""See the full :ref:`Use Callback` docs for details
242
244
243
245
Parameters:
244
- function: the function whose identity will be preserved
245
- args: The identity the ``function`` will be udpated when these ``args`` change.
246
+ function:
247
+ The function whose identity will be preserved
248
+ dependencies:
249
+ Dependencies of the callback. The identity the ``function`` will be udpated
250
+ if the identity of any value in the given sequence changes (i.e. their
251
+ :func:`id` is different). By default these are inferred based on local
252
+ variables that are referenced by the given function.
246
253
247
254
Returns:
248
255
The current function
249
256
"""
250
- args = _try_to_infer_closure_args (function , args )
251
- memoize = use_memo (args = args )
257
+ dependencies = _try_to_infer_closure_values (function , dependencies )
258
+ memoize = use_memo (dependencies = dependencies )
252
259
253
260
def setup (function : _CallbackFunc ) -> _CallbackFunc :
254
261
return memoize (lambda : function )
@@ -269,49 +276,54 @@ def __call__(self, func: Callable[[], _StateType]) -> _StateType:
269
276
@overload
270
277
def use_memo (
271
278
function : None = None ,
272
- args : Sequence [Any ] | ellipsis | None = ...,
279
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
273
280
) -> _LambdaCaller :
274
281
...
275
282
276
283
277
284
@overload
278
285
def use_memo (
279
286
function : Callable [[], _StateType ],
280
- args : Sequence [Any ] | ellipsis | None = ...,
287
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
281
288
) -> _StateType :
282
289
...
283
290
284
291
285
292
def use_memo (
286
293
function : Optional [Callable [[], _StateType ]] = None ,
287
- args : Sequence [Any ] | ellipsis | None = ...,
294
+ dependencies : Sequence [Any ] | ellipsis | None = ...,
288
295
) -> Union [_StateType , Callable [[Callable [[], _StateType ]], _StateType ]]:
289
296
"""See the full :ref:`Use Memo` docs for details
290
297
291
298
Parameters:
292
- function: The function to be memoized.
293
- args: The ``function`` will be recomputed when these args change.
299
+ function:
300
+ The function to be memoized.
301
+ dependencies:
302
+ Dependencies for the memoized function. The memo will only be recomputed if
303
+ the identity of any value in the given sequence changes (i.e. their
304
+ :func:`id` is different). By default these are inferred based on local
305
+ variables that are referenced by the given function.
294
306
295
307
Returns:
296
308
The current state
297
309
"""
298
- args = _try_to_infer_closure_args (function , args )
310
+ dependencies = _try_to_infer_closure_values (function , dependencies )
299
311
300
312
memo : _Memo [_StateType ] = _use_const (_Memo )
301
313
302
314
if memo .empty ():
303
315
# we need to initialize on the first run
304
316
changed = True
305
- memo .args = () if args is None else args
306
- elif args is None :
317
+ memo .deps = () if dependencies is None else dependencies
318
+ elif dependencies is None :
307
319
changed = True
308
- memo .args = ()
320
+ memo .deps = ()
309
321
elif (
310
- len (memo .args ) != len (args )
311
- # if args are same length check identity for each item
312
- or any (current is not new for current , new in zip (memo .args , args ))
322
+ len (memo .deps ) != len (dependencies )
323
+ # if deps are same length check identity for each item
324
+ or any (current is not new for current , new in zip (memo .deps , dependencies ))
313
325
):
314
- memo .args = args
326
+ memo .deps = dependencies
315
327
changed = True
316
328
else :
317
329
changed = False
@@ -338,10 +350,10 @@ def setup(function: Callable[[], _StateType]) -> _StateType:
338
350
class _Memo (Generic [_StateType ]):
339
351
"""Simple object for storing memoization data"""
340
352
341
- __slots__ = "value" , "args "
353
+ __slots__ = "value" , "deps "
342
354
343
355
value : _StateType
344
- args : Sequence [Any ]
356
+ deps : Sequence [Any ]
345
357
346
358
def empty (self ) -> bool :
347
359
try :
@@ -368,11 +380,11 @@ def _use_const(function: Callable[[], _StateType]) -> _StateType:
368
380
return current_hook ().use_state (function )
369
381
370
382
371
- def _try_to_infer_closure_args (
383
+ def _try_to_infer_closure_values (
372
384
func : Callable [..., Any ] | None ,
373
- args : Sequence [Any ] | ellipsis | None ,
385
+ values : Sequence [Any ] | ellipsis | None ,
374
386
) -> Sequence [Any ] | None :
375
- if args is ...:
387
+ if values is ...:
376
388
if isinstance (func , FunctionType ):
377
389
return (
378
390
[cell .cell_contents for cell in func .__closure__ ]
@@ -382,7 +394,7 @@ def _try_to_infer_closure_args(
382
394
else :
383
395
return None
384
396
else :
385
- return cast ("Sequence[Any] | None" , args )
397
+ return cast ("Sequence[Any] | None" , values )
386
398
387
399
388
400
_current_life_cycle_hook : Dict [int , "LifeCycleHook" ] = {}
0 commit comments