"UseState" React Hook викликається у функції "app", яка не є ні компонентом функції React, ні спеціальною функцією React Hook


148

Я намагаюся використовувати гачки для реагування для простої проблеми

const [personState,setPersonState] = useState({ DefinedObject });

з наступними залежностями.

"dependencies": {
    "react": "^16.8.6",
    "react-dom": "^16.8.6",
    "react-scripts": "3.0.0"
}

але я все одно отримую таку помилку:

./src/App.js

Рядок 7:
"useState" React Hook викликається у функції "app", яка не є ні функціональним компонентом React, ні спеціальною функцією React Hook, реагують-гаками / правилами-гаками

Рядок 39:
"стан" не визначено
no-undef

Шукайте ключові слова, щоб дізнатися більше про кожну помилку.

Код компонента знаходиться нижче:

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;

Особовий компонент

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; 

1
Чи можете ви поділитися своїм компонентним кодом?
Сечін

import React, {useState} з 'react'; імпорт './App.css'; імпортувати особу з './Person/Person'; const app = props => {const [personState, setPersonSate] = useState ({person: [{name: 'bishnu', вік: '32 '}, {ім'я:' rasmi ', вік: '27'}, {ім'я : 'fretbox', вік: '4'}],}); return (<div className = "App"> <h2> Це реагує </h2> <ім'я особи = {personState.person [1]. ім'я} age = "27"> </Person> <ім'я особи = {personState .person [2] .name} age = "4"> </Person> </div>); }; експортувати додаток за замовчуванням;
Бішну

Персональний компонент: - імпорт React від 'реагувати'; const person = (props) => {return (<div> <h3> мені {props.name} </h3> <p> мені років {props.age} років </p> <p> {реквізит. діти} </p> </div>)} експортувати особу за замовчуванням;
Бішну

5
чорт читати такий спільний код, поважати інших
AlexNikonov

5
У мене була така ж проблема і з курсу Maximilian React.
GDG612

Відповіді:


340

Спробуйте заздалегідь використати велику кількість "додатка"

const App = props => {...}

export default App;

У React компоненти повинні бути використані з великої літери, а користувацькі гачки потрібно починати use.


26
Це важко знайти помилку в додатку, я думаю, що ще один коментар слід додати до повідомлення про помилку, щоб вказати на цю можливість.
Марк Е

22
Причина цієї істоти , що в правилах Крючков ESLint плагіна , є перевірка , щоб побачити , якщо ім'я компоненти або функції діє: Checks if the node is a React component name. React component names must always start with a non-lowercase letter..
HGomez

11
з великої літери в додатку працює для мене ... але я не думаю, чому Макс не отримав цю помилку в курсі udemy?
Ashish Sharma

8
Те саме питання "чому max не
помилився

вас Бог послав. У мене зараз може бути важкий день. Будьте благословенні
kipruto

51

Я відчуваю, що ми робимо той самий курс в Удемі.

Якщо так, просто використовуйте великі літери

const app

До

const App

Так само, як і для

export default app

До

export default App

Це добре працює для мене.


5
Так, я думаю, що це з нас робить 3 те ж саме. Чому він враховує регістри?
MeltingDog

2
Це слід позначити як правильну відповідь. За замовчуванням ім'я "основного компонента" ОБОВ'ЯЗКОВО використовувати великі літери Також не забудьте імпортувати компоненти з великими літерами. WRONG: імпорт компо з './Compo'; ВПРАВО: імпорт Compo з './Compo'; Як react розпізнає великі теги JSX як компоненти, що реагують.
Marcos R

1
чому це справа чутливого Тхо?
kipruto

36

Наскільки мені відомо, в цей пакет входить лайнер. І це вимагає, щоб компонент повинен починатися з капіталу. Будь ласка, перевірте це.

Однак, як на мене, це сумно.


Спасибі спрацювали як шарм @alerya
karthickeyan

Дякую, що заощадили мій час.
Гарсимер

22

Використовуйте велику літеру першої літери у назві функції.

function App(){}

"Перш за все, вам потрібно прописати Перший лист своїх компонентів. У вашому випадку додаток має бути App, а людина повинна бути Особою." Хтось уже написав це ...
Почмурник

На це відповіли, і це слід позначити як відповідь. Просте рішення, пояснене правильно.
користувач2112618


14

Просто спробуйте заздалегідь використати великі літери на ім’я програми

const App = props => {...}

export default App;

ти маєш на увазі назву документа?
gakeko betsi

Його робота, спасибі
Dev Rupinder

12

Ви отримуєте цю помилку: "Функція React Hook" useState "викликається у функції" App ", яка не є ні компонентом функції React, ні спеціальною функцією React Hook"

Рішення: В основному вам потрібно використовувати велику капіталізацію функції.

Наприклад:

const Helper =()=>{}

function Helper2(){}



10

У мене було те саме питання. виявляється, що велике використання "A" в "App" було проблемою. Крім того, якщо ви здійснюєте експорт: export default App;переконайтесь, що ви експортуєте те саме ім’я "Додаток".


10

Компоненти повинні починатися з великої літери. Також не забудьте змінити першу букву в рядку для експорту!


2
Ваше запитання не схоже на відповідь. Після досягнення 50 представників ви зможете коментувати питання. Якщо відповідь - це відповідь, спробуйте її вдосконалити. Чому компоненти слід починати, наприклад, з великих літер? Крім того, інші відповіді вже говорили, що ви даєте щось нове?
Ender Look


5

Імена реактивних компонентів мають бути написані з великої літери, а функції користувацьких гачків повинні починатися з використання ключового слова щоб ідентифікувати функцію реагування на гак.

Таким чином, капіталізувати свої додатки компонентів в App


3

У мене була та сама проблема, але не з додатком. У мене був власний клас, але я використав малу літеру для запуску імені функції, а також отримав помилку.

Змінено першу букву назви функції та рядок експорту на CamelCase та помилка.

у моєму випадку кінцевий результат був чимось на кшталт:

function Document() {
....
}
export default Document;

це вирішило мою проблему.


2

Рішення просте, правильне "додаток" і напишіть "Додаток" з першим символом у верхньому регістрі.


Ласкаво просимо до StackOverflow (оновлено). будь-ласка, введіть код і дайте відповідь на запитання.
Мехді


2

У JSX найменше регістр ім'я тегів розглядається як основний компонент html. Для того, щоб реагувати розпізнати функцію як компонент React, потрібно використовувати велику літеру.

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




2
React Hook "useState" is called in function "App" which is neither a React function component or a custom React Hook function"

Для наступної помилки використовуйте велику літеру, наприклад, першу букву компонента, а також експорт також.

const App  = props => {
...}
export default App;

1

Рішення, як уже зазначав Юкі, полягає у використанні великої літери назви компонента. Важливо зауважити, що не тільки "за замовчуванням" компонент програми має потребувати великих літер, але всі компоненти:

const Person = () => {return ...};

export default Person;

Це пов'язано з пакетом eslint-plugin-react-hooks, зокрема функцією isComponentName () всередині скрипту RulesOfHooks.js.

Офіційне пояснення від FAQ щодо гачків :

Ми надаємо плагін ESLint, який застосовує правила Hooks, щоб уникнути помилок. Він передбачає, що будь-яка функція, що починається з «використання» та великої літери, відразу після неї - Гак. Ми визнаємо, що це евристика не є досконалою, і можуть бути помилкові позитиви, але без загальноекологічної конвенції просто неможливо змусити Гачки працювати добре - і довші імена будуть відштовхувати людей від прийняття Гаків або дотримання конвенції.


1

Перш за все, вам потрібно прописати Перший лист своїх компонентів, у вашому випадку додаток має бути додаток, а людина повинна бути особою .

Я спробував скопіювати ваш код у надії знайти проблему. Оскільки ви не поділилися тим, як ви називаєте компонент програми , я бачу лише один спосіб вирішити це питання.

Це посилання в CodeSandbox: Недійсний дзвінок на гачок .

Чому? Через код, нижче якого неправильно:

ReactDOM.render(App(), rootElement);

Це повинно було бути:

ReactDOM.render(<App />, rootElement);

Для отримання додаткової інформації вам слід прочитати Правило гачків - реагуйте

Сподіваюся, це допомагає!


1

Використовуйте велику літеру для визначення імені функціонального компонента / користувацьких компонентів React hooks. "const" додаток "має бути const" додаток ".

App.js

import React, { useState } from 'react';
import { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import Person from './Person/Person';

const App = props => {
  const [personState, setPersonState] = useState({
    persons : [
          {name: 'a', age: '1'},
          {name: 'b', age: '2'},
          {name: 'c', age: '3'}
    ]
  });

    return (
      <div>
     <Person name = {personState.persons[0].name} age={personState.persons[0].age}> First </Person>
     <Person name = {personState.persons[1].name} age={personState.persons[1].age}> Second </Person>
     <Person name = {personState.persons[2].name} age={personState.persons[2].age}> Third </Person>    
    );
};
export default App;

Person.js

import React from 'react';

const person = (props) => {
return (
        <div>
<p> My name is {props.name} and my age is {props.age}</p>
<p> My name is {props.name} and my age is {props.age} and {props.children}</p>
<p>{props.children}</p>
        </div>
)
};

[ReactHooks] [useState] [ReactJs]



0

Щоразу, коли ви працюєте з функціональним компонентом React, завжди зберігайте першу букву імені компонента у верхній регістрі, щоб уникнути цих помилок React Hooks.

У вашому випадку ви назвали компонент app, який слід змінити App, як я вже говорив вище, щоб уникнути помилки React Hook.


0
        import React, { useState } from "react"

    const inputTextValue = ({ initialValue }) => {
        const [value, setValue] = useState(initialValue);
        return {
            value,
            onChange: (e) => { setValue(e.target.value) }
        };
    };

    export default () => {
        const textValue = inputTextValue("");
        return (<>
            <input {...textValue} />
        </>
        );
    }

/*"Solution I Tired Changed Name of Funtion in Captial "*/

    import React, { useState } from "react"

const InputTextValue = ({ initialValue }) => {
    const [value, setValue] = useState(initialValue);
    return {
        value,
        onChange: (e) => { setValue(e.target.value) }
    };
};

export default () => {
    const textValue = InputTextValue("");
    return (<>
        <input {...textValue} />
    </>
    );
}

0

У функції програми ви неправильно написали слово setpersonSate, пропустивши букву t, таким чином воно повинно бути setpersonState.

Помилка :

const app = props => { 
    const [personState, setPersonSate] = useState({....

Рішення :

const app = props => { 
        const [personState, setPersonState] = useState({....


-3

Не використовуйте функцію стрілки для створення функціональних компонентів.

Зробіть один із прикладів нижче:

function MyComponent(props) {
  const [states, setStates] = React.useState({ value: '' });

  return (
    <input
      type="text"
      value={states.value}
      onChange={(event) => setStates({ value: event.target.value })}
    />
  );
}

Або

//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 })}
    />
  );
};

Якщо у вас є проблеми з "ref"(можливо, в циклі), рішенням є використання 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 })}
    />
  );
});

Чи можете ви пояснити більше, чому "Не використовуйте стрілочну функцію для створення функціональних компонентів". ? - Дякую
Хуан

Щоб уникнути проблем з useState () у деяких ситуаціях, таких як у цьому випадку: codeandbox.io/s/usestate-error-f452s
GilCarvalhoDev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.