即使在使用exact之后,React Routing 仍然显示根组件

问题描述 投票:0回答:2

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

这是现场演示:https://codesandbox.io/s/vmz6zwq0k7

reactjs react-router-dom
2个回答
2
投票

Route 组件 的作用就像 URL 匹配时要呈现的组件的“占位符”。它上面的一切(父母和兄弟姐妹)都不会受到影响。

给出此代码示例:

  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
组件,您将失去导航链接。


0
投票

我在查看反应路由入门部分时遇到了同样的问题。 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>;
}
© www.soinside.com 2019 - 2024. All rights reserved.