Viblo CTF
+4

Routing trong Next.js

Trước đó bạn có thể đang tò mò về Next.js, vào đây luôn bạn ơi

(go)

1. How Routing works in Next.js

Next.js tự động xử lý tất cả các file với các đuôi .js, .jsx, .ts hoặc .tsx trong cây thư mục như một route.

Một trang trong Next.js là React componentroute dựa trên tên file của nó.

Hãy xem xét cấu trúc thư mục này như một ví dụ:

├── pages
|  ├── index.js
|  ├── contact.js
|  └── my-folder
|     ├── about.js
|     └── index.js

Đường dẫn tương ứng của 4 page:

index.js nhận url là http://localhost:3000

contact.js nhận url là http://localhost:3000/contact

my-folder/index.js là page sub-folder trong folder chính, nên nhận url http://localhost:3000/my-folder

my-folder/about.js tương tự, thì sẽ nhận url http://localhost:3000/my-folder/about

2. How to link between pages

Theo mặc định, Next.js pre-render mọi trang để làm cho ứng dụng của bạn nhanh và thân thiện với người dùng (tham khảo thêm).

Nó sử dụng Link component được cung cấp bởi next/link để cho phép chuyển đổi giữa các route.

import Link from "next/link"

export default function IndexPage() {
  return (
    <div>
      <Link href="/contact">
        <a>My second page</a>
      </Link>
      <Link href="/my-folder/about">
        <a>My third page</a>
      </Link>
    </div>
  )
}

Trên ví dụ trên, chúng ta hiện có 2 routes

/contact có url http://localhost:3000/contact

/about có url http://localhost:3000/my-folder/about

Link component có thể nhận một số thuộc tính, nhưng chỉ thuộc tính href là bắt buộc.

Ở đây, chúng ta sử dụng thẻ <a></a> làm thành phần con để liên kết các trang.

Ngoài ra, bạn có thể sử dụng bất kỳ phần tử nào hỗ trợ sự kiện onClick trên Link component

3. How to pass route parameters

Next.js cho phép bạn chuyển các params của route và sau đó lấy lại dữ liệu bằng cách sử dụng hook useRouter hoặc getInitialProps.

Nó cung cấp cho bạn quyền truy cập vào route object có chứa các params.

index.js

import Link from "next/link"

export default function IndexPage() {
  return (
    <Link
      href={{
        pathname: "/about",
        query: { id: "test" },
      }}
    >
      <a>About page</a>
    </Link>
  )
}

Như bạn có thể thấy ở đây, thay vì nhập string cho thuộc tính href, chúng ta truyền vào một object có chứa thuộc tính pathname.

Đây cũng chính là route, cùng với params truy vấn (query) chứa dữ liệu ({ id: "test"}).

# about.js

import { useRouter } from "next/router"

export default function AboutPage() {
  const router = useRouter()
  const {
    query: { id },
  } = router
  return <div>About us: {id}</div>
}

Ở đây, chúng tôi import hook useRouter để lấy dữ liệu được truyền vào.

Tiếp theo, chúng tôi lấy dữ liệu đó từ query object bằng cách sử dụng destructuring (tham khảo thêm).

Nếu bạn đang sử dụng server-side rendering, bạn nên sử dụng getInitialProps để lấy dữ liệu.

export default function AboutPage({ id }) {
  return <div>About us: {id}</div>
}

AboutPage.getInitialProps = ({ query: { id } }) => {
  return { id }
}

3. Dynamic routes

Next.js cho phép bạn xác định các route động trong ứng dụng của mình bằng cách sử dụng dấu ngoặc vuông ([param]).

Thay vì đặt tên tĩnh trên các trang của mình, bạn có thể sử dụng tên động.

Ví dụ:

├── pages
|  ├── index.js
|  ├── [slug].js
|  └── my-folder
|     ├── [id].js
|     └── index.js

Next.js sẽ lấy các route params được truyền vào và sau đó sử dụng nó làm tên cho route đó

# index.js

export default function IndexPage() {
  return (
    <ul>
      <li>
        <Link href="/">
          <a>Home</a>
        </Link>
      </li>
      <li>
        <Link href="/[slug]" as="/my-slug">
          <a>First Route</a>
        </Link>
      </li>
      <li>
        <Link href="/my-folder/[id]" as="/my-folder/my-id">
          <a>Second Route</a>
        </Link>
      </li>
    </ul>
  )
}

Ở đây, chúng ta phải xác định giá trị trên thuộc tính as vì đường dẫn là động.

Tên của route sẽ là bất cứ điều gì bạn đặt trên as prop.

# [slug].js

import { useRouter } from "next/router"

export default function DynamicPage() {
  const router = useRouter()
  const {
    query: { id },
  } = router
  return <div>The dynamic route is {id}</div>
}

Bạn cũng có thể lấy các route params bằng hook useRouter trên client hoặc getInitialProps trên server.

# my-folder/[id].js

export default function MyDynamicPage({ example }) {
  return <div>My example is {example}</div>
}

MyDynamicPage.getInitialProps = ({ query: { example } }) => {
  return { example }
}

Ở ví dụ trên, chúng ta đã sử dụng getInitialProps để lấy route động.

4. Dynamic nested routes

Với Next.js, bạn cũng có thể có route động lồng nhau (nested) cùng với các bằng dấu ngoặc vuông ([param])

Hãy xem xét cấu trúc thư mục này:

├── pages
|  ├── index.js
|  └── [dynamic]
|     └── [id].js
# index.js

export default function IndexPage() {
  return (
    <ul>
      <li>
        <Link href="/">
          <a>Home</a>
        </Link>
      </li>
      <li>
        <Link href="/[dynamic]/[id]" as="/my-folder/my-id">
          <a>Dynamic nested Route</a>
        </Link>
      </li>
    </ul>
  )
}

Như bạn có thể thấy ở đây, chúng ta đặt các giá trị động vào thuộc tính as như đã làm trong ví dụ trước.

Nhưng lần này, chúng ta phải xác định tên của folderfile của nó.

import { useRouter } from "next/router"

export default function DynamicPage() {
  const router = useRouter()
  const {
    query: { dynamic, id },
  } = router
  return (
    <div>
      Data: {dynamic} - {id}
    </div>
  )
}

Cuối cùng, như các ví dụ trên, để lấy ra các query object, chúng ta sử dụng hook useRouter.

5. Kết luận

Trên là những tìm hiểu của mình về route trong Next.js, hi vọng giúp ích được cho mọi người

Thanks for watching !!!

6. Tài liệu tham khảo

Object and array destructuring

Next.js pre-render

Tại sao bạn nên tìm hiểu Next.js

Next routing

Next route for beginer


All Rights Reserved