Dan*_*mos 29 material-ui react-router-v4
新的反应转子语法使用该Link组件在路径上移动.但是如何与它结合materiaul-ui?
就我而言,我使用制表符作为主导航系统,所以理论上我应该有这样的东西:
const TabLink = ({ onClick, href, isActive, label }) =>
<Tab
label={label}
onActive={onClick}
/>
export default class NavBar extends React.Component {
render () {
return (
<Tabs>
<Link to="/">{params => <TabLink label="Home" {...params}/>}</Link>
<Link to="/shop">{params => <TabLink label="shop" {...params}/>}</Link>
<Link to="/gallery">{params => <TabLink label="gallery" {...params}/>}</Link>
</Tabs>
)
}
}
Run Code Online (Sandbox Code Playgroud)
但是当它呈现时,material-ui会抛出一个错误,即孩子Tabs必须是一个Tab组件.有什么办法可以继续?如何管理选项卡的isActive道具?
提前致谢
Gil*_*cia 41
另一个没有处理程序或HOC的解决方案(https://codesandbox.io/s/l4yo482pll),只有纯粹的react-router和material-ui组件:
import React, { Fragment } from "react";
import ReactDOM from "react-dom";
import Tabs from "@material-ui/core/Tabs";
import Tab from "@material-ui/core/Tab";
import { Switch, Route, Link, BrowserRouter, Redirect } from "react-router-dom";
function App() {
const allTabs = ['/', '/tab2', '/tab3'];
return (
<BrowserRouter>
<div className="App">
<Route
path="/"
render={({ location }) => (
<Fragment>
<Tabs value={location.pathname}>
<Tab label="Item One" value="/" component={Link} to={allTabs[0]} />
<Tab label="Item Two" value="/tab2" component={Link} to={allTabs[1]} />
<Tab
value="/tab3"
label="Item Three"
component={Link}
to={allTabs[2]}
/>
</Tabs>
<Switch>
<Route path={allTabs[1]} render={() => <div>Tab 2</div>} />
<Route path={allTabs[2]} render={() => <div>Tab 3</div>} />
<Route path={allTabs[0]} render={() => <div>Tab 1</div>} />
</Switch>
</Fragment>
)}
/>
</div>
</BrowserRouter>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Run Code Online (Sandbox Code Playgroud)
小智 12
我的讲师帮助我使用React Router 4.0的withRouter来包装Tabs组件以启用历史方法,如下所示:
import React, {Component} from "react";
import {Tabs, Tab} from 'material-ui';
import { withRouter } from "react-router-dom";
import Home from "./Home";
import Portfolio from "./Portfolio";
class NavTabs extends Component {
handleCallToRouter = (value) => {
this.props.history.push(value);
}
render () {
return (
<Tabs
value={this.props.history.location.pathname}
onChange={this.handleCallToRouter}
>
<Tab
label="Home"
value="/"
>
<div>
<Home />
</div>
</Tab>
<Tab
label="Portfolio"
value="/portfolio"
>
<div>
<Portfolio />
</div>
</Tab>
</Tabs>
)
}
}
export default withRouter(NavTabs)
Run Code Online (Sandbox Code Playgroud)
只需将BrowserRouter添加到index.js就可以了.
您从 material-ui 中看到的错误是因为它希望将<Tab>组件呈现为组件的直接子级<Tabs>。
现在,我发现了一种将链接集成到<Tabs>组件中而不会丢失样式的方法:
import React, {Component} from 'react';
import {Tabs, Tab} from 'material-ui/Tabs';
import {Link} from 'react-router-dom';
export default class MyComponent extends Component {
render() {
const {location} = this.props;
const {pathname} = location;
return (
<Tabs value={pathname}>
<Tab label="First tab" containerElement={<Link to="/my-firs-tab-view" />} value="/my-firs-tab-view">
{/* insert your component to be rendered inside the tab here */}
</Tab>
<Tab label="Second tab" containerElement={<Link to="/my-second-tab-view" />} value="/my-second-tab-view">
{/* insert your component to be rendered inside the tab here */}
</Tab>
</Tabs>
);
}
}
Run Code Online (Sandbox Code Playgroud)
要管理选项卡的“活动”属性,您可以value在<Tabs>组件中使用该属性,并且您还需要value为每个选项卡设置一个属性,因此当两个属性匹配时,它会将活动样式应用于该选项卡。
| 归档时间: |
|
| 查看次数: |
10468 次 |
| 最近记录: |