键入 React Router 路由器组件?使困惑

Posted

技术标签:

【中文标题】键入 React Router 路由器组件?使困惑【英文标题】:Typing React Router Router Component? Confused 【发布时间】:2018-04-10 07:22:36 【问题描述】:

我没有使用过 React Router v4,所以我可能会犯一些新手错误。我的问题是 Typescript 编译正在打破我看到的一个错误,我猜可能有一个在我没有看到的引擎盖下返回的类?

代码::

import * as React from 'react';
import  Router, RouteComponentProps  from 'react-router-dom';
import HomeRoute from './home';
import PhotosRoute from './photos';
import StoreRoute from './store';
import TourRoute from './tour';
import 'index.css';

interface RouterProps 
  component?: React.SFC<RouteComponentProps<any> | void> | React.ComponentClass<RouteComponentProps<any> | void>;


class Navigation extends React.Component<RouterProps, > 
  render(): JSX.Element 
    return (
       <Router>
        <div>
          <ul className="nav-styles">
           <li>
               <HomeRoute />
            </li>
            <li>
               <PhotosRoute />
            </li>
            <li>
               <StoreRoute />
            </li>
            <li>
                <TourRoute />
            </li>
          </ul>
        </div>
      </Router>
    );
  


export default Navigation;

错误::

(16,8): error TS2322: Type ' children: Element; ' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<Router> & Readonly< children?: ReactNode; > & Re...'.
  Type ' children: Element; ' is not assignable to type 'Readonly<RouterProps>'.
    Property 'history' is missing in type ' children: Element; '.

如果我做错了什么或有人希望看到它,这里是HomeRoute 的示例。不过,目前我认为这不是重大问题。

import * as React from 'react';
import  Route, Link  from 'react-router-dom';
import Home from '../Home/Home';

export default (): JSX.Element => (
  <div>
    <nav>
      <Link to="/">Home</Link>
    </nav>
    <div>
      <Route path="/" component= Home  />
    </div>
  </div>
);

我知道我需要以某种方式键入该类,但我一直在尝试但无法找到一个好的参考或如何键入 Navigation 类。

【问题讨论】:

【参考方案1】:

我认为您忘记将历史记录添加到您的 &lt;Router /&gt; 元素中。

你可以试试:

import  createBrowserHistory  from 'history';

[...]

const history = createBrowserHistory();

[...]

class Navigation extends React.Component<RouterProps, > 
  render(): JSX.Element 
    return (
       <Router history=history>
        <div>
          <ul className="nav-styles">
          [...]
      </Router>
    );
  

【讨论】:

为了值得我修复它,但我一直忽略 tslint:disable 的历史错误,所以谢谢你安装这些类型。 @cheussy 你是怎么解决的? 或者您可以像这样导入它:import BrowserRouter as Router from 'react-router-dom'; 它将为您处理历史记录。【参考方案2】:

Router 是更高级别路由器[1] 的基本接口。它需要注入历史作为编译的道具。根据您的生产环境,我推荐使用BrowserRouterNativeRouter

https://reacttraining.com/react-router/web/api/Router1

【讨论】:

【参考方案3】:

按照 react-router 教程进行操作时,我犯了同样的“新手”错误:

import  Router  from 'react-router-dom';

...应该改为:

import  BrowserRouter as Router  from 'react-router-dom';

【讨论】:

以上是关于键入 React Router 路由器组件?使困惑的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-router-dom 在组件基础上键入 location.state 属性

使用 React Router 时无法访问 App 组件

React Router v4 重定向到当前页面,组件消失

使用具有不同片段字段的相同中继根查询的多个 react-router-relay 路由

React Router 基础组件一览

React-Router 路由到类组件