1. 程式人生 > >支付,配送....流程,模擬後臺返回狀態碼 --飛機票專案

支付,配送....流程,模擬後臺返回狀態碼 --飛機票專案

Hello,我們做專案的時候經常會遇到一些支付流程啊,配送流程啊。說白的就是一個’時間表’,雖然我這麼說是‘時間表’,可能在術語上不對,我也不知道怎麼解釋了。
請看下圖:我們要實現的效果圖:
這裡寫圖片描述

一看圖,相信大家都明白了,專案中會遇到很多這種互動。
邏輯思路分析:
1.背景條跟隨狀態變化而變化。
2.文字內的背景色跟顏色跟隨狀態變化而變化

那麼應該怎麼去考慮寫程式碼呢? 首先我說過了我們是通過一個狀態碼來判斷 我們的背景條到那裡,還有我們數字內的背景色跟字型顏色。那麼 我們可以反過來想想 後臺是不是 傳一個 值 等於 多少 我們寫一個假如值:
num:1 填寫資訊狀態
num:2 確認資訊狀態
num:3 支付狀態
num:4 完成狀態

因為我們沒有後臺,我們就寫四個bntton 按鈕 來模擬這四個值 的變化把!

<script type="text/javascript" src="js/vue.js"></script>
<style type="text/css">
    *{
        margin: 0;
        padding: 0;
        list-style: none;

    }
    #box{
        width: 1200px;
        height: 60px;
        border: 1px solid red;
        margin
: 50px auto
; padding: 20px 30px; position: relative; /*overflow: hidden;*/ }
li{ float: left; padding: 0 105px; z-index: 99; width: 90px; } li>div{ width: 40px; height: 40px; border-radius: 100%; background
: #999
; text-align: center; line-height: 40px; margin: 0 auto; transition: all 1s; }
p{ text-align: center; } #bg{ position: absolute; width: 95.24%; background: #999; height: 20px; z-index: -1; top: 30px; } .bgs{ height: 100%; background: red; transition: all 0.5s; } #btn{ position: absolute; bottom: -30px; } .active{ background: blue; color: #fff; }
</style> <div id="box"> <ul> <li ref='list'> <div :class="{active:state.active1}">1</div> <p>填寫資訊</p> </li> <li> <div :class="{active:state.active2}">2</div> <p>確認資訊</p> </li> <li> <div :class="{active:state.active3}">3</div> <p>支付</p> </li> <li> <div :class="{active:state.active4}">4</div> <p>完成</p> </li> </ul> <div id="bg"> <div class="bgs" :style='activeObj'></div> </div> <div id='btn'> <button @click='add1'>填寫資訊</button> <button @click='add2'>確認資訊</button> <button @click='add3'>支付</button> <button @click='add4'>完成</button> </div> </div>

佈局就不多說了直接看頁面裡面的幾個屬性:
1.首先 我給這四個li綁定了 同一個類 就是 active的類,選中的樣式,然後通過vue讓他們都為fasle;
2.其次 給背景條綁定了一個style 是一個物件,裡面是背景條的寬 width
3.最後我給每一個按鈕新增不同的點選事件
分析我們的JS程式碼:

<script type="text/javascript">
    var vm = new Vue({
        el:'#box',
        data:{
            activeObj:{
                width:0
            },
            state:{
                active1:false,
                active2:false,
                active3:false,
                active4:false,
                num:'',
                listWidth:''
            }

        },
        methods:{
            add1(){
                this.state.num = 1;
                // console.log(this.$refs.list.getBoundingClientRect().width)
                // console.log(this.state.active1)
            },
            add2(){
                this.state.num = 2
            },
            add3(){
                this.state.num = 3
            },
            add4(){
                this.state.num = 4
            }
        },
        watch:{
            state:{
                handler(newVale){
                    if (newVale.num == 1) {
                        this.activeObj.width = this.state.listWidth +'px';
                        this.state.active1 = true;
                        this.state.active2 = false;
                        this.state.active3 = false;
                        this.state.active4 = false;
                    }else if (newVale.num == 2 ) {
                        this.activeObj.width = this.state.listWidth * 2 +'px'
                        this.state.active1 = true;
                        this.state.active2 = true;
                        this.state.active3 = false
                        this.state.active4 = false
                    }else if( newVale.num == 3){
                        this.activeObj.width = this.state.listWidth * 3 +'px'
                        this.state.active1 = true;
                        this.state.active2 = true;
                        this.state.active3 = true
                        this.state.active4 = false
                    }else if(newVale.num == 4){
                        this.activeObj.width = this.state.listWidth * 4 +'px'
                        this.state.active1 = true;
                        this.state.active2 = true;
                        this.state.active3 = true
                        this.state.active4 = true
                    }
                },deep: true
            }
        },
        mounted(){
            this.state.listWidth =  this.$refs.list.getBoundingClientRect().width
            console.log(this.state.active1)
        }
    })
</script>

通過我們一開始的邏輯,我們說過要通過一個num值的返回的狀態來改變我們想改變的樣式!
所以我們就通過自定義 一個num值,然後點選按鈕的時候改變 num值的變化。然後我們通過vue中的監聽num值來改變樣式!(注意一點:這裡因為是物件型別所以監聽要加 deep:true)。

我們要說一下,ref=‘list’ 大家可以上網查一下,在mounted裡面的程式碼是 獲取li元素的寬度的。

最後,我寫的可能比較多,不夠簡單,因為能想到的都想到了,如果大家有更好的程式碼,跟思路可以給我在下方留言或者新增我好友 QQ992262716.

好了!我是楊小寶,感謝您的閱讀!(持續更新飛機票專案所有知識點)