我试图使用反应钩子来解决一个简单的问题

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

具有以下依赖关系。

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

但我仍然得到以下错误:

/ src / App.js 第7行: React钩子useState在函数中被调用 “app”既不是React函数组件,也不是自定义React 钩子函数react-hooks/rules-of-hooks 39行: 'state'没有定义 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; 

你的导入正确吗?

import React, { useState } from 'react';

据我所知,这个包里包括一个绒线。它要求你的组件应该从大写字母开始。 请核对一下。

然而,对我来说,这是悲伤的。


试着把“app”大写

const App = props => {...}

export default App;

在React中,组件需要大写,自定义钩子需要从使用开始。


我也有同样的问题。事实证明,把“App”中的“A”大写才是问题所在。 另外,如果你要导出:导出默认App;确保你导出了相同的名字“App”。


我有同样的问题,但不是与应用程序。我有一个自定义类,但使用小写字母开始函数名,也收到了错误。

将函数名的第一个字母和导出行更改为CamelCase,错误消失。

在我的案例中,最终结果是这样的:

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

这解决了我的问题。


我觉得我们在Udemy上的课程是一样的。

如果是,则大写

const应用

To

const应用

做得和做得一样好吗

export default app

To

export default App

这对我来说很有效。


组件应以大写字母开头。还记得将行中的第一个字母改为export!


你得到这个错误:"React Hook "useState"在函数"App"中被调用,这既不是一个React函数组件,也不是一个自定义的React Hook函数"

解决方案:你基本上需要大写函数。

例如:

const Helper =()=>{} 函数Helper2 () {}


解决方法很简单,把“app”写正确,并把“app”的第一个字母大写。


正如Yuki已经指出的那样,解决方案是将组件名称大写。需要注意的是,不仅“默认”App组件需要大写,所有组件都需要大写:

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

export default Person;

这是由于eslint-plugin-react-hooks包,特别是RulesOfHooks.js脚本中的isComponentName()函数。

Hooks FAQs官方解释:

我们提供了一个ESLint插件,它强制hook的规则以避免错误。它假定任何以“use”开头且后面紧跟大写字母的函数都是Hook。我们认识到这种启发式并不完美,可能会有一些误报,但如果没有一个生态系统范围内的约定,就没有办法让Hooks很好地工作——较长的名称会阻碍人们采用Hooks或遵循约定。


首先,你需要大写你的组件的FirstLetter,在你的情况下app应该是app, person应该是person。

我试图复制你的代码,希望找到问题所在。由于你没有分享你如何调用App组件,我只能看到一种方法导致这个问题。

这是CodeSandbox中的链接:无效钩子调用。

为什么?因为下面的代码是错误的:

ReactDOM.render(App(), rootElement);

它应该是:

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

更多信息,你应该阅读规则的钩子-反应

希望这能有所帮助!


在函数名中使用首字母大写。

function App(){}

步骤1: 将文件名src/App.js更改为src/App.js

步骤2: 点击“是”选择“更新app.js的导入”。

步骤3: 重新启动服务器。


React组件名称应大写,自定义钩子函数应以use关键字开始,以标识为React钩子函数。

把你的app组件大写为app


将app大写为app肯定会起作用。


在JSX中,小写标记名被认为是html原生组件。 为了让react能够将该函数识别为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


只要试着将你的应用程序名称大写即可

const App = props => {...}

export default App;

不要使用箭头函数创建功能组件。

按照下面的例子做:

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

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

Or

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

函数的第一个字符应该是大写的


使用const App而不是const App


无论何时使用React功能组件,始终保持组件名称的首字母为大写,以避免这些React Hooks错误。

在你的例子中,你已经将组件命名为app,正如我上面所说的,应该将其更改为app,以避免React Hook错误。


替换这个

export default app;

用这个

export default App;

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

在应用程序函数中,你错误地拼写了单词setpersonState,漏掉了字母t,因此它应该是setpersonState。

错误:

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

解决方案:

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

使用大写字母定义功能组件名称/ React挂钩自定义组件。const 'app'应该是const 'app'。

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

[反应物][useState][反应物]


使函数名大写。这对我很有用。

export default function App() { }

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;

React组件(包括函数组件和类组件)必须以大写字母开头。就像

const App=(props)=><div>Hey</div>

class App extends React.Component{
   render(){
     return <div>Hey</div>
   }
}

React通过遵循这个语义来标识用户定义的组件。React的JSX编译到React。createElement函数,返回dom节点的对象表示形式。该对象的type属性告诉我们它是用户定义的组件还是像div这样的dom元素。因此,遵循这个语义是很重要的

由于useState钩子只能在函数组件(或自定义钩子)内部使用,这就是为什么你得到错误的原因,因为react不能首先将其标识为用户定义的组件。

useState也可以在自定义钩子中使用,用于可重用性和逻辑抽象。因此根据钩子的规则,自定义钩子的名称必须以“use”前缀开头,并且必须在驼峰大小写中


如果你仍然在寻找这个问题的答案,以上所有的解决方案都很好,但我仍然会提供以下运行/正确的代码(编辑)

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

  const App = props => {
    const [personsState, setPersonsState ] = useState({
      persons:[
        {name: 'Ram', age: 20},
        {name: 'Rahul', age: 24},
        {name: 'Ramesh', age: 25}
      ],
      otherState: 'Some Other value' 
    });

    const switchNameHandler = () => {
      //console.log('Click is working');
      //Dont Do THIS: this.state.persons[0].name = 'singh';
      setPersonsState({
        persons:[
        {name: 'Ram',age: 20},
        {name: 'Raj', age: 24},
        {name: 'yts', age: 30} 
      ]
    });
    };

    return (
      <div className="App">
        <h1>Nice two one three  Hello i am a noob react developer</h1>
        <button onClick={switchNameHandler}>Switch Name</button>
        <Person name={personsState.persons[0].name} age={personsState.persons[0].age} />
        <Person name={personsState.persons[1].name} age={personsState.persons[1].age}> My hobbies are Gaming</Person>
        <Person name={personsState.persons[2].name} age={personsState.persons[2].age} />
      </div>
    ); 
    // return React.createElement('div',{className:'App'}, React.createElement('h1', null, 'Hi learning the basics of react'));
}

export default App;

可能是在没有条件的useEffect之前添加了依赖于条件的useEffect

EX:

useEffect(() => {
  _anyFunction();
}, []);
    
useEffect(()=> {
  anyCode....
}, [response]);

我想你们学的课程和我学的是一样的因为你们在这里使用了完全相同的变量名,实际上你们遗漏了一点就是你把应用的名字改成了小写

export default app

有一个小错误,就是在index.js中更改名称,你在App.js中更改了名称,但在index.js中忘记更改名称,你仍然像这样导入它

import App from './App.js'

所以这里的名字也要改


你的代码

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, {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;

会有用的谢谢。


就像最佳实践一样,在Person组件中使用props元素之前,尝试解构它。也要使用函数组件而不是常量。(这样更容易混淆,你可以更快地完成任务)

function ({person}) {
  const name={person.name}
  return (
    <h2>{name}</h2>
  )
}

尝试将“app”名称更改为“app”

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

函数名必须以大写字母开头

为例:

const App = props => {

}

不是const应用程序


用户定义的组件必须大写。在你的例子中,你使用了const app = props =>{}。在“app”中,“a”是小写的,你必须尝试使用“app”

When an element type starts with a lowercase letter, it refers to a built-in component like <div> or <span> and results in a string 'div' or 'span' passed to React.createElement. Types that start with a capital letter like <Foo /> compile to React.createElement(Foo) and correspond to a component defined or imported in your JavaScript file. React recommend naming components with a capital letter. If you do have a component that starts with a lowercase letter, assign it to a capitalized variable before using it in JSX.

更多详情请查阅官方文件 点击这里