Vue——计算属性

1.什么是计算属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="myapp">
        {{ text.split(',').reverse().join('??') }}
    </div>
    <!--如果表达式很长或者逻辑过于复杂,就会变得臃肿不堪,所以可以定义一个计算属性-->
    <div id="app">
        {{ reverseText }}
    </div>
    <script>
        var myapp = new Vue({
            el: "#myapp",
            data: {
                text: '123,456,789'
            }
        });
        var app = new Vue({
            el: "#app",
            data: {
                text:'123,456,789'
            },
            computed: {
                reverseText: function () {
                    return this.text.split(',').reverse().join('||')
                }
            }
        })
    </script>
</body>
</html>

 

2.计算属性的简单用法

在一个计算属性里面可以完成各种复杂的逻辑,包括运算、函数调用等只要最终返回一个结果就可以了。
除此之外,计算属性还可以依赖多个Vue实例的数据,只要其中一个数据变化,计算属性就会重新执行。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="app">
        总价:{{ prices }}
    </div>
    <script>
        var app = new Vue({
            el: "#app",
            data: {
                package1: [
                    {
                        name: 'iphone7',
                        price: 6999,
                        count: 2
                    },
                    {
                        name: 'ipad',
                        price: 2999,
                        count: 2
                    }
                ],
                package2: [
                    {
                        name: 'apple',
                        price: 3,
                        count: 5
                    },
                    {
                        name: 'banana',
                        price: 2,
                        count: 10
                    }
                ]
            },
            computed:{
                prices:function () {
                    var prices = 0;
                    for (var i = 0; i < this.package1.length; i++){
                        prices += this.package1[i].price * this.package1[i].count;
                    }
                    for (var j = 0; j < this.package2.length; j++) {
                        prices += this.package2[j].price * this.package2[j].count;
                    }
                    return prices

                }
            }

        })
    </script>
</body>
</html>

效果:

每一个计算属性都包含一个getter和一个setter,默认只利用getter。
当我们要手动修改计算属性的时候,就可以定义一个setter,这样在修改计算属性的时候就会自动触发setter。
绝大多数情况下只会用到getter,所以不需要将二者都进行声明。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="app">
        姓名:{{ fullName }}
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                firstName: 'Kobe',
                lastName: 'Bryant'
            },

            computed: {
                fullName: {
                    // 当我们输入app.fullName = 'LeBron James',就会调用setter
                    get: function () {
                        return this.firstName + " " + this.lastName
                    },
                    set: function (newValue) {
                        var names = newValue.split(' ');
                        this.firstName = names[0];  //firstname发生改变,计算属性也会发生相应的改变
                        this.lastName = names[names.length -1];
                    }
                }
            },

        })
    </script>
</body>
</html>

此外,计算属性还可以依赖其它计算属性,而且可以依赖其它Vue实例的数据。

 

3.计算属性缓存

我们发现使用methods也可以实现相同的效果,二者到底有什么不同?

计算属性是基于它的依赖缓存的,一个计算属性所依赖的数据发生变化时,他才会重新取值,所以只要text不改变,计算属性就不会发生改变.
使用计算属性还是methods取决于你是否需要缓存,当遍历大数组和需要进行大量计算时应当使用计算属性。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.min.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="app01">{{ reverseText() }}</div>
    <div id="app02">{{ reverseText }}</div>
    <script>
        var app01 = new Vue({
            el: "#app01",
            data: {
                text: '1,2,3,4,5,6'
            },
            methods: {
                reverseText: function () {
                    return this.text.split(',').reverse().join('|')
                }
            }
        });

        var app02 = new Vue({
            el: "#app02",
            data: {
                text: '1,2,3,4,5,6'
            },
            computed: {
                reverseText: function () {
                    return this.text.split(',').reverse().join('|')
                }
            }
        })

    </script>
</body>
</html>

 

4.计算属性、方法和监听器

<div id="app">
    {{ fullName }}
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            firstName: "rongkai",
            lastName: "zhang",
            fullName: "rongkai zhang"
        },
        // computed: {
        //     fullName: function () {
        //         console.log("计算了一次");  //只要依赖的变量没有发生任何改变的时候,就会一直使用缓存,而不需要重新计算
        //         return this.firstName + " " + this.lastName
        //     }
        // },
        // methods: {
        //     fullName: function () {
        //         console.log("计算了一次");  //页面只要被渲染方法就会被执行一次
        //         return this.firstName + " " + this.lastName
        //     }
        // },
        watch: {  //监听器也是需要依赖缓存的
            firstName: function () {  //如果firstname发生改变就会执行下面的代码
                console.log("计算了一次");
                this.fullName = this.firstName + " " + this.lastName
            },
            lastName: function () {
                console.log("计算了一次");
                this.fullName = this.firstName + " " + this.lastName
            }
        }
    })
</script>

 

posted @ 2020-04-12 19:03  明王不动心  阅读(318)  评论(0编辑  收藏  举报