使用vue的一些經驗


雖然說VUE是數據驅動視圖的框架,但有時候不得不獲取DOM來獲得一些樣式屬性,做一些操作,這時候就需要VUE獲取DOM對象的方法。

vue獲取DOM對象的方法:

如果是操作組件內部的DOM,可以通過給組件定義methods,這樣可以通過組件內部的methods對象的方法里的默認參數e來獲取組件的原生DOM對象,然后通過節點關系查找到你要的任何DOM節點和樣式信息。
但methods必須要綁定到某個目標元素的某種事件上。那么如果需要一加載頁面就獲取dom怎么辦呢?

這時候可以把methods的方法在計算屬性computed里調用。這樣methods里的方法就能實現頁面一加載就運行了。當然,正規的做法是在實例的生命周期鈎子里調用。

 

不過,vue的標准搞法其實是這樣的:


1、vue是數據驅動視圖的框架,所以要改變組件的視圖,請先改變組件的數據(所以,忘掉DOM吧);
2、應該在組件內部實現組件自己的數據業務邏輯(也就是在組件內部實現自己的data、methods、computed、created、mounted等,然后通過props獲得父組件的data做子組件自己的data的初始值,同時子組件自己的視圖顯示用子組件自己的data來判斷和控制),這才是vue正確的搞法。為什么這樣說呢?因為這樣你才不會面臨“在父組件中的methods要控制子組件的視圖,但卻操作不了當前要控制的子組件的數據”這樣的問題。

這樣做的好處是:后端接口可以一次發送一個訂單列表的數據對象數組給你。但一次展示多少個可以由前端自己決定,同時也可以實現用this訪問父組件的data,並且還可以修改子組件自己的data來決定子組件怎么顯示。

 1     //訂單卡片組件定義
 2     Vue.component('order-card', {
 3       props: ['order','statetxt','icon','getticket','delorder'],
 4       data:function(){
 5         return {
 6             startTime:this.order.order_time,  //倒計時開始時間,由后端給出
 7             minute:0,     //倒計時顯示的分鍾數
 8             second:0,     //倒計時顯示的秒數
 9             countTime:3,   //倒計時幾分鍾
10             state:this.order.state
11         };
12       },
13       created: function() {
14           
15         // `this` 指向 vm 實例
16         var that = this,
17             startTime = this.startTime,
18             countTime = this.countTime;
19             
20         if(this.state==0){
21             
22                 if(typeof startTime == "undefined"){return};
23                 var now = Date.now(),timeline = countTime*60000,endtime = getFormatTime(timeline + Date.parse(startTime));
24                 var clock = new clocker(getFormatTime(startTime),endtime,now);
25                 clock.bindTimeEvent("timeout",function(){
26                     that.state = 2;
27                 });
28                 clock.startAndRender(this,[null,null,"minute","second"]);
29         }
30       },
31       template: 
32     '<div class="list_card">'
33     +'    <div class="card_title clearfix ft14">'
34     +'        <a class="orderNumber gray fl" href="javascript:;"><b v-bind:class="icon[order.oflag]"></b><span>訂單號:</span><i>{{order.order_no}}</i></a>'
35     +'        <span class="order_statue gray fr" v-if="state==0||state==1">{{state[state]}}</span><b class="icon icon-del ft20 gray fr" v-if="state==2||state==3||state==4" @click="delorder"></b>'
36     +'    </div>'
37     +'    <div class="card_cnt">'
38     +'        <div class="film_info" v-if="order.oflag == 0">'
39     +'            <div class="imgBox tc fl"><img  v-bind:src="order.image[0]" /><span class="hook"></span></div>'
40     +'            <p class="cutFont"><strong>片名:</strong><span>{{order.name}}</span></p>'
41     +'            <p class="cutFont"><strong>開映:</strong><span>{{order.feature_time}}</span></p>'
42     +'      </div>'
43     +'      <!-- 圖片滾動列表 STA -->'
44     +'        <div class="img_scroll_box" v-if="order.oflag == 1">'
45     +'            <ul class="img_list" v-bind:style="\'width:\'+(order.image.length * 70) + \'px\'">'
46     +'                <li v-for="src in order.image"><img v-bind:src="src" /><span class="hook"></span></li>'
47     +'           </ul>'
48     +'        </div>'
49     +'        <!-- 圖片滾動列表 END -->'
50     +'    </div>'
51     +'    <div class="card_price ft14 tr">'
52     +'        <span class="seatNum">共<i class="red">{{order.number}}</i>個{{ order.oflag == 0 ? "座位" : "賣品" }}</span><span class="realPrice">實付款:<i class="red">{{order.total_consume}}</i>元</span>'
53     +'    </div>'
54     +'    <div class="card_btm ft14 tr">'
55     +'          <a class="detail fl" v-bind:href="order.url_OrderInfo"><i class="icon icon-fanhui ft14 psr"></i>詳情</a>'
56     +'        <span class="gray" v-if="state==0">支付剩余時間<i class="red">{{minute}}</i>分<i class="red">{{second}}</i>秒</span>'
57     +'          <a class="btn btn_blue" v-bind:href="order.url_OrderInfo" v-if="state==0">付款</a>'
58     +'          <a class="btn btn_blue" href="javascript:;" v-bind:tcode="order.ticket_code" v-if="state==1" @click="getticket">取票</a>'
59     +'        <span class="gray" v-if="state==2">已取消</span>'
60     +'          <span class="gray" v-if="state==3">已完成</span>'
61     +'          <span class="gray" v-if="state==4">已退票</span>'
62     +'    </div>'
63     +'</div>'
64     });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM