useCallback inline function styles

Alexander Kim

What's the difference:

1st example:

const onClose = useCallback(onModalClose, []);

2nd example:

const onClose = useCallback(() => onModalClose, []);

onModalClose call as component prop:

<CustomComponent
  onModalClose={() => setDeleteModal(false)}
/>

When using a 2nd example, linter would yell on me, because deps array is empty, onModalClose should be in a deps array, that causing issues with multiple re-renders. Using a 1st example causes no issues with re-renders and doesn't require a deps array.

Drew Reese

Presuming you mean const onClose = useCallback(() => onModalClose(), []); in your second example, the only significant difference is the second is wrapped in an inline function.

useCallback takes a function to memoize, that is its signature. Without knowing anything about the function onModalClose the linter has nothing to complain about in the first example since you're directly memoizing the function as a callback. In the second you are declaring an anonymous function that calls another function. It is this function call the linter sees and suggests adding it to the dependency array.

Depending on where onModalClose is defined you may be able to safely add it to the dependency array (i.e. if it is defined outside the functional component then its reference is stable and won't change between renders), or you can leave the dependency array empty and may need to add // eslint-disable-next-line react-hooks/exhaustive-deps to the line above it so the linter stops "yelling at you".

const onClose = useCallback(onModalClose, []);

or

const onClose = useCallback(
  () => onModalClose(),
  // eslint-disable-next-line react-hooks/exhaustive-deps
  [],
);

Between the two I'd prefer the first as it's perfectly clear you're memoizing the function callback and requires less text (i.e. no need to provide an eslint override.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    pump.io port in URL

  3. 3

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  4. 4

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  5. 5

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  8. 8

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

  9. 9

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  10. 10

    How to remove the extra space from right in a webview?

  11. 11

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  12. 12

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  13. 13

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

  14. 14

    java.lang.NullPointerException: Cannot read the array length because "<local3>" is null

  15. 15

    How to use merge windows unallocated space into Ubuntu using GParted?

  16. 16

    flutter: dropdown item programmatically unselect problem

  17. 17

    Pandas - check if dataframe has negative value in any column

  18. 18

    Nuget add packages gives access denied errors

  19. 19

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  20. 20

    Generate random UUIDv4 with Elm

  21. 21

    Client secret not provided in request error with Keycloak

HotTag

Archive