vue.js數(shù)據(jù)加載完成前顯示原代碼{{代碼}}問題及解決
vue.js數(shù)據(jù)加載完成前顯示原代碼{{代碼}}
分析原因
首先了解HTML的加載順序:
解析html結(jié)構(gòu) → 加載外部腳本和樣式表文件 → 解析并執(zhí)行腳本代碼 → 構(gòu)造html dom模型 → 加載圖片等外部文件 → 頁(yè)面加載完畢
得出結(jié)論:
通過以上分析可知,當(dāng)html加載的時(shí)候,就會(huì)把{{代碼}} 當(dāng)成文本加載出來,當(dāng)vue初始化完成后,才會(huì)把{{代碼}}解析成vue的語(yǔ)法。如果把引入vue.js的script放到head里面,那頁(yè)面不會(huì)出現(xiàn){{代碼}},因?yàn)樵赽ody之前就把vue引入進(jìn)來了,vue加載完成了。
解決方法
1、方式一:使用 v-cloak指令
<div v-cloak>{{msg}}</div>
2、方式二:使用 v-html指令
<div v-html='msg'></div>
3、方式三:使用 v-text指令
<div v-text='msg'></div>
4、方式四:使用template標(biāo)簽將需要渲染的html包起來
HTML的 <template> 元素是一種用于保存客戶端內(nèi)容的機(jī)制,該內(nèi)容在頁(yè)面加載時(shí)不被渲染,但可以在運(yùn)行時(shí)使用JavaScript進(jìn)行實(shí)例化。
<div id="app"></div> <!--此處template標(biāo)簽必須在vue綁定的元素外面定義,并且在頁(yè)面中不顯示下面的template標(biāo)簽中的內(nèi)容--> <template id="demo"> <div v-if="flag">{{msg}}<div> <div v-else>無數(shù)據(jù)<div> </template> <script src="./js/vue.js"></script> <script> let vm = new Vue({ el:"#app", data:{ msg:"hello world", flag:true }, template:"#demo"http://通過該屬性可以將自定義的template屬性中的內(nèi)容全部替換app的內(nèi)容,并且會(huì)覆蓋里面原有的內(nèi)容,并且在查看dom結(jié)構(gòu)時(shí)沒有template標(biāo)簽 }); </script>
vue數(shù)據(jù)未加載完成前顯示loading遮罩
目的
在前后端分離項(xiàng)目中,由于頁(yè)面請(qǐng)求和數(shù)據(jù)請(qǐng)求并非同步,所以導(dǎo)致頁(yè)面和數(shù)據(jù)不能同時(shí)渲染,因此在實(shí)際過程中往往采用SSR即服務(wù)端渲染或者請(qǐng)求數(shù)據(jù)時(shí)采用遮罩(加載中)的方式提升用戶體驗(yàn)。
下面我將使用loading遮罩的方式實(shí)現(xiàn)更加友好的數(shù)據(jù)加載
參考:https://codepen.io/bartezic/pen/ByqeNq
效果
代碼
1.在App.vue中添加一個(gè)<div>
<div> <div id="appLoading"> <div class='lmask'></div> </div> <div id="app"> <router-view v-if="isRouterAlive"/> </div> </div>
2.以下是CSS樣式
.lmask { position: absolute; height: 100%; width: 100%; background-color: #000; bottom: 0; left: 0; right: 0; top: 0; z-index: 9999;; opacity: 0.4; &.fixed { position: fixed; } &:before { content: ''; background-color: rgba(0,0,0,0); border: 5px solid rgba(0,183,229,0.9); opacity: .9; border-right: 5px solid rgba(0,0,0,0); border-left: 5px solid rgba(0,0,0,0); border-radius: 50px; box-shadow: 0 0 35px #2187e7; width: 50px; height: 50px; -moz-animation: spinPulse 1s infinite ease-in-out; -webkit-animation: spinPulse 1s infinite linear; margin: -25px 0 0 -25px; position: absolute; top: 50%; left: 50%; } &:after { content: ''; background-color: rgba(0,0,0,0); border: 5px solid rgba(0,183,229,0.9); opacity: .9; border-left: 5px solid rgba(0,0,0,0); border-right: 5px solid rgba(0,0,0,0); border-radius: 50px; box-shadow: 0 0 15px #2187e7; width: 30px; height: 30px; -moz-animation: spinoffPulse 1s infinite linear; -webkit-animation: spinoffPulse 1s infinite linear; margin: -15px 0 0 -15px; position: absolute; top: 50%; left: 50%; } } @-moz-keyframes spinPulse { 0% { -moz-transform:rotate(160deg); opacity: 0; box-shadow: 0 0 1px #2187e7; } 50% { -moz-transform: rotate(145deg); opacity: 1; } 100% { -moz-transform: rotate(-320deg); opacity: 0; } } @-moz-keyframes spinoffPulse { 0% { -moz-transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); } } @-webkit-keyframes spinPulse { 0% { -webkit-transform: rotate(160deg); opacity: 0; box-shadow: 0 0 1px #2187e7; } 50% { -webkit-transform: rotate(145deg); opacity: 1; } 100% { -webkit-transform: rotate(-320deg); opacity: 0; } } @-webkit-keyframes spinoffPulse { 0% { -webkit-transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); } }
3.此時(shí)遮罩層顯示,我們需要當(dāng)App加載完成后取消遮罩層,即display: none
document.getElementById('app').style.display = 'block'; document.getElementById('appLoading').style.display = 'none';
4.如何在我們需要的地方調(diào)用呢
我采用的方法是寫一個(gè)loading和loaded函數(shù),在分別在請(qǐng)求數(shù)據(jù)前和請(qǐng)求數(shù)據(jù)完成后調(diào)用,因?yàn)樵摴δ芸赡軙?huì)重復(fù)的使用,所以將其封裝成為一個(gè)可以復(fù)用的模塊
在App.vue中寫兩個(gè)方法:
provide() { return { loading: this.loading, loaded: this.loaded } }, methods: { loading() { document.getElementById('app').style.display = 'block'; document.getElementById('appLoading').style.display = 'block'; }, loaded() { document.getElementById('app').style.display = 'block'; document.getElementById('appLoading').style.display = 'none'; } }
上面將這兩個(gè)函數(shù)給暴露了出來,在我們需要的地方inject就好
5. 在需要使用的地方調(diào)用
export default { inject: ['loading', 'loaded'], name: "index", created() { this.getData() }, methods: { getData() { this.loading() getUserInfo().then(res => { this.userInfo = res.data }).finally(() => { this.loaded() }) } } }
完成 !
實(shí)現(xiàn)思路非常簡(jiǎn)單,就是請(qǐng)求數(shù)據(jù)之前將遮罩顯示,加載數(shù)據(jù)完成后將遮罩隱藏
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解vue-cli 本地開發(fā)mock數(shù)據(jù)使用方法
這篇文章主要介紹了詳解vue-cli 本地開發(fā)mock數(shù)據(jù)使用方法,如果后端接口尚未開發(fā)完成,前端開發(fā)一般使用mock數(shù)據(jù)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05Vue檢測(cè)屏幕變化來改變不同的charts樣式實(shí)例
這篇文章主要介紹了Vue檢測(cè)屏幕變化來改變不同的charts樣式實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-10-10基于Vue實(shí)現(xiàn)HTML轉(zhuǎn)PDF并導(dǎo)出
這篇文章主要為大家介紹了三種方法,可以實(shí)現(xiàn)將HTML頁(yè)面轉(zhuǎn)為PDF并實(shí)現(xiàn)下載。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2022-04-04Vue3使用MD5加密實(shí)戰(zhàn)案例(清晰明了)
MD5是一種信息摘要算法(對(duì)稱加密),一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值,用來確保信息傳輸完整一致性,這篇文章主要給大家介紹了關(guān)于Vue3使用MD5加密的相關(guān)資料,需要的朋友可以參考下2023-05-05vue-element-admin 菜單標(biāo)簽失效的解決方式
今天小編就為大家分享一篇vue-element-admin 菜單標(biāo)簽失效的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11vue中PC端使用高德地圖實(shí)現(xiàn)搜索定位、地址標(biāo)記、彈窗顯示定位詳情(完整實(shí)例)
這篇文章主要介紹了vue中PC端使用高德地圖實(shí)現(xiàn)搜索定位、地址標(biāo)記、彈窗顯示定位詳情,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07vue中的get方法\post方法如何實(shí)現(xiàn)傳遞數(shù)組參數(shù)
這篇文章主要介紹了vue中的get方法\post方法如何實(shí)現(xiàn)傳遞數(shù)組參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04使用Vue-neo4j實(shí)現(xiàn)繪制三國(guó)人物圖譜關(guān)系
這篇文章主要介紹了使用Vue-neo4j實(shí)現(xiàn)繪制三國(guó)人物圖譜關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04