我正在构建一个Reaction应用程序来了解MUI机会,并在浏览器中收到以下错误:

元素类型无效:应为字符串(对于内置组件) 或者一个类/函数(用于复合组件),但得到的是:Object.你 可能忘了从定义组件的文件中导出组件, 或者,您可能混淆了默认导入和命名导入.

判断渲染方法为App.错误:元素类型无效: 应为字符串(用于内置组件)或类/函数(用于 复合组件),但得到的是:对象.你可能忘了出口 您的组件来自定义它的文件,或者您可能混合了 Up Default和Name Imports.

下面是我的App组件:

import React from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Navbar from './components/Navbar';
import routes from './routes';

const App = () => {
  return (
    <Router>
      <Navbar />
      <div className="container mt-4">
        <Routes>
          {routes.map((route, index) => (
            <Route key={index} path={route.path} element={route.component} />
          ))}
        </Routes>
      </div>
    </Router>
  );
};

export default App;

道路:

import Blog from "./pages/Blog";
import Home from "./pages/Home";
import Team from "./pages/Team";

const routes = [
  { path: '/', component: Home, exact: true }, // Use the component class/function, not JSX element
  { path: '/blog', component: Blog },
  { path: '/team', component: Team },
];

export default routes;

导航栏:

import React, { useState } from "react";
import AppBar from "@mui/material/AppBar";
import Toolbar from "@mui/material/Toolbar";
import Button from "@mui/material/Button";
import { Link, useLocation } from "react-router-dom";
import HistoryDrawer from "./HistoryDrawer";

const Navbar = () => {
  const [openDrawer, setOpenDrawer] = useState(false);
  const location = useLocation();

  const toggleDrawer = () => {
    setOpenDrawer(!openDrawer);
  };
  return (
    <React.Fragment>
      <AppBar position="static">
        <Toolbar>
          <Button
            color="inherit"
            component={Link}
            to="/"
            selected={location.pathname === "/"}
          >
            Home
          </Button>
          <Button
            color="inherit"
            component={Link}
            to="/blog"
            selected={location.pathname === "/blog"}
          >
            Blog
          </Button>
          <Button
            color="inherit"
            component={Link}
            to="/team"
            selected={location.pathname === "/team"}
          >
            Team
          </Button>
          <Button
            edge="start"
            color="inherit"
            aria-label="menu"
            onClick={toggleDrawer}
          >
            History
          </Button>
        </Toolbar>
      </AppBar>
      <HistoryDrawer toggleDrawer={toggleDrawer} openDrawer={openDrawer}/>
    </React.Fragment>
  );
};

export default Navbar;

推荐答案

我看到的唯一问题/差异是,Route组件的elementprops 需要ReactNode类型,而不是ReactElement类型.换句话说,element拿下了JSX.我将假设BlogHomeTeam的默认导出/导入是正确的,但如果它们中的任何一个有问题,请判断它们是否也都是从各自的文件默认导出的.

您可以使用JSX通过routes:

import Blog from "./pages/Blog";
import Home from "./pages/Home";
import Team from "./pages/Team";

const routes = [
  { path: '/', component: <Home />, },
  { path: '/blog', component: <Blog /> },
  { path: '/team', component: <Team /> },
];

或在映射时渲染为JSX:

const App = () => {
  return (
    <Router>
      <Navbar />
      <div className="container mt-4">
        <Routes>
          {routes.map((route) => {
            const Component = route.component;
            return (
              <Route
                key={route.path}
                path={route.path}
                element={<Component />}
              />
            );
          })}
        </Routes>
      </div>
    </Router>
  );
};

您还可以通过使用RouteObject类型来简化routes代码:

import Blog from "./pages/Blog";
import Home from "./pages/Home";
import Team from "./pages/Team";

const routes = [
  { path: '/', elememt: <Home />, },
  { path: '/blog', element: <Blog /> },
  { path: '/team', element: <Team /> },
];
const App = () => {
  return (
    <Router>
      <Navbar />
      <div className="container mt-4">
        <Routes>
          {routes.map((route, index) => (
            <Route key={index} {...route} />
          ))}
        </Routes>
      </div>
    </Router>
  );
};

或者使用useRoutes挂钩:

import React from 'react';
import { BrowserRouter as Router, useRoutes } from 'react-router-dom';
import Navbar from './components/Navbar';
import routes from './routes';

const App = () => {
  const appRoutes = useRoutes(routes);
  return (
    <Router>
      <Navbar />
      <div className="container mt-4">
        {appRoutes}
      </div>
    </Router>
  );
};

Javascript相关问答推荐

如何解决这个未能在响应上执行json:body stream已读问题?

使用续集和下拉栏显示模型属性

如何粗体匹配的字母时输入搜索框使用javascript?

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

如何使onPaste事件与可拖动的HTML元素一起工作?

如何在文本字段中输入变量?

Next.js服务器端组件请求,如何发送我的cookie token?

类构造函数不能在没有用With Router包装的情况下调用

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

为什么JPG图像不能在VITE中导入以进行react ?

将异步回调转换为异步生成器模式

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

ngOnChanges仅在第二次调用时才触发

FireBase FiRestore安全规则-嵌套对象的MapDiff

在JavaScript中将Base64转换为JSON

设置复选框根据选中状态输入选中值

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

需要从对象生成列表

在不使用AJAX的情况下将JavaScript数组值传递给Laravel控制器?

如何根据获取的对象数量动态生成状态变量