今天在做一個頁面,遇到一個數據渲染不同步的問題,如下:
代碼如下:原理:點擊時,對應的banklist 的選項選項變為 true 選中狀態
html:
<div class="PayOrder">
<div class="header">
<span class="iconfont"></span>
支付首頁
</div>
<div class="title">
<h3>¥<span>{{odata.order_amount}}</span></h3>
<p>{{oname}}</p>
</div>
<div class="bankpay" @click="paybankshow">
<div>
<span class="iconfont"></span>
快捷支付
</div>
<span v-show="!paybank" class="iconfont"></span>
<span v-show="paybank" class="iconfont active"></span>
</div>
<ul class="bank" v-show="paybank">
<li @click="checkedcurbank(item.bankname)" v-for="item in banklist" v-if="banklist.length>0">
<div class="bankli" :style="{backgroundImage:'url(' + item.logoimgurl + ')'}"></div>
{{item.ischecked}}
<span v-show="item.ischecked" class="iconfont active"></span>
</li>
<li @click="toPayObligate">
<div>
<span class="iconfont"></span>
添加銀行卡
</div>
</li>
</ul>
<ul class="pay">
<li @click="weixinactive">
<div>
<span class="iconfont" style="color: #22b190;"></span>
微信支付
</div>
<span v-show="!weixin" class="iconfont"></span>
<span v-show="weixin" class="iconfont active"></span>
</li>
<li @click="zhifubactive">
<div>
<span class="iconfont" style="color: #4d90dd;"></span>
支付寶支付
</div>
<span v-show="!zhifub" class="iconfont"></span>
<span v-show="zhifub" class="iconfont active"></span>
</li>
</ul>
<p class="msg">請您在提交訂單后30分鍾內完成支付,逾期訂單會自動取消</p>
<div v-if="isqueren" class="butt" @click="pay">確定支付</div>
</div>
js:
1 checkedcurbank(str){ 2 3 this.banklist.forEach(function(item){ 4 if(item.bankname==str){ 5 item.ischecked=true; 6 }else{ 7 item.ischecked=false; 8 } 9 }); 10 11 this.weixin=false; 12 this.zhifub=false; 13 14 15 this.banklist.forEach(function(item){ 16 console.log(item.bankname+"----------"+item.ischecked); 17 }); 18 console.log("weixin :" + this.weixin); 19 console.log("zhifubao :" + this.zhifub); 20 console.log(this.banklist); 21 },
運行結果:點擊兩次,第一次點擊招商銀行,第二次點擊建設銀行

說明如下:第二次點擊無法選中建設銀行,從右邊的控制台可以看出,實際上第二次點擊時,建設隱行對應的選中狀態已經變成了true,但是頁面並沒有同步出現選中按鈕,這就是vue 中數據沒有及時更新到頁面上

下午百度了很多,但是沒有找到原因,6點多的時候,在想,數據之所以沒有更新到到頁面上,是因為 vue 沒有檢測到數據變化,那么,我就給他來一點數據變化,把 banklist 中的數據取出來一條,然后再把這條取出的數據放進去,這樣就有明顯的數據變化了,變更后如下:以下代碼中,增加了 16 / 17 行
1 checkedcurbank(str){ 2 3 this.banklist.forEach(function(item){ 4 if(item.bankname==str){ 5 item.ischecked=true; 6 }else{ 7 item.ischecked=false; 8 } 9 }); 10 11 12 this.weixin=false; 13 this.zhifub=false; 14 this.isqueren = false; 15 16 var ocuritem = this.banklist.pop(); 17 this.banklist.push(ocuritem); 18 19 this.banklist.forEach(function(item){ 20 console.log(item.bankname+"----------"+item.ischecked); 21 }); 22 console.log("weixin :" + this.weixin); 23 console.log("zhifubao :" + this.zhifub); 24 console.log(this.banklist); 25 },
運行結果:

可以看出,已經可以同步更新到頁面了~~,以后,當數據不能同步更新時,我們可以對數據做以下類似的處理,先取出來一部分,再把這部分放回去,讓 vue 明顯的檢測到數據的變化,這樣就可以同步更新數據了
