当前位置: 首页 > 知识库问答 >
问题:

材料UI的选项卡与反应路由器4集成?

弓华茂
2023-03-14

新的react路由器语法使用链接组件在路由中移动。但如何将其与材质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>
    )
  }
}

但是当它呈现时,材料UI抛出一个错误,即Tabs的子元素必须是Tab组件。有什么方法可以继续下去?如何管理选项卡的isActive道具?

提前感谢


共有3个答案

梁和颂
2023-03-14

您在material ui中看到的错误是因为它希望有一个

现在,我找到了一种将链接集成到中的方法

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>
        );
    }
}

要管理选项卡的“活动”属性,可以使用

漆雕嘉平
2023-03-14

我的讲师帮助我使用React路由器4.0的with路由器来包装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)  

只需将BrowserRouter添加到index.js即可。

贺光华
2023-03-14

另一个解决方案(https://codesandbox.io/s/l4yo482pll)没有处理程序也没有HOC,只有纯react路由器和材质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);
 类似资料:
  • 嗨,我是一个新的材料设计,我试图使卡片部分响应媒体查询和Flex。由于某种原因,当卡片切换到列时,只显示图像的一部分,而卡片的其余部分(如文本)不再显示。我发现让组件响应非常混乱。我是不是漏掉了什么?

  • 问题内容: 我想在我的项目中使用AngularJS UI Bootstrap Tabs,但是我需要它来支持路由。 例如: 据我从源代码可以看出,current 和指令不支持路由。 添加路由的最佳方法是什么? 问题答案: 要添加路由,通常使用ng- view指令。我不确定修改角度UI以支持您要查找的内容是否足够容易,但这是一个大致显示我认为您要查找的内容(这不一定是最好的方式- 希望有人可以提供为您

  • 有件事让我发疯,我需要你的帮助。基本上,当用户单击“我的配置文件”时,我想重定向到用户的配置文件。为此,我使用以下代码段 这应该行得通。但是,尽管当单击我的个人资料时,网址会更改为正确的网址,但页面不会显示。它只是保持旧页面。 谷歌了一会儿,我知道这和redux有关...但是,我找不到解决方案。(this.props.userid来自Layout组件,而Layout组件又从redux商店获取) 这

  • 问题内容: 我在玩Material- ui。我使用路线实现了LeftNav,但找不到找到IconMenu或Menu来处理链接或路线的方法。任何人都可以为我指出一个好的资源/教程吗?该文档不足,并且两个组件似乎都不像LeftNav那样支持’menuItems’作为属性。 问题答案: 2016年12月编辑: 该道具已 弃用 ,您会收到警告: 因此,只需删除道具: 这是示例存储库,以及此处的实时演示。

  • 我试图创建一个符合以下所有URL的路由: 这是我目前的路线: 根据关于https://github.com/rackt/react-router/blob/master/docs/guides/basics/RouteMatching.md 此路由应该完全匹配,但与上面的URL都不匹配。 我需要做什么来支持这个可选参数? 我在React路由器版本0.13.3,如果我删除,那么我可以匹配第一个URL

  • 问题内容: 我需要react-router v2 +的帮助,例如,当路由更改时,我必须更改navbar的类,因为它将 尝试在navbar组件中使用,但它显示 希望你的帮助 问题答案: 您的组件(如您在问题中所描述的)可能不是路由组件,对吗?通过我的意思是你在使用一个被加载特定路由配置。 仅可通过此类访问,因此您需要将其传递给您。 让我们举个例子: 您的路由器配置: 路线部分: