介绍
Reach Router 由 Ryan Florence 创作。 如果你认出他的名字,那是因为他是 React Router 的原始合著者,这是目前最流行的路由库。
这两个库似乎具有相同的目的,即为 Web 提供路由层。 然而,Reach Router 采用了一种全新的解决方案,它还内置了可访问性 (a11y) 和开箱即用的功能。
警告:自最初发布以来,已经宣布React Router将采用Reach Router的许多特性。 您应该参考“我今天应该选择哪个项目?” 部分满足您的项目需求。
在本文中,您将比较 React Router 和 Reach Router,以便更好地了解每个库支持和提供的内容。
先决条件
要学习本教程,您需要:
- 对 React 有一定的了解。 你可以阅读我们的 如何在 React.js 系列中编码。
- 熟悉 React Router 约定。 你可以阅读我们的 React 路由器概述 。
比较设置
Reach Router 与 React Router 非常相似,并使用类似的命名空间,如 <Router>
、<Link>
等,但有一些值得注意的区别。 让我们考虑一下 react-router
和 reach-router
的基本设置。
首先,使用 React Router 进行设置:
React Routerimport React from "react"; import { BrowserRouter as Router, Route } from "react-router-dom"; const App = () => { return ( <Router> <div> <h1>Global Party Supplies, Inc</h1> // PATHS <Route component={Home} path="/" exact/> // "/" <Route component={About} path="/about"/> // "/about" <Route component={Support} path="/support"/> // "/support" <Route component={Dashboard} path="/dashboard"/> // "/dashboard" <Route component={Invoices} path="/dashboard/invoices"/> // "/dashboard/invoices" <Route component={Team} path="/dashboard/team"/> // "/dashboard/team" <Route component={Report} path="/dashboard/:reportId"/> // "/dashboard/:reportId" </div> </Router> ); }
React Router 有自己的 <Route>
组件,它采用两个 props:component
和 path
。
这是使用到达路由器的相同设置:
Reach Routerimport React from "react"; import { Router } from "@reach/router"; const App = () => { return ( <div> <h1>Global Party Supplies, Inc</h1> <Router> // PATHS <Home path="/"/> // "/" <About path="about"/> // "/about" <Support path="support"/> // "/support" <Dashboard path="dashboard"> // "/dashboard" <Report path=":reportId"/> // "/dashboard/:reportId" <Invoices path="invoices"/> // "/dashboard/invoices" <Team path="team"/> // "/dashboard/team" </Dashboard> </Router> </div> ); }
第一印象是这看起来真的很干净。 到达路由器没有 <Route>
组件。 您只需使用组件本身(例如,<Dashboard>
)! 使用嵌套 JSX 作为子路径 (/dashboard/team
) 与 React Router 不同。
但是等等……这里有一些奇怪的东西。 乍一看,您可能认为 <Report>
路由会拦截 /dashboard/invoices
和 /dashboard/team
,但实际上并非如此!
Reach Router 使用 点系统 通过查看 path
值对您的路线定义进行排名。 当两条路径似乎发生冲突时,参数 (:reportId
) 和通配符 (*
) 获得低优先级,而显式路径 (invoices
和 teams
) 获得更高的优先级。 这意味着导航到 /dashboard/invoices
确实有效,并且 /dashboard/example
转到 <Report>
。
比较参数和道具
现在我们已经探索了基本设置,让我们探索如何将数据传递给路由。
首先,使用 React Router 的 reportId
和 salesData
:
React Router<Route path="/dashboard/:reportId" render={(props) => { return <Report {...props} salesData={true} /> }} /> const Report = ({ props, match }) => { return ( <h1> {match.params.reportId} // "match" is from react-router and {props.salesData} </h1> ) }
React Router 涉及的东西更多,但如果你已经使用它一段时间,这是正常的费用。
这是到达路由器的相同示例:
Reach Router<Report path="dashboard/:reportId" // static routes work too :) salesData={this.state.salesData} /> const Report = (props) => { return ( <h1> {props.reportId} and {props.salesData} </h1> ) }
请注意 reportId
如何不需要 match
来访问 URL 参数。
接下来,让我们研究一下 <Link>
ing 在这两个库中是如何工作的。
比较链接
Reach Router 和 React Router 都导出了一个 <Link>
组件,但是有一些区别。 让我们考虑一个有几个子页面的 <Dashboard>
组件。
首先,使用 React 路由器:
React Routerimport { Link } from "react-router-dom"; const Dashboard = ({ match, history }) => { return ( <div> <div> <Link to={`${match.url}/invoices`}>Invoices</Link> <Link to={`${match.url}/team`}>Team</Link> </div> <!-- content --> <div> <Link to="/">Home</Link> <Link to="/about">About</Link> <Link to="/support">Support</Link> <a onClick={history.goBack}>Go Back</a> </div> </div> ); }
使用 React Router,你必须指定 <Link>
,这通常意味着当你有超出根子路径的子路径(例如,/host/path1/path2
)时,你必须使用 match.url
。 另外,请注意您必须以编程方式 goBack
因为没有用于相对导航的实用程序。
这是到达路由器的相同示例:
Reach Routerimport { Link } from "@reach/router"; const Dashboard = () => { return ( <div> <div> <Link to="invoices">Invoices</Link> <Link to="team">Team</Link> </div> <!-- content --> <div> <Link to="/">Home</Link> <Link to="/about">About</Link> <Link to="/support">Support</Link> <Link to="../">Go Back</Link> </div> </div> ) }
到达路由器支持相对链接! 它还完全支持像 <a>
标签那样的 Unix 目录导航。
结论
在本文中,您将 React Router 与 Reach Router 进行了比较,以便更好地了解每个库支持和提供的内容。
基于这些比较,Reach Router 是 React Router 的一个非常诱人的替代品。 总体而言,在读写代码时,它在传达信息方面更加优雅。 这不应该让人感到意外,因为 Ryan Florence 是 react-router
的合著者,大多数艰难的见解只能通过时间和经验获得。
试试 Reach 路由器吧! 第一个 v1.0 版本是在 2018 年 5 月发布的,GatsbyJS v2 已经 选择了 Reach Router 而不是 React Router。