Loading...
Nuxt2 專有的function
asyncData、fetch 等 function 說明
更新於 2025-03-05 08:15:04
Written by Jacky Yang@Jacky Yang
asyncData
用於component中,在server or route 更新前取得資料注入資料,可返回一個Promise,resolve的時候注入data()。
使用時機: 資料需要在server端渲染的時候(SSR),對SEO有很大的幫助
fetch
用於component中,在client取得資料,可返回一個Promise,resolve的時候注入data()。
使用時機: 想要資料更早呈現出來而不是進入route才取得資料,可以提升SEO效果。不過效果沒有asyncData好,因為asyncData可以讓SE看到完整的HTML內容,fetch只能看到部分
nuxtServerInit
用於vuex,是一個特殊的action,在nuxt app server 初始化的時候自動調閱
使用時機: 在server端預先載入data,供client渲染期間使用,可提高效能、UX
例如用來取得Post Data:
async nuxtServerInit(vuexContext, context) {
try {
const data = await context.app.$axios.$get("/posts.json");
const postArr = [];
for (const key in data) {
postArr.push({ ...data[key], id: key });
}
vuexContext.dispatch("post/setPosts", postArr);
} catch (e) {
context.error(e);
}
},
generate(nuxt.config.js)
用於nuxt.config.js,可建構靜態文件,可在不需要伺服器的狀態下更給客戶端。以下範例是生成動態路由
generate: {
routes: function () {
return axios
.get("https://nuxt-blog-b5610-default-rtdb.firebaseio.com/posts.json")
.then((res) => {
const routes = [];
for (const key in res.data) {
routes.push({
route: `/posts/${key}`,
payload: {
postData: res.data[key],
},
});
}
return routes;
});
},
},
generate的應用 + asyncData 的應用
透過generate建立dynamic route並取得dynamic data,然後傳給asyncData使用
// nuxt.config.js
generate: {
routes: function () {
return axios
.get("https://nuxt-blog-b5610-default-rtdb.firebaseio.com/posts.json")
.then((res) => {
const routes = [];
for (const key in res.data) {
routes.push({
route: `/posts/${key}`,
payload: {
postData: res.data[key],
},
});
}
return routes;
});
},
},
// component
asyncData(context) {
const getStructuredData = (postData) => {
return {
"@context": "http://schema.org",
"@type": "Article",
"headline": postData.title,
"image": "https://example.com/article-image.jpg",
"author": {
"@type": "Person",
"name": postData.author
},
"publisher": {
"@type": "Organization",
"name": "Jacky",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/publisher-logo.jpg"
}
},
"articleBody": postData.previewText
}
}
if (context.payload) {
return {
loadedPost: context.payload.postData,
structuredData: getStructuredData(context.payload.postData),
commemts: context.payload.postData.comments
};
}
return context.app.$axios
.$get(`/posts/${context.params.id}.json`)
.then(data => {
return {
loadedPost: data,
structuredData: getStructuredData(data)
};
})
.catch(err => console.log(err));
}