ReactJS: Cách so sánh React Router và Reach Router


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Cách so sánh React Router và Reach Router

Giới thiệu

Các giả của Reach Router là Ryan Florence. Nếu bạn nhận ra tên của anh ấy, đó là bởi vì anh ấy là đồng tác giả ban đầu của React Router, hiện là thư viện định tuyến phổ biến nhất.

Cả hai thư viện dường như có mục đích giống nhau để cung cấp một lớp định tuyến cho web. Tuy nhiên, Reach Router đang thực hiện một cách tiếp cận mới cho giải pháp và nó cũng đi kèm với khả năng truy cập (a11y) được tích hợp và hoạt động ngay.

Trong bài viết này, bạn sẽ so sánh React Router với Reach Router để hiểu rõ hơn về những gì mà mỗi thư viện hỗ trợ và cung cấp.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn sẽ cần:

So sánh thiết lập

Reach Router rất giống với React Router và sử dụng các không gian tên tương tự như <Router><Link>, v.v., nhưng có một số điểm khác biệt đáng chú ý. Hãy xem xét một thiết lập cơ bản cho cả hai react-router và reach-router.

Đầu tiên, thiết lập bằng 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 có component <Route> riêng của nó có hai prop: component và path.

Đây là cách thiết lập tương tự bằng cách sử dụng Reach Router:

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>
  );
}

Ấn tượng đầu tiên là nó trông thực sự sạch sẽ. Reach Router không có một component <Route> nào. Bạn chỉ cần sử dụng chính component đó (ví dụ <Dashboard>). Việc sử dụng JSX lồng nhau cho các đường dẫn con ( /dashboard/team) tự phân biệt với React Router.

Nhưng khoan đã… có điều gì đó kỳ lạ ở đây. Thoạt nhìn, bạn có thể nghĩ rằng route <Report> sẽ chặn được /dashboard/invoices và /dashboard/team, nhưng thực tế thì không!

Reach Router sử dụng hệ thống điểm để xếp hạng các định nghĩa route của bạn bằng cách xem xét giá trị path. Trong khi hai đường dẫn dường như va chạm, params (:reportId) và ký tự đại diện (*) có mức độ ưu tiên thấp, trong khi các đường dẫn rõ ràng (invoices và teams) có mức độ ưu tiên cao hơn. Điều này có nghĩa là điều hướng đến /dashboard/invoices thực sự hoạt động và /dashboard/example sẽ đi đến <Report>.

So sánh Params và Props

Bây giờ chúng ta đã khám phá thiết lập cơ bản, hãy khám phá cách bạn sẽ chuyển dữ liệu đến các route.

Đầu tiên là reportId và salesData với React Router:

React Router<Route
  path="/dashboard/:reportId"
  render={(props) => {
    return <Report {...props} salesData={true} />
  }}
/>

const Report = ({ props, match }) => {
  return (
    <h1>
      {match.params.reportId}  // "match" là từ react-router
      and
      {props.salesData}
    </h1>
  )
}

Có nhiều thứ liên quan đến React Router, nhưng đây là giá bình thường nếu bạn đã sử dụng nó trong bất kỳ khoảng thời gian nào.

Đây là ví dụ tương tự với Reach Router:

Reach Router<Report
  path="dashboard/:reportId"  // Các route static cũng làm việc
  salesData={this.state.salesData}
/>

const Report = (props) => {
  return (
    <h1>
      {props.reportId}
      and
      {props.salesData}
    </h1>
  )
}

Lưu ý cách reportId không yêu cầu match truy cập các tham số URL.

Tiếp theo, ta hãy xem cách thức <Link> hoạt động trong cả hai thư viện.

So sánh liên kết

Cả Reach Router và React Router đều xuất một component <Link>, nhưng có một số khác biệt. Hãy xem xét một component <Dashboard> có một số trang con.

Đầu tiên, với React Router:

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>
  );
}

Với React Router, bạn phải cụ thể với <Link> thường có nghĩa là bạn sẽ phải sử dụng match.url khi bạn có các đường dẫn con ngoài đường dẫn con gốc (ví dụ /host/path1/path2). Ngoài ra, lưu ý rằng bạn phải lập trình goBack vì không có tiện ích để điều hướng tương đối.

Đây là ví dụ tương tự với Reach Router:

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>
  )
}

Reach Router hỗ trợ các liên kết tương đối! Nó cũng hỗ trợ đầy đủ điều hướng thư mục Unix giống như các thẻ <a>.

Phần kết luận

Trong bài viết này, bạn đã so sánh React Router với Reach Router để hiểu rõ hơn về những gì mà mỗi thư viện hỗ trợ và cung cấp.

Dựa trên những so sánh này, Reach Router là một lựa chọn thay thế hấp dẫn cho React Router. Nhìn chung, nó thanh lịch hơn trong việc truyền tải thông tin khi đọc và viết mã. Điều này không có gì đáng ngạc nhiên vì Ryan Florence là đồng tác giả của cuốn sách react-router và hầu hết những hiểu biết khó khăn chỉ có thể có được nhờ thời gian và kinh nghiệm.

Hãy dùng thử Reach Router! Bản phát hành v1.0 đầu tiên là vào tháng 5 năm 2018.

» Tiếp: Cách bật tính năng kết xuất phía máy chủ cho ứng dụng React
« Trước: Cách thêm thẻ meta động vào ứng dụng React với react-snapshot kết hợp với react-helmet
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!