【问题标题】:React router conditional反应路由器条件
【发布时间】:2021-09-28 20:07:18
【问题描述】:

我有多个路由器,我在index.js 中导入了Nav 组件,我只需要为About 显示Nav,但我不想为Topics 显示Nav 组件。我不想在HomeAbout 中导入Nav 组件,因为我可以有很多路由器

const BasicExample = () => (
  <Router>
    <div>
      <ul>
        <li>
          <Link to="/">Home</Link>
        </li>
        <li>
          <Link to="/about">About</Link>
        </li>
        <li>
          <Link to="/topics">Topics</Link>
        </li>
      </ul>
      <Nav />
      <hr />

      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
      <Route path="/topics" component={Topics} />
    </div>
  </Router>
);

你也可以看看完整的code in codesandbox

【问题讨论】:

    标签: reactjs react-router components router


    【解决方案1】:

    您可以创建一个 HOC 布局,该布局可以采用额外的道具 noNav 来隐藏您的导航:

    组件布局:

    import React from "react";
    import { Link } from "react-router-dom";
    import Nav from "../components/Nav/Nav";
    
    const Layout = ({ children, noNav }) => (
      <div>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about">About</Link>
          </li>
          <li>
            <Link to="/topics">Topics</Link>
          </li>
        </ul>
        {noNav ? null : <Nav />}
        <hr />
    
        {children}
      </div>
    );
    
    export default Layout;
    

    index.js

    import React from "react";
    import { render } from "react-dom";
    import { BrowserRouter as Router, Route } from "react-router-dom";
    import About from "./components/About";
    import Home from "./components/Home";
    import Topics from "./components/Topics";
    import Layout from "./hoc/Layout";
    
    const BasicExample = () => (
      <Router>
        <div>
          <Route
            exact
            path="/"
            render={() => (
              <Layout>
                <Home />
              </Layout>
            )}
          />
          <Route
            path="/about"
            render={() => (
              <Layout>
                <About />
              </Layout>
            )}
          />
          <Route
            path="/topics"
            render={(props) => (
              <Layout noNav>
                <Topics {...props} />
              </Layout>
            )}
          />
        </div>
      </Router>
    );
    
    render(<BasicExample />, document.getElementById("root"));
    

    演示:https://codesandbox.io/s/react-router-forked-k1ve2?file=/index.js:0-874

    【讨论】:

      【解决方案2】:

      您可以使用 windows.location.pathname 来识别正确的路径,然后如果您的路径与“/”完全匹配,则导航组件将被渲染或不渲染。可以使用三元运算符实现

      const BasicExample = () => (
        <Router>
          <div>
          <ul>
          <li>
          <Link to="/">Home</Link>
          </li>
          <li>
              <Link to="/about">About</Link>
              </li>
              <li>
                <Link to="/topics">Topics</Link>
              </li>
            </ul>
           {window.location.pathname === "/" ? <Nav /> :""}
            <hr />
      
            <Route exact path="/" component={Home} />
            <Route path="/about" component={About} />
            <Route path="/topics" component={Topics} />
          </div>
        </Router>
      );
      

      【讨论】:

      • 我得到一个错误,“windows is not defined”。
      • 我把windows换成了windows,但是这段代码不起作用
      • sry 伙计们它的 window.location.pathname 。但它对我有用!
      • 请在这种情况下向我提供您在 Codesandbox 中的示例代码
      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 2020-06-21
      • 1970-01-01
      • 2020-06-27
      • 2018-11-04
      • 2017-12-06
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多