Skip to content
On this page

Pages 頁面

說明

nuxt 中,只要在 /pages 資料夾,創建相關的 .vue 檔案(「烤肉串」命名為原則),就可以自動生成 routes, 再插入 <NuxtPage /> 供路由頁面顯示。

設置「首頁/」 、 「about 頁 /about

text
-| pages/
---| index.vue
---| about.vue

app.vue

vue
<template>
  <div>
    <NuxtPage />
  </div>
</template>

子層路由

若路由是有層級的,可以在 /pages 設置以「路由名稱」設置資料夾,再在其資料夾新增 .vue 檔案來顯示子層頁面。

層級設置

  • /product 頁面: ~/product/index.vue
  • /product/item 頁面: ~/product/item.vue
text
-| pages/
---| product 📂
-----| index.vue
-----| item.vue

多層級

  • /product/sport 頁面: ~/product/index.vue
  • /product/sport/item 頁面: ~/product/item.vue
text
-| pages/
---| product 📂
-----| index.vue
-----| item.vue
-------| sport 📂
---------| index.vue
---------| item.vue

動態路由

[] 來表示動態參數設置資料夾或 .vue 檔案名稱。

  • /data/:id 頁面: ~/data/[id].vue
  • /data/item-:id 頁面: ~/data/item-[id].vue
  • /product-:group/:id 頁面: ~/product-[group]/[id].vue
text
-| pages/
---| data 📂
-----| [id].vue
-----| item-[id].vue
---| product-[group] 📂
-----| [id].vue

取得動態參數

~/product-[group]/[id].vue

vue
<template>
  <div>
    <h1>Route.params.group: {{ $route.params.group }}</h1>
    <h1>Route.params.id: {{ $route.params.id }}</h1>
  </div>
</template>

<script setup>
const $route = useRoute()
</script>

補獲所有路由

/pages 下新增 [...slug].vue 可以用來匹配所有路由,當要 補獲不存在路由 時可以使用這個方式。

設置補獲

-| pages/
-----| [...slug].vue
vue
<template>
  <div>
    <h1>頁面不存在</h1>
    <p>當前路由: {{ $route.params }}</p>
  </div>
</template>

<script setup>
const $route = useRoute()
</script>

<style lang="scss" scoped></style>

頁面顯示

頁面不存在
當前路由: { "slug": [ "aaa", "bbb" ] }

提示

常用的 404 不存在畫面可以使用這個方法,並可以在 route.params.slug 中,取得補獲頁面的路由。

崁套路由

創建與路由資料夾 同名.vue 檔案,在其中插入 <NuxtPage /> 供顯示崁套的子層頁面,而 index.vue 就會是默認的 「根」頁面內容。

此時,頁面已經可以依路由來切換子層頁面。

路由頁面

/person                                                /person/emails                                         /person/profile
+-----------------------------------+                  +-----------------------------------+                  +-----------------------------------+
| person.vue                        |                  | person.vue                        |                  | person.vue                        |
| +-----+-------------------------+ |                  | +-----+-------------------------+ |                  | +-----+-------------------------+ |
| | index.vue(default)            | |                  | | emails.vue                    | |                  | | profile.vue                   | |
| |                               | |  +------------>  | |                               | |  +------------>  | |                               | |
| |                               | |                  | |                               | |                  | |                               | |
| +-----+-------------------------+ |                  | +-----+-------------------------+ |                  | +-----+-------------------------+ |
+-----------------------------------+                  +-----------------------------------+                  +-----------------------------------+

設置檔案

---| person 📂
------| index.vue (default)
------| emails.vue
------| profile.vue
---| person.vue

person.vue

vue
<template>
  <div>
    <h1>Nav</h1>
    <NuxtLink to="/person">index</NuxtLink>
    <br />
    <NuxtLink to="/person/emails">Emails</NuxtLink>
    <br />
    <NuxtLink to="/person/profile">Profile</NuxtLink>

    <!-- 崁入子層頁面 -->
    <NuxtPage />
  </div>
</template>