今天在做一個頁面,遇到一個數據渲染不同步的問題,如下:
代碼如下:原理:點擊時,對應的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 明顯的檢測到數據的變化,這樣就可以同步更新數據了