用 Nuxt.js 串接 data 做下拉式選單

用 Vue-cli 一陣子後,因為有 SEO 的需求,所以決定改用 Nuxt.js。

雖然 Vue-cli 也有套件 prerender-spa-plugin 可以做到預渲染的功能,但他無法預渲染動態路由,像是 /user/:id 這樣的路徑,因為預渲染是獲取已在的元素,但動態路由的元素狀態處於未知,所以無法取得對應的內容。當然,假使你的 Vue 專案都是靜態網頁,而且你也較熟悉 Vue-cli,那可以考慮用該套件即可,不需改用 Nuxt.js。


fetch 與 asyncData 的選擇

我們以往都是用 data() 存取資料,但 Nuxt.js 多了一個asyncData 的選擇,將資料放在 asyncData 底下以達到從伺服器端渲染頁面的效果,可以改寫如下:

JS

頁面渲染前會執行 asyncData(),並將值塞回 data() 內,詳細內容可參考官網的 asyncData() 介紹

asyncData() 使用注意

asyncData() 雖然看似好用,卻只能在 pages/ 資料夾底下的 *.vue 才有作用,如果你的 vue 檔案是放在 components/ layouts/ 底下,是無法利用 asyncData() 存取資料的。

因此,可以改用 fetch 存取 components/layouts/ 裡的資料,改寫如下:

JS

不過有看過一種說法是,asyncData() 適合用在覆蓋 data() 的資料上,fetch 則適合用在 vuex 上。所以我也不知道自己這樣寫是否有符合規範,如果有更好的方法歡迎留言給我!


製作下拉選單

這邊搭配 Bootstrap v5 來製作下拉選單,使用的是上方寫到的 navDatas[] 資料。我製作的是二層的下拉式選單 (dropdown menu),所以有比較多針對 class 的判斷式。

HTML

以上。


後記

這篇不是教學,比較像是我寫 code 的筆記,因為對 Nuxt.js 不熟,很多觀念還沒有從頭看懂,所以也不敢亂教大家 XD。

後來因為有再搭配多國語系做選單,所以最後沒有使用 fetch 的方式產資料,過兩天有空會再把多國語系的寫法放上來做個紀錄。

想對你說 (ノ>ω<)ノ

感謝您閱讀到最後,對文章有任何疑問歡迎留言給我,我會盡快回覆。

Faceook / 不定時分享前端資訊與新知,歡迎追蹤!

 

如果這篇文章對您有幫助,請幫我點擊下方的廣告,讓我有更多的動力寫寫寫 (๑•̀ㅂ•́)و✧

guest
0 則留言
Inline Feedbacks
View all comments
粉絲團