You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/docs/hooks-faq.md
+16-16
Original file line number
Diff line number
Diff line change
@@ -356,13 +356,13 @@ function Counter() {
356
356
const calculation = count * 100;
357
357
const prevCalculation = usePrevious(calculation);
358
358
// ...
359
-
```
359
+
```
360
360
361
361
It's possible that in the future React will provide a `usePrevious` Hook out of the box since it's a relatively common use case.
362
362
363
363
See also [the recommended pattern for derived state](#how-do-i-implement-getderivedstatefromprops).
364
364
365
-
### How do I implement `getDerivedStateFromProps`?
365
+
### How do I implement `getDerivedStateFromProps`? {#how-do-i-implement-getderivedstatefromprops}
366
366
367
367
While you probably [don't need it](/blog/2018/06/07/you-probably-dont-need-derived-state.html), in rare cases that you do (such as implementing a `<Transition>` component), you can update the state right during rendering. React will re-run the component with updated state immediately after exiting the first render so it wouldn't be expensive.
368
368
@@ -385,7 +385,7 @@ function ScrollView({row}) {
385
385
386
386
This might look strange at first, but an update during rendering is exactly what `getDerivedStateFromProps` has always been like conceptually.
387
387
388
-
### Is there something like forceUpdate?
388
+
### Is there something like forceUpdate? {#is-there-something-like-forceupdate}
389
389
390
390
Both `useState` and `useReducer` Hooks [bail out of updates](/docs/hooks-reference.html#bailing-out-of-a-state-update) if the next value is the same as the previous one. Mutating state in place and calling `setState` will not cause a re-render.
391
391
@@ -401,22 +401,22 @@ Normally, you shouldn't mutate local state in React. However, as an escape hatch
401
401
402
402
Try to avoid this pattern if possible.
403
403
404
-
### Can I make a ref to a function component?
404
+
### Can I make a ref to a function component? {#can-i-make-a-ref-to-a-function-component}
405
405
406
406
While you shouldn't need this often, you may expose some imperative methods to a parent component with the [`useImperativeHandle`](/docs/hooks-reference.html#useimperativehandle) Hook.
407
407
408
-
### What does `const [thing, setThing] = useState()` mean?
408
+
### What does `const [thing, setThing] = useState()` mean? {#what-does-const-thing-setthing--usestate-mean}
409
409
410
410
If you're not familiar with this syntax, check out the [explanation](/docs/hooks-state.html#tip-what-do-square-brackets-mean) in the State Hook documentation.
### Can I skip an effect on updates? {#can-i-skip-an-effect-on-updates}
416
416
417
417
Yes. See [conditionally firing an effect](/docs/hooks-reference.html#conditionally-firing-an-effect). Note that forgetting to handle updates often [introduces bugs](/docs/hooks-effect.html#explanation-why-effects-run-on-each-update), which is why this isn't the default behavior.
418
418
419
-
### How do I implement `shouldComponentUpdate`?
419
+
### How do I implement `shouldComponentUpdate`? {#how-do-i-implement-shouldcomponentupdate}
420
420
421
421
You can wrap a function component with `React.memo` to shallowly compare its props:
422
422
@@ -431,7 +431,7 @@ It's not a Hook because it doesn't compose like Hooks do. `React.memo` is equiva
431
431
`React.memo` doesn't compare state because there is no single state object to compare. But you can make children pure too, or even [optimize individual children with `useMemo`](/docs/hooks-faq.html#how-to-memoize-calculations).
432
432
433
433
434
-
### How to memoize calculations?
434
+
### How to memoize calculations? {#how-to-memoize-calculations}
435
435
436
436
The [`useMemo`](/docs/hooks-reference.html#usememo) Hook lets you cache calculations between multiple renders by "remembering" the previous computation:
437
437
@@ -464,7 +464,7 @@ function Parent({ a, b }) {
464
464
465
465
Note that this approach won't work in a loop because Hook calls [can't](/docs/hooks-rules.html) be placed inside loops. But you can extract a separate component for the list item, and call `useMemo` there.
466
466
467
-
### How to create expensive objects lazily?
467
+
### How to create expensive objects lazily? {#how-to-create-expensive-objects-lazily}
468
468
469
469
`useMemo` lets you [memoize an expensive calculation](#how-to-memoize-calculations) if the inputs are the same. However, it only serves as a hint, and doesn't *guarantee* the computation won't re-run. But sometimes need to be sure an object is only created once.
470
470
@@ -525,7 +525,7 @@ function Image(props) {
525
525
This avoids creating an expensive object until it's truly needed for the first time. If you use Flow or TypeScript, you can also give `getObserver()` a non-nullable type for convenience.
526
526
527
527
528
-
### Are Hooks slow because of creating functions in render?
528
+
### Are Hooks slow because of creating functions in render? {#are-hooks-slow-because-of-creating-functions-in-render}
529
529
530
530
No. In modern browsers, the raw performance of closures compared to classes doesn't differ significantly except in extreme scenarios.
531
531
@@ -550,7 +550,7 @@ Traditionally, performance concerns around inline functions in React have been r
550
550
551
551
* Finally, the `useReducer` Hook reduces the need to pass callbacks deeply, as explained below.
552
552
553
-
### How to avoid passing callbacks down?
553
+
### How to avoid passing callbacks down? {#how-to-avoid-passing-callbacks-down}
554
554
555
555
We've found that most people don't enjoy manually passing callbacks through every level of a component tree. Even though it is more explicit, it can feel like a lot of "plumbing".
556
556
@@ -592,7 +592,7 @@ This is both more convenient from the maintenance perspective (no need to keep f
592
592
593
593
Note that you can still choose whether to pass the application *state* down as props (more explicit) or as context (more convenient for very deep updates). If you use context to pass down the state too, use two different context types -- the `dispatch` context never changes, so components that read it don't need to rerender unless they also need the application state.
594
594
595
-
### How to read an often-changing value from `useCallback`?
595
+
### How to read an often-changing value from `useCallback`? {#how-to-read-an-often-changing-value-from-usecallback}
596
596
597
597
>Note
598
598
>
@@ -662,15 +662,15 @@ function useEventCallback(fn, dependencies) {
662
662
In either case, we **don't recommend this pattern** and only show it here for completeness. Instead, it is preferable to [avoid passing callbacks deep down](#how-to-avoid-passing-callbacks-down).
663
663
664
664
665
-
## Under the Hood
665
+
## Under the Hood {#under-the-hood}
666
666
667
-
### How does React associate Hook calls with components?
667
+
### How does React associate Hook calls with components? {#how-does-react-associate-hook-calls-with-components}
668
668
669
669
React keeps track of the currently rendering component. Thanks to the [Rules of Hooks](/docs/hooks-rules.html), we know that Hooks are only called from React components (or custom Hooks -- which are also only called from React components).
670
670
671
671
There is an internal list of "memory cells" associated with each component. They're just JavaScript objects where we can put some data. When you call a Hook like `useState()`, it reads the current cell (or initializes it during the first render), and then moves the pointer to the next one. This is how multiple `useState()` calls each get independent local state.
672
672
673
-
### What is the prior art for Hooks?
673
+
### What is the prior art for Hooks? {#what-is-the-prior-art-for-hooks}
674
674
675
675
Hooks synthesize ideas from several different sources:
0 commit comments