vue02 過濾器、計算和偵聽屬性、vue對象的生命週期、阻止事件冒泡和刷新頁面

3. Vue對象提供的屬性功能

3.1 過濾器

過濾器,就是vue容許開發者自定義的文本格式化函數,可使用在兩個地方:輸出內容和操做數據中。javascript

定義過濾器的方式有兩種。css

3.1.1 使用Vue.filter()進行全局定義

Vue.filter("RMB1", function(v){
    //就是來格式化(處理)v這個數據的
    if(v==0){
            return v
    }
​
    return v+"元"
})

3.1.2 在vue對象中經過filters屬性來定義

var vm = new Vue({
  el:"#app",
  data:{},
  filters:{
    RMB2:function(value){
      if(value==''){
        return;
      }else{
        return '¥ '+value;
      }
    }
    }
});
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <!--導入自定義的過濾器函數-->
    <script src="js/filters.js"></script>
</head>
<body>

    <div id="app">
        價格:{{price|keepdot2(3)|RMB}}<br>
        價格:{{price|keepdot2(3)|RMB}}<br>
        價格:{{price|keepdot2(3)|RMB}}<br>
        價格:{{price|keepdot2(3)}}<br>
        <!--以管道符將值傳入後面的過濾器函數裏-->
    </div>

    <script>

        var vm1 = new Vue({
            el:"#app",
            data:{
                price: 20.3
            },
            methods:{},
            // 普經過濾器[局部過濾器]
            filters:{
                keepdot2(value,dot){
                    return value.toFixed(dot)
                }
            }
        })
    </script>

</body>
</html>
HTML文件
// 全局過濾器
// Vue.filter("過濾器名稱","調用過濾器時執行的函數")
Vue.filter("RMB",function(value){
    return value+"元";
})
自定義過濾器.js

 

 

3.4 計算和偵聽屬性

3.4.1 計算屬性

咱們以前學習過字符串反轉,若是直接把反轉的代碼寫在元素中,則會使得其餘同事在開發時時不易發現數據被調整了,因此vue提供了一個計算屬性(computed),可讓咱們把調整data數據的代碼存在在該屬性中。html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.min.js"></script>
        <script>
        window.onload = function(){
        var vm = new Vue({
            el:"#app",
            data:{
                str1: "abcdefgh"
            },
            computed:{   //計算屬性:裏面的函數都必須有返回值
                strRevs: function(){
                    var ret = this.str1.split("").reverse().join("");
                    return ret
                }
            }
        });
    }
    </script>
</head>
<body>
    <div id="app">
         <p>{{ str1 }}</p>
         <p>{{ strRevs }}</p>
    </div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <!--<script src="js/filters.js"></script>-->
</head>
<body>

    <div id="app">
        原價格:{{price|k2}}<br>
        折扣價:{{new_price}}<br>
    </div>

    <script>

        var vm1 = new Vue({
            el:"#app",
            data:{
                price: 20.3,
                sale: 0.6,
            },
            // 過濾器
            filters:{
                k2(value){
                    return value.toFixed(2)
                }
            },
            // 計算屬性
            computed:{
                new_price(){
                    return (this.price*this.sale).toFixed(2);
                }
            }
        })
    </script>

</body>
</html>
計算小栗子

 

3.4.2 監聽屬性

偵聽屬性,能夠幫助咱們偵聽data某個數據的變化,從而作相應的自定義操做。vue

偵聽屬性是一個對象,它的鍵是要監聽的對象或者變量,值通常是函數,當偵聽的data數據發生變化時,會自定執行的對應函數,這個函數在被調用時,vue會傳入兩個形參,第一個是變化前的數據值,第二個是變化後的數據值。java

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.min.js"></script>
    <script>
      window.onload = function(){
         var vm = new Vue({
            el:"#app",
            data:{
                num:20
            },
            watch:{
                num:function(newval,oldval){
                    //num發生變化的時候,要執行的代碼
                    console.log("num已經發生了變化!");
                }
            }
        })
      }
    </script>
</head>
<body>
    <div id="app">
        <p>{{ num }}</p>
        <button @click="num++">按鈕</button>
    </div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <script src="js/filters.js"></script>
</head>
<body>

    <div id="app">
        <form action="">
            帳號:<input type="text" v-model="form.username"><span :style="user_style">{{user_text}}</span><br><br>
            密碼:<input type="password" v-model="form.password"><br><br>
            確認密碼:<input type="password" v-model="form.password2"><br><br>
        </form>
    </div>

    <script>

        var vm1 = new Vue({
            el:"#app",
            data:{
                form:{
                    username:"",
                    password:"",
                    password2:"",
                },
                user_style:{
                    color: "red",
                },
                user_text:"用戶名長度只能是4-10位"
            },
            // 監聽屬性
            // 監聽屬性的變化
            watch:{
                "form.username":function(value){
                    if(value.length>=4 && value.length<=10){
                        this.user_style.color="blue";
                        this.user_text="用戶名長度合法!";
                    }else{
                        this.user_style.color="red";
                        this.user_text="用戶名長度只能是4-10位!";
                    }
                }
            }
        })
    </script>

</body>
</html>
監聽小栗子 

3.5 vue對象的生命週期

每一個Vue對象在建立時都要通過一系列的初始化過程。在這個過程當中Vue.js會自動運行一些叫作生命週期的的鉤子函數,咱們可使用這些函數,在對象建立的不一樣階段加上咱們須要的代碼,實現特定的功能。ajax

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.min.js"></script>
    <script>
    window.onload = function(){
        var vm = new Vue({
            el:"#app",
            data:{
                num:0
            },
            beforeCreate:function(){
                console.log("beforeCreate,vm對象還沒有建立,num="+ this.num);  //undefined
                this.name=10; // 此時沒有this對象呢,因此設置的name無效,被在建立對象的時候被覆蓋爲0
            },
            created:function(){
                console.log("created,vm對象建立完成,設置好了要控制的元素範圍,num="+this.num );  // 0
                this.num = 20;
            },
            beforeMount:function(){
                console.log( this.$el.innerHTML ); // <p>{{num}}</p>
                console.log("beforeMount,vm對象還沒有把data數據顯示到頁面中,num="+this.num ); // 20
                this.num = 30;
            },
            mounted:function(){
                console.log( this.$el.innerHTML ); // <p>30</p>
                console.log("mounted,vm對象已經把data數據顯示到頁面中,num="+this.num); // 30
            },
            beforeUpdate:function(){
                // this.$el 就是咱們上面的el屬性了,$el表示當前vue.js所控制的元素#app
                console.log( this.$el.innerHTML );  // <p>30</p>
                console.log("beforeUpdate,vm對象還沒有把更新後的data數據顯示到頁面中,num="+this.num); // beforeUpdate----31
                
            },
            updated:function(){
                console.log( this.$el.innerHTML ); // <p>31</p>
                console.log("updated,vm對象已經把過呢更新後的data數據顯示到頁面中,num=" + this.num ); // updated----31
            },
        });
    }
    </script>
</head>
<body>
    <div id="app">
        <p>{{num}}</p>
        <button @click="num++">按鈕</button>
    </div>
</body>
</html>

總結:後端

在vue使用的過程當中,若是要初始化操做,把初始化操做的代碼放在 mounted 中執行。
mounted階段就是在vm對象已經把data數據實現到頁面之後。通常頁面初始化使用。例如,用戶訪問頁面加載成功之後,就要執行的ajax請求。

另外一個就是created,這個階段就是在 vue對象建立之後,把ajax請求後端數據的代碼放進 created
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <script src="js/filters.js"></script>
</head>
<body>

    <div id="app">
        {{user_text}}
    </div>

    <script>

        // vm初始化時會有如下幾個階段
        // 1. vm對象建立

        // 2. vm對象把數據添加到data屬性中

        // 3. vm對象顯示數據到視圖模板html頁面中

        var vm1 = new Vue({
            el:"#app",
            data:{
                user_text:"用戶名長度只能是4-10位"
            },
            // vm對象把數據添加到data屬性以前
            beforeCreate(){
                console.log("--------beforeCreate---------");
                console.log("$data=",this.$data);
                console.log("$el",this.$el);
                console.log("user_text="+this.user_text)
            },
            // vm對象把數據添加到data屬性以後
            created(){
                // 使用ajax到後端獲取數據給data
                console.log("----------created-------------");
                console.log("$data=",this.$data);
                console.log("$el",this.$el);
                console.log("user_text="+this.user_text)
            },
            // vm對象顯示數據到視圖模板html頁面以前
            // 若是執行 beforeMount,則表示vm對象已經獲取到模板ID對象
            beforeMount(){
                console.log("----------beforeMount-------------");
                console.log("$el",this.$el);
            },
            // vm對象顯示數據到視圖模板html頁面之後
            mounted(){
                // 使用ajax或者js在頁面刷新前,完成頁面修改的操做
                console.log("----------mounted-------------");
                console.log("$el",this.$el);
            }
        })
    </script>

</body>
</html>
生命週期小栗子

 

 

3.2 阻止事件冒泡和刷新頁面

使用.stop和.prevent數組

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box1{
            width: 200px;
            height: 200px;
            background: #ccc;
        }
        .box2{
            width: 100px;
            height: 100px;
            background: pink;
        }
    </style>
    <script src="js/vue.min.js"></script>
    <script>
    window.onload = function(){
        var vm = new Vue({
            el:"#app",
            data:{}
        })        
    }
    </script>
</head>
<body>
    <div id="app">
        <div class="box1" @click="alert('box1')">
            <div class="box2" @click.stop.prevent="alert('box2')"></div>   <!-- @click.stop來阻止事件冒泡 -->
        </div><form action="#">
            <input type="text">
            <input type="submit">
            <input type="submit" value="提交02" @click.prevent=""> <!-- @click.prevent來阻止表單提交 -->
        </form>
    </div></body>
</html>
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <script src="js/filters.js"></script>
</head>
<body>
    <div id="app">
        <form action="">
        帳號:<input type="text" v-model="user"><br><br>
        密碼:<input type="password" v-model="pwd"><br><br>
        <button @click.prevent="loginhander">登陸</button>
        </form>
    </div>

    <script>
        var vm1 = new Vue({
            el:"#app",
            data:{
                user:"",
                pwd:"",
            },
            methods:{
                loginhander(){
                    if(this.user.length<3 || this.pwd.length<3){
                        // 長度過短不能登陸
                        alert("長度過短不能登陸");
                    }else{
                        // 頁面跳轉
                        location.assign("http://www.baidu.com")
                    }
                }
            }
        })
    </script>

</body>
</html>
prevent
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.js"></script>
    <!--<script src="js/filters.js"></script>-->
    <style>
    .box1{
        width: 400px;
        height: 400px;
        background: red;
    }
    .box2{
        width: 150px;
        height: 150px;
        background: orange;
    }
    </style>
</head>
<body>
    <div id="app">
        <div class="box1" @click="show1">
            <div class="box2" @click="show2">
                <p @click.stop="show3">一段文本</p>
            </div>
        </div>
    </div>

    <script>
        var vm1 = new Vue({
            el:"#app",
            data:{},
            methods:{
                show1(){
                    console.log("box1");
                },
                show2(){
                    console.log("box2");
                },
                show3(){
                    console.log("點擊了p標籤");
                }
            }
        })
    </script>

</body>
</html>
stop

 

3.3 綜合案例-todolist

個人計劃列表app

html代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>todolist</title>
    <style type="text/css">
        .list_con{
            width:600px;
            margin:50px auto 0;
        }
        .inputtxt{
            width:550px;
            height:30px;
            border:1px solid #ccc;
            padding:0px;
            text-indent:10px;
        }
        .inputbtn{
            width:40px;
            height:32px;
            padding:0px;
            border:1px solid #ccc;
        }
        .list{
            margin:0;
            padding:0;
            list-style:none;
            margin-top:20px;
        }
        .list li{
            height:40px;
            line-height:40px;
            border-bottom:1px solid #ccc;
        }
​
        .list li span{
            float:left;
        }
​
        .list li a{
            float:right;
            text-decoration:none;
            margin:0 10px;
        }
    </style>
</head>
<body>
    <div class="list_con">
        <h2>To do list</h2>
        <input type="text" name="" id="txt1" class="inputtxt">
        <input type="button" name="" value="增長" id="btn1" class="inputbtn"><ul id="list" class="list">
            <!-- javascript:; # 阻止a標籤跳轉 -->
            <li>
                <span>學習html</span>
                <a href="javascript:;" class="up"></a>
                <a href="javascript:;" class="down"></a>
                <a href="javascript:;" class="del">刪除</a>
            </li>
            <li><span>學習css</span><a href="javascript:;" class="up"></a><a href="javascript:;" class="down"></a><a href="javascript:;" class="del">刪除</a></li>
            <li><span>學習javascript</span><a href="javascript:;" class="up"></a><a href="javascript:;" class="down"></a><a href="javascript:;" class="del">刪除</a></li>
        </ul>
    </div>
</body>
</html>
 

特效實現效果:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>todolist</title>
    <style type="text/css">
        .list_con{
            width:600px;
            margin:50px auto 0;
        }
        .inputtxt{
            width:550px;
            height:30px;
            border:1px solid #ccc;
            padding:0px;
            text-indent:10px;
        }
        .inputbtn{
            width:40px;
            height:32px;
            padding:0px;
            border:1px solid #ccc;
        }
        .list{
            margin:0;
            padding:0;
            list-style:none;
            margin-top:20px;
        }
        .list li{
            height:40px;
            line-height:40px;
            border-bottom:1px solid #ccc;
        }
​
        .list li span{
            float:left;
        }
​
        .list li a{
            float:right;
            text-decoration:none;
            margin:0 10px;
        }
    </style>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="todolist" class="list_con">
        <h2>To do list</h2>
        <input type="text" v-model="message" class="inputtxt">
        <input type="button" @click="addItem" value="增長" class="inputbtn">
        <ul id="list" class="list">
            <li v-for="item,key in dolist">
                <span>{{item}}</span>
                <a @click="upItem(key)" class="up" ></a>
                <a @click="downItem(key)" class="down"></a>
                <a @click="delItem(key)" class="del">刪除</a>
            </li>
        </ul>
    </div>
    <script>
    // 計劃列表代碼
    let vm = new Vue({
        el:"#todolist",
        data:{
            message:"",
            dolist:[
                "學習html",
                "學習css",
                "學習javascript",
            ]
        },
        methods:{
            addItem(){
                if(this.messsage==""){
                    return false;
                }
​
                this.dolist.push(this.message);
                this.message = ""
            },
            delItem(key){
                // 刪除和替換
                // 參數1: 開始下表
                // 參數2: 元素長度,若是不填默認刪除到最後
                // 參數3: 表示使用當前參數替換已經刪除內容的位置
                this.dolist.splice(key, 1);
            },
            upItem(key){
                if(key==0){
                    return false;
                }
                // 向上移動
                let result = this.dolist.splice(key,1);
                this.dolist.splice(key-1,0,result[0]);
            },
            downItem(key){
                // 向下移動
                let result = this.dolist.splice(key, 1);
                console.log(result);
                this.dolist.splice(key+1,0,result[0]);
            }
        }
    })
    </script>
</body>
</html>
View Code
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>todolist</title>
    <style type="text/css">
        .list_con{
            width:600px;
            margin:50px auto 0;
        }
        .inputtxt{
            width:550px;
            height:30px;
            border:1px solid #ccc;
            padding:0px;
            text-indent:10px; /*首行縮進10px*/
        }
        .inputbtn{
            width:40px;
            height:32px;
            padding:0px;
            border:1px solid #ccc;
        }
        .list{
            margin:0;
            padding:0;
            list-style:none;  /* list-style: none 設置列表標記的 默認會是實心圓點 設成none就是沒有標記 */
            margin-top:20px;
        }
        .list li{
            height:40px;
            line-height:40px;
            border-bottom:1px solid #ccc;
        }

        .list li span{
            float:left;
        }

        .list li a{
            float:right;
            text-decoration:none; /* text-decoration 屬性用來設置或刪除文本的裝飾。主要是用來刪除連接的下劃線 */
            margin:0 10px;
        }
    </style>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="todolist" class="list_con">
        <h2>To do list</h2>
        <input type="text" v-model="message" class="inputtxt">
        <input type="button" @click="addItem" value="增長" class="inputbtn">
        <ul id="list" class="list">
            <li v-for="item,key in dolist">
                <span>{{item}}</span>
                <a @click="upItem(key)" class="up" ></a>
                <a @click="downItem(key)" class="down"></a>
                <a @click="delItem(key)" class="del">刪除</a>
            </li>
        </ul>
    </div>
    <script>
    // 計劃列表代碼
    let vm = new Vue({
        el:"#todolist",
        data:{
            message:"",
            dolist:[
                "學習html",
                "學習css",
                "學習javascript",
            ]
        },
        methods:{
            addItem(){
                if(this.messsage==""){
                    return false;
                }

                this.dolist.push(this.message);
                this.message = ""
            },
            delItem(key){
                // 刪除和替換
                // 參數1: 開始下表
                // 參數2: 元素長度,若是不填默認刪除到最後
                // 參數3: 表示使用當前參數替換已經刪除內容的位置

                //x. splice(start, deleteCount, value, ...)
                //使用註解
                //x表明數組對象
                //splice的主要用途是對數組指定位置進行刪除和插入
                //start表示開始位置索引
                //deleteCount刪除數組元素的個數
                //value表示在刪除位置插入的數組元素
                //value參數能夠省略


                this.dolist.splice(key, 1);
            },
            upItem(key){
                if(key==0){
                    return false;
                }
                // 向上移動
                let result = this.dolist.splice(key,1);   //放回數組["學習javascript"]
                console.log(result)
                this.dolist.splice(key-1,0,result[0]);  //value表示在刪除位置插入的數組元素:result[0]
            },
            downItem(key){
                // 向下移動
                let result = this.dolist.splice(key, 1);
                console.log(result);
                this.dolist.splice(key+1,0,result[0]);
            }
        }
    })
    </script>
</body>
</html>
View Code
相關文章
相關標籤/搜索