首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:组件列表映射上的钩子调用无效。ReactJS

错误:组件列表映射上的钩子调用无效。ReactJS
EN

Stack Overflow用户
提问于 2020-07-01 05:34:11
回答 2查看 404关注 0票数 1

在中,我希望在下面使用钩子并获得错误。

实际上,我使用YhSection来管理并行组件,并使用数组映射将它们放在布局内容中。

我发现如果我用钩子

代码语言:javascript
复制
{yhSection.map((section) => (
    <Route key={section.key} path={section.path}>
      {section.components}
    </Route>
))}

它起作用了,但在里面,它不起作用。

钩子调用错误在Review.tsx

我非常感谢你的帮助。

错误:无效钩子调用。钩子只能在函数组件的主体内调用。这种情况的发生有以下原因之一:

  1. 您可能有React的不匹配版本和呈现器(例如React )
  2. ,您可能正在违反Hooks
  3. 的规则,您可能在同一个应用程序

中有多个React副本。

MyContentWithRoute.tsx

代码语言:javascript
复制
import React, { FC } from 'react';
import { Route, Switch } from 'react-router-dom';
import { Layout } from 'antd';
import My404 from './My404';

import yhSection from './YhSection';

const MyContentWithRoute: FC = () => (
  <Layout.Content style={{ margin: '16px', background: '#fff' }}>
    <Switch>
      {yhSection.map((section) => (
        <Route key={section.key} path={section.path}>
          {section.components}
        </Route>
      ))}
      <Route path="*">
        <My404 />
      </Route>
    </Switch>
  </Layout.Content>
);

export default MyContentWithRoute;

YhSection.tsx

代码语言:javascript
复制
import { FC } from 'react';

import Review from './Review';
import Profit from './Profit';
import Policy from './Policy';
import Fluid from './Fluid';
import Capital from './Capital';
import Risk from './Risk';
import Trader from './Trader';
import Valuation from './Valuation';

interface YhSection {
  key: string;
  name: string;
  path: string;
  components: FC;
}

const yhSection: YhSection[] = [
  { key: 'review', path: '/review', components: Review },
  { key: 'profit', path: '/profit', components: Profit },
  { key: 'policy', path: '/policy', components: Policy },
  { key: 'fluid', path: '/fluid', components: Fluid },
  { key: 'capital', path: '/capital', components: Capital },
  { key: 'risk', path: '/risk', components: Risk },
  { key: 'trader', path: '/trader', components: Trader },
  { key: 'valuation', path: '/valuation', components: Valuation },
];

export default yhSection;

Review.tsx

代码语言:javascript
复制
import React, { useState } from 'react';
import Chart from './Chart';

const Review: React.FC = () => {
  const [state, setState] = useState(2);
  const data1 = [
    { date: '1991', value: 3 },
    { date: '1992', value: 4 },
    { date: '1993', value: 3.5 },
    { date: '1994', value: 5 },
    { date: '1995', value: 4.9 },
    { date: '1996', value: 6 },
    { date: '1997', value: 7 },
    { date: '1998', value: 9 },
    { date: '1999', value: 13 },
  ];
  console.log(state);
  return <Chart data={data1} />;
};

export default Review;

package.json

代码语言:javascript
复制
{
  "name": "vmp_frontend",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@ant-design/charts": "^0.9.6",
    "@craco/craco": "^5.6.4",
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.5.0",
    "@testing-library/user-event": "^7.2.1",
    "@types/jest": "^24.9.1",
    "@types/node": "^12.12.47",
    "@types/react": "^16.9.36",
    "@types/react-dom": "^16.9.8",
    "@types/react-router-dom": "^5.1.5",
    "ahooks": "^2.0.1",
    "antd": "^4.3.4",
    "axios": "^0.19.2",
    "craco-less": "^1.17.0",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-router-dom": "^5.2.0",
    "react-scripts": "3.4.1",
    "typescript": "^3.7.5"
  },
  "scripts": {
    "start": "craco start",
    "build": "craco build",
    "test": "craco test",
    "eject": "craco eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@typescript-eslint/eslint-plugin": "^3.3.0",
    "@typescript-eslint/parser": "^3.3.0",
    "eslint": "^6.8.0",
    "eslint-config-prettier": "^6.11.0",
    "eslint-plugin-prettier": "^3.1.4",
    "eslint-plugin-react": "^7.20.0",
    "eslint-plugin-react-hooks": "^4.0.4",
    "prettier": "^2.0.5"
  }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-01 07:22:39

似乎您正在尝试呈现一个组件函数,而不是组件JSX实例。看看这个:

代码语言:javascript
复制
{ key: 'review', path: '/review', components: Review }, // here Review is component function
代码语言:javascript
复制
{yhSection.map((section) => (
    <Route key={section.key} path={section.path}>
      {/* here it is still a component function not a JSX element (it is Review and not <Review /> or React.createElement(Review) */}
      {section.components}
    </Route>
))}

尝试将组件函数作为参数直接传递到Route

代码语言:javascript
复制
{yhSection.map((section) => (
  <Route key={section.key} path={section.path} component={section.components} />
))}
票数 3
EN

Stack Overflow用户

发布于 2020-07-01 07:25:10

尝试以下几点

代码语言:javascript
复制
<Route 
  key={section.key}
  path={section.path}
  component={section.components} 
/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62670327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档