即使使用精确后,React Routing仍显示根组件

时间:2018-11-02 19:17:46

标签: reactjs react-router-dom react-16

我仍然是React的新手。因此,在这里,我使用两条路径来渲染根组件:Home和About分别位于功能组件中:home.js和about.js。但是,即使在使用 exact 属性和 之后,根组件仍继续在上方进行渲染。当我重定向到任何提到的路由时,我仍然无法弄清楚如何不呈现根组件?

在此进行现场演示:https://codesandbox.io/s/vmz6zwq0k7

2 个答案:

答案 0 :(得分:1)

当URL匹配时,Route component充当要呈现的组件的“占位符”。上面的所有东西(父母和兄弟姐妹)都不会受到影响。

给出以下代码示例:

  render() {
    return (
      <BrowserRouter>
        <div className="App">
          <Link to="/home"> Home </Link>{" "}
          |
          <Link to="/about"> About Us </Link>{" "}
          <div>
            <Route exact path="/home" component={Home} />
            <Route exact path="/about" component={About} />
          </div>
        </div>
      </BrowserRouter>
    );
  }

这行代码:

<Route exact path="/home" component={Home} />

仅是Home组件的“占位符”。仅当path"/home"匹配时,它才呈现任何内容。

path匹配时,Route组件将呈现传递的组件,在这种情况下为Home组件。

这不会影响整个应用程序树,这是有充分理由的!
如果整个应用都将被重新渲染并替换为Home组件,则您将失去导航链接。

答案 1 :(得分:0)

我在这里查看 react-routing 入门部分时遇到了同样的问题。 https://reactrouter.com/web/guides/quick-start

我将 Router/BrowserRouter 放在我的 App 组件中。而是像这样将路由器放在 index.js 文件中

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import reportWebVitals from './reportWebVitals';
    import { BrowserRouter } from "react-router-dom";
    
    ReactDOM.render(
      <React.StrictMode>
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </React.StrictMode>,
      document.getElementById('root')
    );

然后你的应用组件看起来像这样,如果 about 或 users 匹配,根路由就不会匹配。

import React from "react";
import {
  Switch,
  Route,
  Link
} from "react-router-dom";

export default function App() {
  return (
      <div>
        <nav>
          <ul>
            <li>
              <Link to="/">Home</Link>
            </li>
            <li>
              <Link to="/about">About</Link>
            </li>
            <li>
              <Link to="/users">Users</Link>
            </li>
          </ul>
        </nav>

        {/* A <Switch> looks through its children <Route>s and
            renders the first one that matches the current URL. */}
        <Switch>
          <Route path="/about">
            <About />
          </Route>
          <Route path="/users">
            <Users />
          </Route>
          <Route path="/">
            <Home />
          </Route>
        </Switch>
      </div>
  );
}

function Home() {
  return <h2>Home</h2>;
}

function About() {
  return <h2>About</h2>;
}

function Users() {
  return <h2>Users</h2>;
}