Eva*_*kas 32 javascript reactjs react-router material-ui
我正在努力为<Link/>我的材料添加组件-ui AppBar
这是我的导航类:
class Navigation extends Component {
constructor(props) {
super(props)
}
render() {
var styles = {
appBar: {
flexWrap: 'wrap'
},
tabs: {
width: '100%'
}
}
return (
<AppBar showMenuIconButton={false} style={styles.appBar}>
<Tabs style={styles.tabs}>
<Tab label='Most popular ideas'/>
<Tab label='Latest ideas' />
<Tab label='My ideas' />
</Tabs>
</AppBar>
)
}
}
Run Code Online (Sandbox Code Playgroud)
标签是可点击的,有流畅的动画,这很酷.但是如何将它们react-router和它的<Link/>组件连接在一起?
我试过添加这样的onChange监听器:
<Tab
label='My ideas'
onChange={<Link to='/myPath'></Link>}
/>
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
Uncaught Invariant Violation: Expected onChange listener to be a function, instead got type object
Run Code Online (Sandbox Code Playgroud)
如果我尝试将<Tab/>组件包装到<Link/>组件中,我会收到<Tabs/>组件只接受<Tab/>组件的错误.
这也不起作用(没有产生错误,但点击Tab不会带我到路径):
<Tab label='Most popular ideas'>
<Link to='/popular'/>
</Tab>
Run Code Online (Sandbox Code Playgroud)
如何使<Link/>组件<Tabs>与<AppBar>?一起工作?如果那是不可能的,我可以使用material-ui库中的任何其他组件来形成适当的菜单.
haz*_*ous 43
对于带有Typescript的Material UI 1.0:请参阅@ogglas下面的这篇文章.
对于带有普通JS的Material-UI 1.0:
<Tabs value={value} onChange={this.handleChange}>
{
this.props.tabs.map(
({label, path})=><Tab key={label}
label={label}
className={classes.tabLink}
component={Link}
to={path} />
)
}
</Tabs>
Run Code Online (Sandbox Code Playgroud)
并classes.tabLink定义为:
tabLink : {
display:"flex",
alignItems:"center",
justifyContent:"center"
}
Run Code Online (Sandbox Code Playgroud)
所有mui 1.0组件继承自ButtonBase,支持componentprop,请参阅ButtonBase.我们的想法是允许您控制组件呈现为其包装器/根元素的内容.Tab也有这个功能,虽然在写这个答案时,这个道具没有明确记录,但作为Tab继承ButtonBase,它的所有道具都结转了(文件确实涵盖了这一点).
另一个特点ButtonBase是,未使用ButtonBase或继承组件的所有额外道具遍布指定的component.我们已经使用此行为通过给予控制来发送使用的to道具.您可以以相同的方式发送任何其他道具.请注意,这是两个明确的记载和.LinkTabButtonBaseTab
感谢@ josh-l要求添加.
hig*_*nce 29
这是你现在可以做到的:
<Tabs onChange={this.changeTab} value={value}>
<Tab value={0} label="first" containerElement={<Link to="/first"/>} />
<Tab value={1} label="second" containerElement={<Link to="/second"/>}/>
<Tab value={2} label="third" containerElement={<Link to="/third"/>} />
</Tabs>
Run Code Online (Sandbox Code Playgroud)
这是使用<Link />from material-ui 而不是直接使用<Link />or <NavLink />from react-router 来解决的。可以在此处的文档中找到相同的示例。
https://material-ui.com/components/links/
还<Button />标记有分量的道具来实现这一目标
<Button color="inherit" component={Link} to={"/logout"}>Logout</Button>
Run Code Online (Sandbox Code Playgroud)
可以在此处找到对此的广泛讨论
https://github.com/mui-org/material-ui/issues/850
由于我们使用的是TypeScript,因此无法使用@hazardous解决方案。这就是我们为material-ui v1.0.0-beta.16和实现路由的方式react-router 4.2.0。我们分裂的原因this.props.history.location.pathname是因为我们需要访问/renewals/123例如。如果我们不这样做,则会收到以下警告,并且没有选项卡显示为活动状态:Warning: Material-UI: the value provided '/renewals/123' is invalid
带有导入的完整代码:
import * as React from "react";
import * as ReactDOM from "react-dom";
import * as ReactRouter from "react-router";
import * as PropTypes from "prop-types";
import { Switch, Route, Redirect, Link } from "react-router-dom";
import { Cases } from './../Cases';
import { SidePane } from './../SidePane';
import { withStyles, WithStyles } from 'material-ui/styles';
import Paper from 'material-ui/Paper';
import Tabs, { Tab } from 'material-ui/Tabs';
import { withRouter } from "react-router-dom";
import Badge from 'material-ui/Badge';
import Grid from 'material-ui/Grid';
import { Theme } from 'material-ui/styles';
import SimpleLineIcons from '../../Shared/SimpleLineIcons'
interface IState {
userName: string;
}
interface IProps {
history?: any
}
const styles = (theme: Theme) => ({
root: theme.typography.display1,
badge: {
right: '-28px',
color: theme.palette.common.white,
},
imageStyle:{
float: 'left',
height: '40px',
paddingTop: '10px'
},
myAccount: {
float: 'right'
},
topMenuAccount: {
marginLeft: '0.5em',
cursor: 'pointer'
}
});
type WithStyleProps = 'root' | 'badge' | 'imageStyle' | 'myAccount' | 'topMenuAccount';
class Menu extends React.Component<IProps & WithStyles<WithStyleProps>, IState> {
constructor(props: IProps & WithStyles<WithStyleProps>) {
super(props);
this.state = {
userName: localStorage.userName ? 'userName ' + localStorage.userName : ""
}
}
componentDidMount() {
this.setState({ userName: localStorage.userName ? localStorage.userName : "" })
}
logout(event: any) {
localStorage.removeItem('token');
window.location.href = "/"
}
handleChange = (event: any, value: any) => {
this.props.history.push(value);
};
render() {
const classes = this.props.classes;
let route = '/' + this.props.history.location.pathname.split('/')[1];
return (
<div>
<Grid container spacing={24}>
<Grid item xs={12} className={classes.root}>
<img src="/Features/Client/Menu/logo.png" alt="Logo" className={classes.imageStyle} />
<div className={this.props.classes.myAccount}>
<span><span className={this.props.classes.topMenuAccount}>MY ACCOUNT</span><span className={classes.topMenuAccount}><SimpleLineIcons iconName={'user'} />▾</span></span>
<span onClick={this.logout} className={classes.topMenuAccount}><SimpleLineIcons iconName={'logout'} /></span>
</div>
</Grid>
<Grid item xs={12} >
<div className="route-list">
<Tabs
value={route}
onChange={this.handleChange}
indicatorColor="primary"
textColor="primary"
>
<Tab label="Overview" value="/" />
<Tab label={<Badge classes={{ badge: classes.badge }} badgeContent={this.props.caseRenewalCount} color="primary">
Renewals
</Badge>} value="/renewals" />
</Tabs>
</div>
</Grid>
</Grid>
</div>
);
}
}
export default withStyles(styles)(withRouter(Menu))
Run Code Online (Sandbox Code Playgroud)
您可以尝试这种简单的方法
<Tab label='Most popular ideas' to='/myPath' component={Link} />
Run Code Online (Sandbox Code Playgroud)
小智 5
对于那些寻找 TypeScript 实现的人。易于配置。由tabs配置驱动。
interface ITabsPageProps {
match: match<{page: string}>;
history: History;
}
const tabs = [{
label: 'Fist Tab',
link: 'fist-tab',
component: <FirstTabContent/>
}, {
label: 'Second Tab',
link: 'second-tab',
component: <SecondTabContent/>
}, {
label: 'Third Tab',
link: 'third-tab',
component: <ThirdTabContent/>
}];
export class TabsPage extends React.Component<ITabsPageProps> {
handleChange(tabLink: string) {
this.props.history.push(`/tabs-page/${tabLink}`);
}
render() {
const currentTab = this.props.match.params.page;
const selectedTab = tabs.find(tab => currentTab === tab.link);
return (
<Fragment>
<Tabs
value={currentTab}
onChange={(event, value) => this.handleChange(value)}
>
{tabs.map(tab => (
<Tab
key={tab.link}
value={tab.link}
label={tab.label}
/>
))}
</Tabs>
{selectedTab && selectedTab.component}
</Fragment>
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39401 次 |
| 最近记录: |