在函数“ app”中调用React Hook“ useState”,该函数既不是React函数组件也不是定制的React Hook函数

reactjs React.js

阿飞神无

2020-03-12

我正在尝试使用React钩子解决一个简单的问题

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

具有以下依赖性。

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

但我仍然收到以下错误:

./src/App.js

第7行:
在函数“ app”中调用React Hook“ useState”,该函数既不是React函数组件也不是定制的React Hook函数react-hooks / rules-of-hooks

第39行: 未定义
“状态”

搜索关键字以了解有关每个错误的更多信息。

组件代码如下:

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; 

第1343篇《在函数“ app”中调用React Hook“ useState”,该函数既不是React函数组件也不是定制的React Hook函数》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

19个回答
Pro番长 2020.03.13

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

作为以下示例之一执行:

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 })}
    />
  );
});
神奇古一 2020.03.13

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

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

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

Stafan小小 2020.03.13

使用const App代替const app

老丝村村 2020.03.13

首先,您需要将组件的FirstLetter大写,在这种情况下,app应该是Appperson应该是Person

我试图复制您的代码,以期发现问题。由于您没有分享如何调用App组件,因此我只能看到一种导致问题的方法。

这是CodeSandbox中的链接:Invalid hook call

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

ReactDOM.render(App(), rootElement);

应该是:

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

欲了解更多信息,您应该阅读钩子规则-React

希望这可以帮助!

猴子十三 2020.03.13

正如Yuki已经指出的,解决方案是大写组件名称。请务必注意,不仅“大写” App组件需要大写,而且所有组件也都必须大写:

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

export default Person;

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

Hooks常见问题解答的官方解释

我们提供了一个ESLint插件,该插件可以强制执行Hooks规则以避免错误。它假定任何以“ use”开头且紧随其后的是大写字母的函数都是“挂钩”。我们认识到这种启发式方法不是完美的,并且可能会有一些误报,但是如果没有整个生态系统的约定,就无法使Hooks正常工作-较长的名称将使人们不愿采用Hooks或遵循约定。

前端MandyJinJin 2020.03.13

在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

理查德村村小宇宙 2020.03.13

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

JinJinDavaidNear 2020.03.13

将应用程序大写为App肯定会起作用。

逆天小卤蛋Green 2020.03.13

函数的第一个字符应为大写

猿EvaL 2020.03.13

我遇到了同样的问题,但应用程序却没有。我有一个自定义类,但使用小写字母开头的函数名称,并且还收到错误。

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

就我而言,最终结果是这样的:

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

这解决了我的问题。

凯梅小胖 2020.03.13

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

因此,将您的应用程序组件大写App

猿前端前端 2020.03.13

我遇到过同样的问题。原来是在“ App”中将“ A”大写的问题。另外,如果要导出,请export default App;确保也导出相同名称的“ App”。

LLSam 2020.03.13

组件应以大写字母开头。还记得更改出口行中的第一个字母!

罗静云 2020.03.13

您将收到此错误:“在函数“ App”中调用了React Hook“ useState”,它既不是React函数组件也不是自定义的React Hook函数”

解决方案:您基本上需要将功能大写。

例如:

const Helper =()=>{}

function Helper2(){}

理查德飞云 2020.03.13

只需大写您的应用名称

const App = props => {...}

export default App;
蛋蛋和田 2020.03.13

在函数名称中使用首字母大写。例如:-功能App {}

LEY宝儿 2020.03.13

据我所知,这个包装中包含了短绒棉。并且它要求您的组件应该从大写字母开始。请检查一下。

然而,对我而言,这是可悲的。

文韬武略辛弃疾 2020.03.13

我觉得我们在乌迪米(Udemy)正在做同样的课程。

如果是这样,请大写

const app

const App

做的以及

export default app

export default App

这对我来说很有用。

宝儿神奇 2020.03.13

尝试将“ app”大写,例如

const App = props => {...}

export default App;

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android