1. 程式人生 > >vue07-計算屬性/方法/偵聽器

vue07-計算屬性/方法/偵聽器

有一個場景,我們定義兩個變數firstName,lastName,要自動計算出fullName。

1.我們可以用method方法計算,如下面程式碼,這樣有一個缺點,每次呼叫都要計算,firstName與lastName沒有修改,也需要計算才能拿到fullName

<!DOCTYPE html>
<html lang=en>

<head>
    <meta charset="utf-8" />
    <title>Hello world</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="root">
        {{fullName()}}
        {{age}}
    </div>


    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                firstName: "xu",
                lastName: "haixing",
                age: 25
            },
            methods:{
                fullName: function(){
                     return this.firstName+" "+this.lastName;
                }
            }
        })
    </script>
</body>

</html>

2.vue中的computed屬性,首先vue會在data中找fullName屬性,沒有找到,便會去computed中拿,存在快取,如果依賴的屬性值沒有變化,則不會重新計算。

<!DOCTYPE html>
<html lang=en>

<head>
    <meta charset="utf-8" />
    <title>Hello world</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="root">
        {{fullName}}
        {{age}}
    </div>


    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                firstName: "xu",
                lastName: "haixing",
                age: 25
            },
            //計算屬性  有快取,如果依賴的屬性沒有變化,不會重新計算
            computed:{
                fullName: function(){
                   console.log("計算了一次");
                   return this.firstName+" "+this.lastName;
               }
             }

        })
    </script>
</body>

</html>

看測試,當依賴的屬性改變時,會自動計算出fullName的值

3.watch 偵聽器,也是變化時會計算,但是寫法要比computed麻煩很多,所以建議用computed計算屬性。

<!DOCTYPE html>
<html lang=en>

<head>
    <meta charset="utf-8" />
    <title>Hello world</title>
    <script src="vue.js"></script>
</head>

<body>
    <div id="root">
        {{fullName}}
        {{age}}
    </div>


    <script>
        var vm = new Vue({
            el: "#root",
            data: {
                firstName: "xu",
                lastName: "haixing",
                age: 25,
                fullName: "xu haixing"
            },
            //偵聽器實現
            watch: {
                firstName: function () {
                    console.log("偵聽器計算了一次");
                    this.fullName = this.firstName + " " + this.lastName;
                },
                lastName: function () {
                    console.log("偵聽器計算了一次");
                    this.fullName = this.firstName + " " + this.lastName;
                }
            }
        })
    </script>
</body>

</html>