Skip to content

路由嵌套

React Router 中,路由嵌套是指一个路由内部包含另一个路由,从而形成层次化的 URL 结构。这种结构对于构建复杂的应用程序非常有用,因为它可以帮助你组织页面和组件之间的关系,并且保持 URL 的语义化。

React Router v5 版本的嵌套路由

v5 中,实现嵌套路由的方式是通过将子路由定义为父级路由组件的一部分。你可以直接在父组件中使用 <Route> 来定义子路由,或者通过渲染一个包含子路由的布局组件来实现。

示例:简单的嵌套路由

jsx
import React from "react";
import { BrowserRouter as Router, Route, Switch, Link } from "react-router-dom";

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

        <Switch>
          <Route path="/" exact component={Home} />
          <Route path="/users" component={Users} />
        </Switch>
      </div>
    </Router>
  );
}

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

// 父级路由组件
function Users({ match }) {
  return (
    <div>
      <h2>Users</h2>
      <ul>
        <li>
          <Link to={`${match.url}/1`}>User 1</Link>
        </li>
        <li>
          <Link to={`${match.url}/2`}>User 2</Link>
        </li>
      </ul>

      {/* 子路由 */}
      <Switch>
        <Route path={`${match.path}/:userId`} component={UserProfile} />
        <Route
          path={match.path}
          render={() => <h3>Please select a user.</h3>}
        />
      </Switch>
    </div>
  );
}

// 子路由组件
function UserProfile({ match }) {
  return <h3>User Profile: {match.params.userId}</h3>;
}

export default App;

在这个例子中,Users 组件既是父级路由组件,也负责渲染其子路由。它使用了 match.urlmatch.path 来构造子路由的路径。

React Router v6 版本的嵌套路由

v6 对嵌套路由的支持有所改进,使得代码更加简洁。v6 中不再需要显式的 Switch 组件,因为新的 <Routes> 组件会自动选择最匹配的路由。此外,v6 引入了 element 属性用于指定要渲染的组件,而不是使用 componentrender 函数。

示例:v6 的嵌套路由

jsx
import React from "react";
import { BrowserRouter as Router, Routes, Route, Link } from "react-router-dom";

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

        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="users" element={<Users />}>
            {/* 嵌套路由 */}
            <Route path=":userId" element={<UserProfile />} />
            <Route index element={<h3>Please select a user.</h3>} />
          </Route>
        </Routes>
      </div>
    </Router>
  );
}

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

// 父级路由组件
function Users() {
  return (
    <div>
      <h2>Users</h2>
      <ul>
        <li>
          <Link to="1">User 1</Link>
        </li>
        <li>
          <Link to="2">User 2</Link>
        </li>
      </ul>
    </div>
  );
}

// 子路由组件
function UserProfile({ params }) {
  const { userId } = params;
  return <h3>User Profile: {userId}</h3>;
}

export default App;

v6 中,<Route> 组件可以直接作为子元素嵌套在其他 <Route> 内部。如果一个路由有子路由,那么它的 element 属性应该是一个可以渲染这些子路由的组件。index 路由是新引入的概念,它表示当没有更具体的子路径匹配时,应该渲染的内容。

总结

无论是 React Router v5 还是 v6,嵌套路由都是创建复杂应用结构的重要工具。v5 通过父级组件中的 <Route> 定义子路由,而 v6 则简化了这一过程,允许直接嵌套 <Route> 并利用 element 属性和 index 路由提供更清晰的语法。

Released under the MIT License.