0
votes

Crochet de réaction pour l'état de re-rendu mis à jour par une fonction récursive asynchrone

Je construis une application réagissante qui résout un tableau de Sudoku et visuette l'algorithme de résolution.

J'essaie de convertir les composants de la classe en composants fonctionnels, mais je ne suis pas sûr de savoir comment faire fonctionner les changements d'état. < / p>

Le code problématique est: xxx

( Code complet ici et le App est hébergé ici )

ici j'ai besoin async afin que je puisse utiliser veille () pour visualiser l'algorithme. J'utilise this.setstate ({tableau: carte}); pour déclencher un re-rendu à chaque fois que la carte est mutée.


Lorsque vous essayez de convertir en un composant fonctionnel J'ai essayé:

  • usestate Crochet, j'ai utilisé const [carte, interrupteur] = USESTE (Initialboard); et remplacé le this.setstate appels avec Code> Setboot (tableau) . Cela n'a pas fonctionné car le crochet est en train d'être appelé dans une boucle
  • Emballage usestate avec useEffect (i.e. useEffect (((() => Setboot (tableau]) réact de crochet "useeffect" peut être exécutée plus d'une fois ...
  • a également regardé useEducer mais avoir Lire qu'il ne fonctionne pas bien avec async

    Mes questions sont:

    • est-ce même possible à convertir en un composant fonctionnel?
    • Si oui, quel crochet dois-je utiliser et qu'il nécessiterait une refonte de mon résoudre () fonction?
    • est-il même mieux de convertir ceci d'un composant de classe en un composant fonctionnel?

1 commentaires

Hey avez-vous essayé userasynceffect au lieu d'useeffect? J'utilise ce forfait NPM chaque fois que j'ai des crochets asynchrones comme celui-ci lien NPM


3 Réponses :



1
votes

Vous pouvez utiliser un effet à chaque fois que la carte change à cet effet. Quand il n'y a plus de mouvements, le tableau ne change pas et l'effet ne fonctionnera plus.

Voici un exemple de la façon dont vous pouvez faire cela: P>

P>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>


<div id="root"></div>


0 commentaires