您好,登錄后才能下訂單哦!
在nuxt.js項(xiàng)目中如何增加錯(cuò)誤提示頁面?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
為項(xiàng)目增加錯(cuò)誤提示頁面,比如后端接口沒有數(shù)據(jù)或接口報(bào)錯(cuò)的時(shí)候,如果不增加錯(cuò)誤提示頁面的話,那接口報(bào)錯(cuò)的信息就會(huì)在頁面中顯示,這顯然不利于用戶體驗(yàn)。
實(shí)際操作過程中,可能因?yàn)楦鞣N原因無法顯示正確的返回頁面,比如本身這篇文章的id不存在,或者網(wǎng)絡(luò)請(qǐng)求問題,這時(shí)候就需要一個(gè)錯(cuò)誤展示頁用來提示用戶;
nuxt.js官方也有錯(cuò)誤提示頁面的寫法:傳送門-> 官方錯(cuò)誤提示頁面的寫法
此項(xiàng)目中的錯(cuò)誤提示頁面是放在layouts目錄中:
layouts中的error.vue頁面內(nèi)容為:
<template> <div class="err_wrap"> <h2 class="error" v-if="error.statusCode === 404">頁面不存在或沒有數(shù)據(jù)</h2> <h2 class="error" v-else>應(yīng)用發(fā)生錯(cuò)誤異常</h2> <nuxt-link class="to_home" to="/">返回首頁</nuxt-link> </div> </template>
<script> export default { props: ['error'], layout: 'detail', data() { return { msg: '未找到相應(yīng)頁面或沒有數(shù)據(jù)' } } } </script>
<style scoped> .err_wrap { padding: 0.2rem 0.4rem; text-align: center; } .error { font-size: 0.32rem; text-align: center; padding-top: 55%; color: #582c1a; padding-bottom: 0.4rem; } .to_home { font-size: 0.3rem; color: #582c1a; display: inline-block; padding-bottom: 3.9rem; } </style>
在頁面組件中是在asyncData的catch中寫的,當(dāng)接口調(diào)用出錯(cuò)或無數(shù)據(jù)時(shí)就會(huì)跳轉(zhuǎn)到錯(cuò)誤提示頁面:
async asyncData(context, callback) { try { // console.log("_id的id:====", context.params.id) let paramsWorksList = { id: context.params.id } let WorksDetail = await context.$axios.post(`/anchor/worksList`, paramsWorksList) // console.log("WorksDetail:=====", WorksDetail.data.data[0]) return { WorksDetail: WorksDetail.data.data[0] } } catch (err) { console.log("errConsole========:", err) callback({ statusCode: 404, message: '頁面未找到或沒有數(shù)據(jù)!' }) //當(dāng)接口無數(shù)據(jù)或接口出錯(cuò)時(shí)會(huì)執(zhí)行這句代碼跳轉(zhuǎn)到錯(cuò)誤提示頁面 } },
這里有一個(gè)坑,asyncData的callback在nuxt.js的2.3.X版本給廢棄了,運(yùn)行項(xiàng)目總是提示:
Callback-based asyncData, fetch or middleware calls are deprecated. Please switch to promises or async/await syntax
經(jīng)過google發(fā)現(xiàn)的,nuxt.js的作者覺得callback沒什么用,給去掉了。
github issue鏈接:https://github.com/nuxt/nuxt.js/issues/4158
所以經(jīng)過查看文檔,error的屬性在context這個(gè)參數(shù)中,頁面組件中的代碼如下:
async asyncData(context) { try { // console.log("_id的id:====", context.params.id) let paramsWorksList = { id: context.params.id } let WorksDetail = await context.$axios.post(`/anchor/worksList`, paramsWorksList) // console.log("WorksDetail:=====", WorksDetail.data.data[0]) return { WorksDetail: WorksDetail.data.data[0] } } catch (error) { console.log("errConsole========:", context.error({ statusCode: 404, message: '頁面未找到或無數(shù)據(jù)' })) context.error({ statusCode: 404, message: '頁面未找到或無數(shù)據(jù)' }) //修改成這樣就可以跳到錯(cuò)誤提示頁面 } },
在 asyncData 請(qǐng)求時(shí)添加參數(shù) callback,如果請(qǐng)求正確,則 callback 的第一個(gè)參數(shù)為 null,第二個(gè)參數(shù)為賦值對(duì)象;
如果請(qǐng)求錯(cuò)誤,則直接將對(duì)象為參數(shù),包括 statusCode 錯(cuò)誤代碼以及 message 錯(cuò)誤信息,以便處理不同的錯(cuò)誤信息展示;
最終效果如下:
補(bǔ)充知識(shí):Nuxt的錯(cuò)誤頁面和個(gè)性meta設(shè)置
當(dāng)用戶輸入路由錯(cuò)誤的時(shí)候,我們需要給他一個(gè)明確的指引,所以說在 應(yīng)用程序開發(fā)中404頁面時(shí)必不可少的。Nuxt.js支持直接再默認(rèn)布局文件夾里建立錯(cuò)誤頁面。
建立錯(cuò)誤頁面
在根目錄下的layouts文件夾下建立一個(gè)error.vue文件,它相當(dāng)于一個(gè)顯示應(yīng)用錯(cuò)誤的組件。
<template> <div class="error"> <h3 v-if="error.statusCode == 404">404 - 頁面不存在</h3> <h3 v-else>500 - 服務(wù)器錯(cuò)誤</h3> <ul> <!-- 這里用來提示返回到主頁 --> <li><nuxt-link to="/">HOME</nuxt-link></li> </ul> </div> </template> <script> export default { props: ['error'] } </script>
代碼用v-if進(jìn)行判斷錯(cuò)誤類型,需要注意的是這個(gè)錯(cuò)誤時(shí)你需要在<script>里進(jìn)行聲明的。
個(gè)性meta設(shè)置
頁面的Meta對(duì)于SEO的設(shè)置非常重要,比如你現(xiàn)在要做個(gè)新聞頁面,那為了搜索搜索引擎對(duì)新聞的收錄,需要每個(gè)頁面對(duì)新聞都有不同的title和meta設(shè)置。直接使用head方法來設(shè)置當(dāng)前頁面的頭部信息就可以了。
我們現(xiàn)在要把New-1這個(gè)頁面設(shè)置成個(gè)性的meta和title。
1.我們先把pages/news/index.vue頁面的鏈接進(jìn)行修改一下,傳入一個(gè)title,目的是為了在新聞具體頁面進(jìn)行接收title,形成文章的標(biāo)題。
/pages/news/index.vue
<template> <div> <h3>News Index page</h3> <p>NewID:{{$route.params.newsId}}</p> <ul> <li><nuxt-link :to="{name:'index'}">Home</nuxt-link></li> <li><nuxt-link :to="{name:'news-id',params:{id:123,title:'我是新聞標(biāo)題'}}">News-1</nuxt-link></li> </ul> </div> </template> <script> export default { } </script>
第一步完成后,我們修改/pages/news/_id.vue,讓它根據(jù)傳遞值變成獨(dú)特的meta和title標(biāo)簽。
<template> <div> <h3>News-Content [{{$route.params.id}}]</h3> <ul> <li><a href="/" rel="external nofollow" >Home</a></li> </ul> </div> </template> <script> export default { validate ({ params }) { // Must be a number return /^\d+$/.test(params.id) }, data(){ return{ title:this.$route.params.title, } }, //獨(dú)立設(shè)置head信息 head(){ return{ title:this.title, meta:[ {hid:'description',name:'news',content:'This is news page'} ] } } } </script>
注意:為了避免組件中的meta標(biāo)簽不能正確覆蓋父組件中相同的標(biāo)簽而產(chǎn)生重復(fù)的現(xiàn)象,建議利用hid鍵為meta標(biāo)簽配一個(gè)唯一的標(biāo)識(shí)編號(hào)。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。