iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0

昨天成功的引入了元件的展示頁,接下來就要引入有 layout 的父頁面 demo.vue ,將展示做得更完整~

第十二天的完成狀態

第十二天的完成狀態

step 1: 引入 addLayout

 import { addLayout } from '@nuxt/kit'

step 2: 將 demo-layout.vue 的路徑放在第一個參數,名稱則放在第二個參數。

addLayout(resolver.resolve('./runtime/layouts/demo-layout.vue'), 'sealdemo-layout')

名稱對應在 pages/demo.vue<NuxtLayout>

// pages/demo.vue
<template>
  <NuxtLayout name="seal-demo-layout">
    <NuxtPage />
  </NuxtLayout>
</template>

step 3: tailwind.config.ts 新增 layout 編譯

content: [
    './src/runtime/components/**/*.{vue,jsx,tsx}',
    './src/runtime/pages/**/*.{vue,jsx,tsx}',
    './src/runtime/layouts/*.{vue,jsx,tsx}', // 新增 layout 編譯
  ]

step 4: 如果 logo 是引入 assets/ 資料夾下的圖檔請先註解掉 ,否則會看到 Nuxt 找不到對應檔案的提示,導致畫面無法出現~接下來再處理圖片引入的問題!

          <div class="flex items-center">
            <a class="navigation-logo" href="/">
	              <div class="w-10 mr-2">
	               <!-- 先註解掉 logo -->
                  <!-- <img src="@/assets/images/seal.png" alt="logo"> -->
                </div>
                我的 UI 元件庫
            </a>
            <div
              class="navigation-menu flex items-center pr-5 duration-150 ease-in hover:scale-125"
              @click="isSidebarFold = !isSidebarFold"
            >
              <Icon
                name="mdi:arrow-collapse-right"
                :class="{'rotate-180': isSidebarFold}"
              />
            </div>
          </div>
        </div>

做到這邊嘗試 npm run dev 一下看看成果….

呃~看起來 layout 確實有引入了,css 跟 sidebar 的收折也都是正常的

缺少的是鑲嵌在 layout 中的子頁面以及旁邊的 sidebar 項目

 [Vue Router warn]: No match found for location with path "/api/sidebar-item"

讓我們先來處理子頁面的問題吧!

step 5: 調整 extendPages

先前我在引入頁面時是這樣寫的

// module.ts
const files = fs.readdirSync(resolver.resolve('./runtime/pages/demo'))

extendPages((pages) => {
	// 這裡引入 demo
	pages.push({
        name: 'demo',
        file: resolver.resolve('./runtime/pages/demo.vue'),
        path: '/demo',
      })
  //這裡引入 demo 底下的各個子頁面
	files.forEach((demoPage) => {
        pages.push({
          name: `demo-${demoPage}`.replace('.vue', ''),
          file: resolver.resolve(`./runtime/pages/demo/${demoPage}`),
          path: `/demo/${demoPage.replace('.vue', '')}`,
        })
      })
    })

雖然這樣子寫,路徑是正常的
但 Nuxt 明顯不知道 demo.vue 與其底下頁面的關係,以至於 <NuxtPage>沒有發揮作用

讓我們修改一下寫法,在 extendPages時將子頁面放入 children

// module.ts
extendPages((pages) => {
 pages.push({
        file: resolver.resolve('./runtime/pages/demo.vue'),
        path: '/demo',
        children: files.map((demoPage) => {
          if (demoPage === '[id].vue') {
            return {
              name: 'demo-id',
              file: resolver.resolve(`./runtime/pages/demo/${demoPage}`),
              path: `/demo/:id`,
            }
          }
          return {
            name: `demo-${demoPage}`.replace('.vue', ''),
            file: resolver.resolve(`./runtime/pages/demo/${demoPage}`),
            path: `/demo/${demoPage.replace('.vue', '')}`,
          }
        })
      })
})

調整完之後就子頁面就跟父頁面的關係連結起來嚕
嵌套的部分也正常呈現了!

那麼明天再繼續處理 sidebar 項目引入以及圖片引入的問題~


PS. 如果出現了以下的提示

Internal server error: ENOENT: no such file or directory, open '/virtual:nuxt:.............../playground/.nuxt/layouts.default.f8b75d86.vue’

可以檢查看看是不是 layout 裡面放了 <style> 的樣式設定,挪到 asset/.css 再引入也許可以解決。


addLayout : https://nuxt.com/docs/api/kit/layout


上一篇
extendPages-快速加入頁面
下一篇
addServerHandler & alias
系列文
蓋一個自己的 Nuxt 3 UI Module30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言