vue.js數(shù)據(jù)加載完成前顯示原代碼{{代碼}}問題及解決
vue.js數(shù)據(jù)加載完成前顯示原代碼{{代碼}}
分析原因
首先了解HTML的加載順序:
解析html結構 → 加載外部腳本和樣式表文件 → 解析并執(zhí)行腳本代碼 → 構造html dom模型 → 加載圖片等外部文件 → 頁面加載完畢
得出結論:
通過以上分析可知,當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結構時沒有template標簽
});
</script>vue數(shù)據(jù)未加載完成前顯示loading遮罩
目的
在前后端分離項目中,由于頁面請求和數(shù)據(jù)請求并非同步,所以導致頁面和數(shù)據(jù)不能同時渲染,因此在實際過程中往往采用SSR即服務端渲染或者請求數(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.如何在我們需要的地方調用呢
我采用的方法是寫一個loading和loaded函數(shù),在分別在請求數(shù)據(jù)前和請求數(shù)據(jù)完成后調用,因為該功能可能會重復的使用,所以將其封裝成為一個可以復用的模塊
在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. 在需要使用的地方調用
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ù)完成后將遮罩隱藏
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
在?Vite項目中使用插件?@rollup/plugin-inject?注入全局?jQuery的過程詳解
在一次項目腳手架升級的過程中,將之前基于?webpack?搭建的項目移植到?Vite?構建,這篇文章主要介紹了在?Vite項目中,使用插件?@rollup/plugin-inject?注入全局?jQuery,需要的朋友可以參考下2022-12-12
從vue基礎開始創(chuàng)建一個簡單的增刪改查的實例代碼(推薦)
這篇文章主要介紹了從vue基礎開始創(chuàng)建一個簡單的增刪改查的實例代碼,需要的朋友參考下2018-02-02
使用vuex較為優(yōu)雅的實現(xiàn)一個購物車功能的示例代碼
這篇文章主要介紹了使用vuex較為優(yōu)雅的實現(xiàn)一個購物車功能的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
Vue如何使用patch-package優(yōu)雅地修改第三方依賴庫
在前端開發(fā)中,有時我們需要對第三方依賴庫進行修改以滿足項目需求,patch-package 是一個優(yōu)秀的工具,可以幫助我們優(yōu)雅地管理這些修改,下面我們來看看具體操作吧2025-03-03
Vue實現(xiàn)內(nèi)部組件輪播切換效果的示例代碼
這篇文章主要介紹了Vue實現(xiàn)內(nèi)部組件輪播切換效果的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04

