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

时间:2019-04-25 10:00:55

标签: reactjs react-hooks

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

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

具有以下依赖性。

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

但仍然出现错误

  

./ src / App.js

     

第7行:
  在函数中调用React Hook“ useState”   “ app”既不是React函数组件也不是自定义React   挂钩函数react-hooks / rules-of-hooks

     

第39行:
  未定义“状态”
  没有undef

     

搜索关键字以详细了解每个错误。

34 个答案:

答案 0 :(得分:21)

尝试大写“ app”之类的

const App = props => {...}

导出默认应用;

答案 1 :(得分:18)

使用const App代替const app

答案 2 :(得分:14)

只需尝试将您的应用名称大写

const App = props => {...}

export default App;

答案 3 :(得分:13)

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

答案 4 :(得分:11)

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

答案 5 :(得分:9)

反应组件(包括功能和类)必须以大写字母开头。喜欢

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首先无法将其标识为用户定义的组件。 / p>

useState也可以在定制钩子内部使用,该钩子用于可重用性和逻辑抽象。因此,根据钩子规则,自定义钩子的名称必须以“ use”前缀开头,并且必须位于camelCase

答案 6 :(得分:7)

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

如果是,请大写

topic z

收件人

const app

表现出色

const App

收件人

export default app

对我来说很好。

答案 7 :(得分:5)

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

但是对我来说,这很可悲。

答案 8 :(得分:3)

在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

答案 9 :(得分:3)

您的代码

browser.find_elements_by_css_selector('[class*="product-information__Title"]')

把函数名改成大写,像这样

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;

它会起作用,谢谢。

答案 10 :(得分:2)

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

答案 11 :(得分: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;

答案 12 :(得分:2)

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

答案 13 :(得分:2)

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

export default function App() { }

答案 14 :(得分:2)

我有同样的问题。原来是在“ App”中将“ A”大写的问题。 另外,如果要导出,请执行以下操作:export default App;确保也导出相同名称的“ App”。

答案 15 :(得分:2)

替换此

export default app;

与此

export default App;

答案 16 :(得分:1)

这是因为React Hooks的ESLint规则。在此处找到规则的链接:

ESLint rule for React Hooks

截至目前,该规则在行号中进行了描述。 44。

答案 17 :(得分:1)

使用大写字母定义功能组件名称/ 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>
)
};

[ReactHooks] [useState] [ReactJs]

答案 18 :(得分:0)

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

例如:

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

答案 19 :(得分:0)

如果您仍在寻找这个问题的答案,上述所有解决方案都可以正常工作,但我仍然会在下面提供运行/正确的代码(已编辑)

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;

答案 20 :(得分:0)

我认为您上的课程与我相同,因为您在此使用了完全相同的变量名称,实际上您在这里遗漏了一点,即您将应用程序名称更改为小写

export default app

有个小错误就是在index.js里面也改了名字你在App.js这里改了名字但是在index.js里忘记改了你还是这样导入

import App from './App.js'

所以你也必须在那里更改名称

答案 21 :(得分:0)

作为最佳实践,尝试在 Person 组件中使用 props 元素之前对其进行解构。也使用函数组件而不是 consts。 (不那么混乱,你可以更快地完成事情)

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

答案 22 :(得分: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} />
    </>
    );
}

答案 23 :(得分:0)

每当使用React功能组件时,请始终将组件名称的首字母保留为大写,以避免出现这些React Hooks错误。

在您的情况下,您已为组件app命名,如我上面所述,应将其更改为App,以避免React Hook错误。

答案 24 :(得分:0)

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

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

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

答案 25 :(得分:0)

首先,您需要将组件的FirstLetter大写,在这种情况下, app 应该是 App ,而 person 应该是< strong>人员。

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

这是CodeSandbox中的链接:Invalid hook call

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

ReactDOM.render(App(), rootElement);

应该是:

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

有关更多信息,请阅读Rule of Hooks - React

希望这会有所帮助!

答案 26 :(得分:0)

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

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

export default Person;

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

官方解释from Hooks FAQs

  

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

答案 27 :(得分:0)

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

答案 28 :(得分:0)

您收到此错误:“函数Happ中的“应用程序”中调用了反应挂钩“ useState”,它既不是React函数组件也不是自定义的React Hook函数”

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

例如:

const Helper =()=>{}

function Helper2(){}

答案 29 :(得分:-1)

在app函数中,您错误地拼写了单词setpersonSate,但缺少字母t,因此应为setpersonState

错误

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

解决方案

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

答案 30 :(得分:-1)

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

因此,将您的 app 组件大写为 App

答案 31 :(得分:-1)

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

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

在我看来,最终结果是这样的:

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

这解决了我的问题。

答案 32 :(得分:-1)

您输入的内容正确吗?

import React, { useState } from 'react';

答案 33 :(得分:-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 })}
    />
  );
});