国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ReactJS - La fonction de retour de hook personnalisée ne stocke pas les données réelles de l'état interne
P粉729436537
P粉729436537 2023-09-12 08:49:22
0
1
616

J'ai un hook personnalisé useNotifications pour un widget de notification. Ce hook renvoie un tableau contenant l'élément suivant (c'est similaire à l'API de messagerie ant.design)?:

  • add?: Fonction pour ajouter une nouvelle notification
  • remove?: Fonction pour obtenir l'ID de notification et supprimer la notification
  • contextHandler?:?JSX passé au rendu des composants

Lorsque l'utilisateur appelle add, il obtient un identifiant qui peut être utilisé pour supprimer la notification

Cette question concerne spécifiquement la fonction de suppression. Puisque j'appelle cette fonction juste après avoir ajouté une nouvelle notification, la fonction re?oit une copie de l'ancienne liste, donc aucun nouvel élément et une erreur est générée. Comment puis-je résoudre ce problème pour que les composants utilisent la même API??

useNotificationhook Comment puis-je l'utiliser

Codesandbox (pour tester, je l'ai fait setTimeout,它在3秒內(nèi)調(diào)用了remove()) : https://codesandbox.io/s/goofy-smoke-5q7dw3?file=/src/App.js:405-440

P粉729436537
P粉729436537

répondre à tous(1)
P粉478188786

Vous pouvez créer votre remove 函數(shù)使用 狀態(tài)更新器功能,可以訪問最新的狀態(tài)值。這允許您在組件在 remove() 中重新渲染之前訪問新的 list statut.

Remarque?: Vous modifiez actuellement l'état d'origine en modifiant le isMounted 屬性設置為 false de l'objet imbriqué. Même si vous copiez le tableau, vous devez également copier l'objet en cours de mise à jour pour éviter les problèmes de rendu.

Voici quelques modifications sur la fa?on d'accéder à la dernière valeur de l'état et d'éviter les mutations d'état?:

const add = useCallback((params) => {
  const id = v4();
  const element = {...params, id, isMounted: true};
  setList(list => [...list, element]); // Add your new element while also making a copy of the current state (`list`)
  return id;
}, []);

const remove = useCallback((elementId) => {
  setList((list) =>
    list.map((elem) => elem.id === elementId 
      ? { ...elem, isMounted: false } 
      : elem
    )
  );
  setTimeout(() => {
    setList((list) => list.filter((elem) => elem.id !== elementId));
  }, 500);
}, []);

Voir exemple ci-dessous?:

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal