J'essaie d'utiliser des crochets React pour un problème simple
const [personState,setPersonState] = useState({ DefinedObject });
avec les dépendances suivantes.
"dependencies": {
"react": "^16.8.6",
"react-dom": "^16.8.6",
"react-scripts": "3.0.0"
}
mais je reçois toujours l'erreur suivante:
./src/App.js
Ligne 7:
React Hook "useState" est appelé dans la fonction "app" qui n'est ni un composant de fonction React ou un élément React Hook function react- crochets/règles de crochetsLigne 39:
'état' n'est pas défini
no-undefRecherchez les mots clés pour en savoir plus sur chaque erreur.
Le code du composant est ci-dessous:
import React, {useState} from 'react';
import './App.css';
import Person from './Person/Person';
const app = props => {
const [personState, setPersonSate] = useState({ person:[ {name:'bishnu',age:'32'}, {name:'rasmi',age:'27'}, {name:'fretbox',age:'4'} ], });
return (
<div className="App">
<h2>This is react</h2>
<Person name={personState.person[1].name} age="27"></Person>
<Person name={personState.person[2].name} age="4"></Person>
</div> );
};
export default app;
Composant personne
import React from 'react';
const person = props => {
return(
<div>
<h3>i am {props.name}</h3>
<p>i am {props.age} years old</p>
<p>{props.children}</p>
</div>
)
};
export default person;
Essayez de mettre en majuscule "app" comme
const App = props => {...}
export default App;
J'ai l'impression que nous suivons le même cours à Udemy.
Si oui, capitalisez simplement
const app
À
const App
Faites aussi bien que pour
export default app
À
export default App
Cela fonctionne bien pour moi.
Autant que je sache, un linter est inclus dans ce package. Et cela nécessite que votre composant commence par le caractère Capital. S'il te plaît vérifie le.
Mais pour moi c'est triste.
utilisez la première lettre majuscule dans le nom de la fonction. par exemple: - fonction App {}
Essayez simplement de mettre en majuscule le nom de votre application
const App = props => {...}
export default App;
Vous obtenez cette erreur: "React Hook" useState "est appelé dans la fonction" App "qui n'est ni un composant de fonction React ou une fonction personnalisée React Hook) "
Solution: vous devez essentiellement capitaliser la fonction.
Par exemple:
const Helper =()=>{}
function Helper2(){}
J'ai eu le même problème. s'avère que Capitaliser le "A" dans "App" était le problème. De plus, si vous exportez: export default App;
assurez-vous d'exporter également le même nom "App".
Les composants doivent commencer par des majuscules. Pensez également à modifier la première lettre de la ligne à exporter!
le premier caractère de votre fonction doit être un majuscule
Les noms des composants React doivent être en majuscules et les fonctions de hook personnalisées doivent commencer par le mot clé tiliser pour s'identifier comme une fonction de hook React.
Donc, capitalisez vos composants app en App
Utiliser l'application const au lieu de l'application const
Avez-vous la bonne importation?
import React, { useState } from 'react';
J'ai eu le même problème, mais pas avec l'application. J'avais une classe personnalisée mais j'ai utilisé une lettre minuscule pour démarrer le nom de la fonction et j'ai également reçu l'erreur.
Modification de la première lettre du nom de la fonction et de la ligne d'exportation vers CamelCase et erreur disparue.
dans mon cas, le résultat final était quelque chose comme:
function Document() {
....
}
export default Document;
cela a résolu mon problème.
Dans JSX, le nom de balise en minuscule est considéré comme un composant natif html. Afin de réagir, reconnaissez la fonction comme composant React, vous devez mettre le nom en majuscule).
Capitalized types indicate that the JSX tag is referring to a React component. These tags get compiled into a direct reference to the named variable, so if you use the JSX <Foo /> expression, Foo must be in scope.
https://reactjs.org/docs/jsx-in-depth.html#html-tags-vs.-react-components
La solution est simple, corrigez "app" et écrivez "App" avec le premier caractère en majuscule.
Capitaliser l'application sur App fonctionnera sûrement.
Tout d'abord, vous devez mettre en majuscule la FirstLetter de vos composants, dans votre cas app devrait être App et personne devrait être Personne .
J'ai essayé de copier votre code dans l'espoir de trouver le problème. Étant donné que vous n'avez pas partagé la façon dont vous appelez le composant App , je ne vois qu'une façon de résoudre ce problème.
Il s'agit du lien dans CodeSandbox: appel non valide .
Pourquoi? À cause du code ci-dessous qui est faux:
ReactDOM.render(App(), rootElement);
Cela aurait dû être:
ReactDOM.render(<App />, rootElement);
Pour plus d'informations, vous devriez lire Rule of Hooks - React
J'espère que cela t'aides!
La solution, comme l'a déjà souligné Yuki, consiste à mettre en majuscule le nom du composant. Il est important de noter que non seulement le composant App "par défaut" doit être capitalisé, mais tous les composants:
const Person = () => {return ...};
export default Person;
Cela est dû au package eslint-plugin-react-hooks, en particulier à la fonction isComponentName () dans le script RulesOfHooks.js.
Explication officielle de la FAQ de Hooks :
Nous fournissons un plugin ESLint qui applique les règles de Hooks pour éviter les bugs. Il suppose que toute fonction commençant par "use" et une majuscule juste après c'est un Hook. Nous reconnaissons que cette heuristique n'est pas parfaite et qu'il peut y avoir des faux positifs, mais sans une convention à l'échelle de l'écosystème, il n'y a tout simplement aucun moyen de faire fonctionner Hooks correctement - et des noms plus longs décourageront les gens d'adopter des Hooks ou de suivre la convention.
Étape 1: remplacez le nom de fichier src/App.js par src/app.js
Étape 2: cliquez sur "Oui" pour "Mettre à jour les importations pour app.js".
Étape 3: redémarrez à nouveau le serveur.
N'utilisez pas la fonction flèche pour créer des composants fonctionnels.
Faites comme l'un des exemples ci-dessous:
function MyComponent(props) {
const [states, setStates] = React.useState({ value: '' });
return (
<input
type="text"
value={states.value}
onChange={(event) => setStates({ value: event.target.value })}
/>
);
}
Ou
//IMPORTANT: Repeat the function name
const MyComponent = function MyComponent(props) {
const [states, setStates] = React.useState({ value: '' });
return (
<input
type="text"
value={states.value}
onChange={(event) => setStates({ value: event.target.value })}
/>
);
};
Si vous avez des problèmes avec "ref"
(Probablement en boucles), la solution est d'utiliser forwardRef()
:
// IMPORTANT: Repeat the function name
// Add the "ref" argument to the function, in case you need to use it.
const MyComponent = React.forwardRef( function MyComponent(props, ref) {
const [states, setStates] = React.useState({ value: '' });
return (
<input
type="text"
value={states.value}
onChange={(event) => setStates({ value: event.target.value })}
/>
);
});