vue.js數(shù)據(jù)加載完成前顯示原代碼{{代碼}}問題及解決
vue.js數(shù)據(jù)加載完成前顯示原代碼{{代碼}}
分析原因
首先了解HTML的加載順序:
解析html結(jié)構(gòu) → 加載外部腳本和樣式表文件 → 解析并執(zhí)行腳本代碼 → 構(gòu)造html dom模型 → 加載圖片等外部文件 → 頁面加載完畢
得出結(jié)論:
通過以上分析可知,當html加載的時候,就會把{{代碼}} 當成文本加載出來,當vue初始化完成后,才會把{{代碼}}解析成vue的語法。如果把引入vue.js的script放到head里面,那頁面不會出現(xiàn){{代碼}},因為在body之前就把vue引入進來了,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標簽將需要渲染的html包起來
HTML的 <template> 元素是一種用于保存客戶端內(nèi)容的機制,該內(nèi)容在頁面加載時不被渲染,但可以在運行時使用JavaScript進行實例化。
<div id="app"></div> <!--此處template標簽必須在vue綁定的元素外面定義,并且在頁面中不顯示下面的template標簽中的內(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)容,并且會覆蓋里面原有的內(nèi)容,并且在查看dom結(jié)構(gòu)時沒有template標簽 }); </script>
vue數(shù)據(jù)未加載完成前顯示loading遮罩
目的
在前后端分離項目中,由于頁面請求和數(shù)據(jù)請求并非同步,所以導致頁面和數(shù)據(jù)不能同時渲染,因此在實際過程中往往采用SSR即服務(wù)端渲染或者請求數(shù)據(jù)時采用遮罩(加載中)的方式提升用戶體驗。
下面我將使用loading遮罩的方式實現(xiàn)更加友好的數(shù)據(jù)加載
參考:https://codepen.io/bartezic/pen/ByqeNq
效果
代碼
1.在App.vue中添加一個<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.此時遮罩層顯示,我們需要當App加載完成后取消遮罩層,即display: none
document.getElementById('app').style.display = 'block'; document.getElementById('appLoading').style.display = 'none';
4.如何在我們需要的地方調(diào)用呢
我采用的方法是寫一個loading和loaded函數(shù),在分別在請求數(shù)據(jù)前和請求數(shù)據(jù)完成后調(diào)用,因為該功能可能會重復(fù)的使用,所以將其封裝成為一個可以復(fù)用的模塊
在App.vue中寫兩個方法:
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'; } }
上面將這兩個函數(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() }) } } }
完成 !
實現(xiàn)思路非常簡單,就是請求數(shù)據(jù)之前將遮罩顯示,加載數(shù)據(jù)完成后將遮罩隱藏
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解vue-cli 本地開發(fā)mock數(shù)據(jù)使用方法
這篇文章主要介紹了詳解vue-cli 本地開發(fā)mock數(shù)據(jù)使用方法,如果后端接口尚未開發(fā)完成,前端開發(fā)一般使用mock數(shù)據(jù)。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05基于Vue實現(xiàn)HTML轉(zhuǎn)PDF并導出
這篇文章主要為大家介紹了三種方法,可以實現(xiàn)將HTML頁面轉(zhuǎn)為PDF并實現(xiàn)下載。文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下2022-04-04vue中PC端使用高德地圖實現(xiàn)搜索定位、地址標記、彈窗顯示定位詳情(完整實例)
這篇文章主要介紹了vue中PC端使用高德地圖實現(xiàn)搜索定位、地址標記、彈窗顯示定位詳情,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07vue中的get方法\post方法如何實現(xiàn)傳遞數(shù)組參數(shù)
這篇文章主要介紹了vue中的get方法\post方法如何實現(xiàn)傳遞數(shù)組參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04使用Vue-neo4j實現(xiàn)繪制三國人物圖譜關(guān)系
這篇文章主要介紹了使用Vue-neo4j實現(xiàn)繪制三國人物圖譜關(guān)系,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04