-2
votes

UseEffect () TypeError: E n'est pas une fonction

Je reçois TypeError: E n'est pas une fonction code>

à MessagePort.C.Port1.onMessage (réact.production.min.js: 24) P>

Pour des raisons que je ne comprends pas dans un useEffect (). Je me rends compte que cela est probablement un problème obscur par rapport à ma base de code de code, comme je ne peux pas reproduire dans CoDesandbox, mais je me suis dit que je jetais cela de toute façon. P>

useEffect(() => {if (someVar) console.log('asdf')}, [button])


2 commentaires

Vous ne partagez pas l'ensemble de l'image, je suppose que vous exécutez un certain code dans la fonction de nettoyage d'UseEffect qui provoque le problème. Quoi qu'il en soit, cet exemple n'aura qu'un avertissement et non une erreur d'exécution.


Je suppose que celui-ci "quelqueevar" est une fonction où est le problème


3 Réponses :


0
votes

USEEEFFECT attendez une fonction de nettoyage à renvoyer, une alternative au cycle de vie du composantWillunMount (), mais il est facultatif. Donc, il jette une erreur car quelquevar && console.log ('asdf') code> n'est pas une fonction.

useEffect(() => {
  if (someVar) console.log('asdf');

  return () => {
    // do something while leaving this component.
  };
}, [button)


5 commentaires

L'avez-vous essayé? Ne pas retourner une fonction laissera un avertissement, mais pas une erreur d'exécution ...


@Dennisvash Si vous retournez FALSE à partir d'un useEffect . Il tentera de faire false () et casser.


Je l'ai vérifié, il n'a pas été brisé en production et en développement, avez-vous vérifié cela?


Oui je l'ai fait. J'ai D n'est pas une fonction .


@Dennisvash a ajouté une réponse avec exemple en cours d'exécution



-1
votes

Je préconise le réact-dom et réagir des paquets au développement et nous sommes ici. Je retournais un booléen dans le FN fourni à useeffect. Codesandbox

 Entrez la description de l'image ici


4 commentaires

C'est un avertissement. Pas une erreur d'exécution Comme dans votre question, vous devez également modifier la question au lieu de répondre avec plus de détails.


Cela conduit à l'erreur d'exécution. Voir le bouton Codesandbox et cliquez sur le bouton. Désolé n'a pas compris ça. Le fera à l'avenir. Semble bizarre il y a UX pour laisser op de réponse.


Il n'est pas Passez une erreur d'exécution. Votre code spécifique dans votre codeBase fait. Pour être sûr que je me suis vérifié moi-même.


Bien oui je veux dire n'est pas que le point? Ma question était la raison pour laquelle cette erreur d'exécution se passait avec mon utilisateurFEFFECT. Si c'était un problème de réagissariat, je le posterais sur GitHub. J'essayais de comprendre pourquoi mon utilisation de réaction était fausse et je l'ai fait. Renvoyer une FN réelle.



2
votes

Ma première hypothèse est que vous ne signification pas vraiment de revenir du useeffect code>, mais qui utilisaient mal l'utilisation de la syntaxe courte et ne réalisait pas qu'il utilise un retour implicite ( Lire ici sur les fonctions des arrows et les retours implicites).

La fonction renvoyée de useeffect code> fonctionnera comme un nettoyage (comme mentionné dans les commentaires). Ce que vous revenez de l'effet dépendra de la condition, mais dans aucun cas, il ne retournera une fonction. Si Certainvar code> est FALSY, il retournera onevar code>. Si quelquevar code> est de la vérité, il retournera la valeur de console.log () code> qui est non défini code>. P>

Voir ci-dessous Que se passe-t-il lorsqu'un useeffect code> renvoie false code> (cliquez sur le bouton "Démonter" pour voir l'effet). 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>


2 commentaires

Bonne prise! J'ai oublié de démonter mes chèques -_-, cela devrait certainement être un problème sur réagir GitHub, la fonction de nettoyage doit vérifier si le rappel est une fonction.


Basé sur l'image d'avertissement, l'OP posté comme une réponse, je pense que cela le fait déjà. Il ne fait que avertir seulement et n'arrête pas l'exécution du mauvais code.