首页 > 解决方案 > Material UI Tab 将道具传递给组件

问题描述

我正在尝试将 react-router 与 Material-UI V1 Tabs 集成,就像在这个 github 问题这个 stackoverflow 帖子中一样,它们对我来说是错误的答案。

据我了解,这就是您应该执行的方式:

import Tab from '@material-ui/core/Tab';
import Link from 'react-router-dom';
/* other code */
<Tab component={Link} to="/" value={'/'} key={'/'} label={'/'}/>

但是我得到了错误[ts] property 'to' does not exist on type...

我也试过:

<Tab component={() => <Link to='/' />} value={'/'} key={'/'}] label={'/'}/>

但在这种情况下,我的Tab组件根本不渲染。

想法?

标签: reactjstypescriptreact-routermaterial-ui

解决方案


问题的根源是Tab类型是这样声明的:

declare const Tab: React.ComponentType<TabProps>;

TabProps当然没有to财产。

为了解决这个问题,声明一个名为的新变量LinkTab

const LinkTab: React.ComponentType<TabProps & LinkProps> = Tab as React.ComponentType<TabProps & LinkProps>;

并像下面这样使用它:

<LinkTab icon={<ListIcon />} component={Link} to="/monitor" />

这应该编译得很好。

带导入的完整代码示例:

import * as React from "react";
import * as ReactDOM from "react-dom";
import { MonitorContainer } from "Monitor/MonitorContainer";
import { HashRouter as Router, Route, Redirect, Switch, Link, LinkProps } from 'react-router-dom';
import { RemoteContainer } from "Remote/RemoteContainer";
import AppBar from '@material-ui/core/AppBar';
import Tabs from '@material-ui/core/Tabs';
import { default as Tab, TabProps } from '@material-ui/core/Tab';
import ListIcon from '@material-ui/icons/ListAlt';
import RemoteControlIcon from '@material-ui/icons/SettingsRemote';
import './reset.css';
import './index.scss';
import '../assets/fonts/icons/flaticon.css';

const LinkTab: React.ComponentType<TabProps & LinkProps> = Tab as React.ComponentType<TabProps & LinkProps>;

export interface AppState {
    value: number;
}

export class App extends React.Component<{}, AppState> {
    constructor(props: Readonly<{}>) {
        super(props);

        this.state = {
            value: 0,
        };
    }

    handleChange = (event: any, value: any) => {
        this.setState({ value });
    };

    render() {
        const { value } = this.state;

        return (
        <div>
            <AppBar position="static">
                <Tabs value={value} onChange={this.handleChange} scrollable scrollButtons="off">
                    <LinkTab icon={<ListIcon />} component={Link} to="/monitor" />
                    <LinkTab icon={<RemoteControlIcon />} component={Link} to="/remote" />
                </Tabs>
            </AppBar>
        </div>
        )
    }
};

ReactDOM.render(
    <Router>
        <div>
            <App />
            <Switch>
                <Route exact path="/monitor" component={ MonitorContainer } />
                <Route exact path="/remote" component={ RemoteContainer } />
                <Redirect from="/" to="/monitor" />
            </Switch>
        </div>
    </Router>,
    document.getElementById("root")
);

推荐阅读