我在Reactjs +类型脚本中有简单的应用程序。 我试图使用react-router-dom中的BrowserRouter。
这是我的代码:
import * as React from "react"
import { Popular } from "./popular"
import { BrowserRouter as Router, Route } from "react-router-dom"
export interface AppProp {
}
export interface AppState {
}
export class App extends React.Component<AppProp , AppState > {
render() {
return (
<div className='container'>
<Router>
<Route path='/popular' component={Popular} />
</Router>
</div>
)
}
}
export default App
我发现了以下错误:
[at-loader]中的错误./node_modules/@types/react-router-dom/index.d.ts:55:25 TS2314:通用类型&#39;组件&#39;需要2个类型的参数。
[at-loader]中的错误./src/components/app.tsx:25:18 TS2604:JSX元素类型&#39;路由器&#39;没有任何构造或呼叫签名。
我在谷歌搜索但没有任何帮助。
有人有想法吗?BR Nadav
答案 0 :(得分:0)
似乎是打字问题,
如果您使用的是TypeScript 2.4.1,请确保使用的是@types的那些版本。
"@types/react": "15.0.35",
"@types/react-dom": "15.5.1",
答案 1 :(得分:0)
我能够使用带有Typescript的BrowserRouter,并且能够将历史道具和redux道具/ thunk传递给组件。关键是在应用程序级别使用“ withRouter”。我还必须将render属性与“ Route”一起使用才能放下道具。现在,我可以在我的组件以及道具和thunk中使用“ this.props.history.push(“ / url1”)“和” this.props.history.replace(“ / url2”)“。也是传播符号的岩石。
import { RouteComponentProps, withRouter,
Switch, Route, Redirect } from 'react-router-dom'
interface AppProps {
children?: any
myAppStore: any
myAppActions: any
};
class App extends React.Component<RouteComponentProps<{}> & AppProps>
{
constructor(props: RouteComponentProps<{}> & AppProps) {
super(props);
}
render() {
return (
<div className="App">
<AppNavBar {...this.props}/>
<Switch>
// This component gets both Router props and my props
<Route path="/c1" default={true} exact={true} render={()=>{return(
<MyComponentOne {...this.props}/>)} } />
// This component only gets Router props
<Route path="/c2" {...this.props} exact={true} component={MyComponentTwo } />
</Switch>
<Redirect from="/" to="/c1"/>
</div>
);
}
}
... Do redux stuff ..
// ApplicationProps and ApplicationActions are mapped redux props and thunks.
const connector = connect(ApplicationProps,ApplicationActions);
export default connector<any>(withRouter(App));
这是我的index.tsx渲染
<Provider store={MyStore}>
<BrowserRouter basename="/">
<App/>
</BrowserRouter>
</Provider>