reactjs / reactjs/react.dev

"How to read an often-changing value from useCallback?" doesn't seem idiomatic

Ouverte
#2,947 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
JavaScript
Étoiles
11.8k
Forks
7.9k
Merge moyen
1 j 11 h
PR mergées (30 j)
11

Description

Custom hooks that take dependency arrays don't seem idiomatic (maybe I'm wrong). The biggest reason for that is that the React hooks lint doesn't check dependency arrays for anything except the primitive hooks.

In particular, I'd propose changing this:

function useEventCallback(fn, dependencies) {
  const ref = useRef(() => {
    throw new Error('Cannot call an event handler while rendering.');
  });

  useEffect(() => {
    ref.current = fn;
  }, [fn, ...dependencies]);

  return useCallback(() => {
    const fn = ref.current;
    return fn();
  }, [ref]);
}

to

function useEventCallback(fn) {
  const ref = useRef(() => {
    throw new Error('Cannot call an event handler while rendering.');
  });

  useEffect(() => {
    ref.current = fn;
  }, [fn]);

  return useCallback(() => {
    const fn = ref.current;
    return fn();
  }, []);
}

// which should be used as
const callback = useEventCallback(useCallback((event) => {
  /* ... */
}, [/* dependencies */]));

This is slightly more abstract but also less likely to cause footguns. Alternatively, it might just be better to create a new function every render and store it in the ref (no use of dependencies at all).

function useEventCallback(fn) {
  const ref = useRef(() => {
    throw new Error('Cannot call an event handler while rendering.');
  });

  // Note this runs unconditionally
  useEffect(() => {
    ref.current = fn;
  });

  return useCallback(() => {
    const fn = ref.current;
    return fn();
  }, []);
}

// which should be used as
const callback = useEventCallback((event) => {
  /* ... */
});

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

L’issue mentionne useEventCallback et useCallback et présente deux exemples alternatifs de tableaux de dépendances, mais n’identifie ni les fichiers du dépôt ni les tests. Commencez par localiser la documentation ou les exemples couvrant ces hooks, puis déterminez quelle recommandation doit être adoptée et mettez à jour le contenu concerné avec une recommandation convenue.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, react
Domaine
documentation
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.