ค้นหาเว็บไซต์

reactjs - การเพิ่มเส้นทางแบบไดนามิกทำให้เกิดข้อผิดพลาดกับ typescript


ฉันได้รับข้อผิดพลาดดังต่อไปนี้เมื่อพยายามโหลด route แบบไดนามิก

  return (
TS2739: Type '{ children: Element[]; }' is missing the following properties from type 'RouterProps': location, navigator
     8 |     <BrowserRouter>
  >  9 |       <Router>
       |        ^^^^^^
    10 |         {allModules.map((m: ModuleProps) => {
    11 |           return <Route path={m.routeProps.path} element={m.routeProps.element} key={m.name} />;
    12 |         })}

ประเภทพร็อพ:

export interface ModuleProps {
  name: string;
  routeProps: { path: string; element: React.ReactElement };
}

หน้า :

import { FC } from 'react';

const Login: FC = () => {
  return <div>Login</div>;
};

export default {
  name: 'Login',
  routeProps: { path: '/login', element: <Login /> },
};

โมดูล :

import LoginModule from './login';

export default [LoginModule];

แอป :

import { ModuleProps } from '@stonehenge-props/api-interfaces';
import { FC } from 'react';
import { BrowserRouter, Route, Router, RouterProps } from 'react-router-dom';
import allModules from './modules';

export const App: FC<RouterProps> = () => {
  return (
    <BrowserRouter>
      <Router>
        {allModules.map((m: ModuleProps) => {
          return <Route path={m.routeProps.path} element={m.routeProps.element} key={m.name} />;
        })}
      </Router>
    </BrowserRouter>
  );
};

export default App;

ดัชนี :

import { StrictMode } from 'react';
import * as ReactDOMClient from 'react-dom/client';

import App from './app/app';

const root = ReactDOMClient.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <StrictMode>
    <App />
  </StrictMode>
);

คำตอบ #1

คอมโพเนนต์ Router ระดับต่ำมี props บางตัวที่ไม่สามารถละเว้นได้ซึ่งจำเป็นต้องส่งเข้าไป แต่คุณน่าจะต้องการนำเข้าและเรนเดอร์ Routes แทนการใช้คอมโพเนนต์ Router อีกตัว

นอกจากนี้ เนื่องจาก App ไม่ได้ใช้ props ใด ๆ จึงไม่จำเป็นต้องประกาศ props เหล่านั้นใน typing ของฟังก์ชัน ลบ RouterProps ออกจากการประกาศ ใช้ const App: React.FC<{}> =() => {} หรือเพียงแค่ const App =() => {}

import { BrowserRouter, Route, Routes } from 'react-router-dom';
import allModules from './modules';

export const App: FC<{}> = () => {
  return (
    <BrowserRouter>
      <Routes>
        {allModules.map((m: ModuleProps) => {
          return (
            <Route
              path={m.routeProps.path}
              element={m.routeProps.element}
              key={m.name}
            />
          );
        })}
      </Routes>
    </BrowserRouter>
  );
};