VUE课程参考---17、计算属性

VUE课程参考---17、计算属性

一、总结

一句话总结:

vue的计算属性可以用来根据vue中data中的值的变化,自动变化计算的值,比如fullname变化的时候自动更新firstname和lastname,计算属性可以用来简化模板中的的复杂的js表达式
computed:{
fullName:function () {
    console.log('fullName');
    return this.firstName+'-'+this.lastName;
},
//这里是对象
fullName3:{
    // 当获取当前属性值时自动调用, 将返回值(根据相关的其它属性数据)作为属性值
    get:function() {
        console.log('fullName3-get');
        return this.firstName+'-'+this.lastName;
    },
    // 当属性值发生了改变时自动调用, 监视当前属性值变化, 同步更新相关的其它属性值
    set:function(value) {
        console.log('fullName3-set');
        const names = value.split('-');
        this.firstName = names[0];
        this.lastName = names[1];
    }
},

1、vue的计算属性的写法形式?

1、只写get:computed里面放一个函数:例如fullName:function (){}
2、get和set一起写:computed里面放一个对象:例如fullName3:{get:function(){},set:function(value){}}
computed:{
fullName:function () {
    console.log('fullName');
    return this.firstName+'-'+this.lastName;
},
//这里是对象
fullName3:{
    // 当获取当前属性值时自动调用, 将返回值(根据相关的其它属性数据)作为属性值
    get:function() {
        console.log('fullName3-get');
        return this.firstName+'-'+this.lastName;
    },
    // 当属性值发生了改变时自动调用, 监视当前属性值变化, 同步更新相关的其它属性值
    set:function(value) {
        console.log('fullName3-set');
        const names = value.split('-');
        this.firstName = names[0];
        this.lastName = names[1];
    }
},

2、方法和计算属性的区别?

VUE中的方法和计算属性可以实现同样的功能,区别就是计算属性有基于响应式依赖的缓存(也就是计算属性依赖的数据改变缓存才会改变),而方法没有,需要缓存的话就用计算属性。
<div id="app">
    <p>Original message: "{{ message }}"</p>
    <hr>
    <p>计算属性1: "{{ reversedMessage }}"</p>
    <p>计算属性2: "{{ reversedMessage }}"</p>
    <p>计算属性3: "{{ reversedMessage }}"</p>
    <hr>
    <p>方法1: "{{ reversedMessage2() }}"</p>
    <p>方法2: "{{ reversedMessage2() }}"</p>
    <p>方法3: "{{ reversedMessage2() }}"</p>
</div>
<script src="../js/vue.js"></script>
<script>
    let vm = new Vue({
        el: '#app',
        data: {
            message: '我有一只小毛驴,我永远也不骑'
        },
        computed: {
            // 计算属性的 getter
            reversedMessage: function () {
                // `this` 指向 vm 实例
                console.log('计算属性:reversedMessage');
                for (let i=1;i<=100000;i++){

                }
                return this.message.split('').reverse().join('')+''+Date.now();
            }
        },
        methods: {
            //用方法实现同样功能
            reversedMessage2: function () {
                console.log('方法:reversedMessage2');
                for (let i=1;i<=100000;i++){

                }
                return this.message.split('').reverse().join('')+''+Date.now();
            }
        }
    });
</script>

3、vue中计算属性为什么要有缓存?

假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A。如果没有缓存,我们将不可避免的多次执行 A 的 getter!

二、计算属性

博客对应课程的视频位置:

1、计算属性

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>计算属性</title>
 6 </head>
 7 <body>
 8 <!--
 9 
10 vue的计算属性可以用来根据vue中data中的值的变化,自动变化计算的值,比如fullname变化的时候自动更新firstname和lastname,计算属性可以用来简化模板中的的复杂的js表达式
11 
12 vue的计算属性的写法形式
13 1、只写get:computed里面放一个函数:例如fullName:function (){}
14 2、get和set一起写:computed里面放一个对象:例如fullName3:{get:function(){},set:function(value){}}
15 
16 
17 
18 -->
19 <div id="app">
20     <label>
21         FirstName:<input type="text" v-model="firstName"><br>
22     </label>
23     <label>
24         LastName:<input type="text" v-model="lastName"><br>
25     </label>
26     <label>
27         FullName(计算属性(单向)):<input type="text" v-model="fullName"><br>
28     </label>
29     <label>
30         FullName2(使用方法):<input type="text" :value="calcFullName()"><br>
31     </label>
32     <label>
33         FullName3(计算属性(双向)):<input type="text" v-model="fullName3"><br>
34     </label>
35 </div>
36 <script src="../js/vue.js"></script>
37 <script>
38     let vm = new Vue({
39         el: '#app',
40         data: {
41             firstName:'',
42             lastName:'',
43         },
44         methods:{
45             calcFullName:function () {
46                 console.log('calcFullName');
47                 return this.firstName+'-'+this.lastName;
48             }
49         },
50         computed:{
51             fullName:function () {
52                 console.log('fullName');
53                 return this.firstName+'-'+this.lastName;
54             },
55             //这里是对象
56             fullName3:{
57                 // 当获取当前属性值时自动调用, 将返回值(根据相关的其它属性数据)作为属性值
58                 get:function() {
59                     console.log('fullName3-get');
60                     return this.firstName+'-'+this.lastName;
61                 },
62                 // 当属性值发生了改变时自动调用, 监视当前属性值变化, 同步更新相关的其它属性值
63                 set:function(value) {
64                     console.log('fullName3-set');
65                     const names = value.split('-');
66                     this.firstName = names[0];
67                     this.lastName = names[1];
68                 }
69             }
70         }
71     });
72 </script>
73 </body>
74 </html>

2、计算属性和方法的区别

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>计算属性和方法的区别</title>
 6 </head>
 7 <body>
 8 <!--
 9 1、
10 计算属性和方法的区别
11 VUE中的方法和计算属性可以实现同样的功能,
12 区别就是计算属性有基于响应式依赖的缓存,而方法没有,
13 需要缓存的话就用计算属性。
14 
15 2、
16 vue中计算属性为什么要有缓存
17 假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A。如果没有缓存,我们将不可避免的多次执行 A 的 getter!
18 
19 
20 -->
21 <div id="app">
22     <p>Original message: "{{ message }}"</p>
23     <hr>
24     <p>计算属性1: "{{ reversedMessage }}"</p>
25     <p>计算属性2: "{{ reversedMessage }}"</p>
26     <p>计算属性3: "{{ reversedMessage }}"</p>
27     <hr>
28     <p>方法1: "{{ reversedMessage2() }}"</p>
29     <p>方法2: "{{ reversedMessage2() }}"</p>
30     <p>方法3: "{{ reversedMessage2() }}"</p>
31 </div>
32 <script src="../js/vue.js"></script>
33 <script>
34     let vm = new Vue({
35         el: '#app',
36         data: {
37             message: '我有一只小毛驴,我永远也不骑'
38         },
39         computed: {
40             // 计算属性的 getter
41             reversedMessage: function () {
42                 // `this` 指向 vm 实例
43                 console.log('计算属性:reversedMessage');
44                 for (let i=1;i<=100000;i++){
45 
46                 }
47                 return this.message.split('').reverse().join('')+''+Date.now();
48             }
49         },
50         methods: {
51             //用方法实现同样功能
52             reversedMessage2: function () {
53                 console.log('方法:reversedMessage2');
54                 for (let i=1;i<=100000;i++){
55 
56                 }
57                 return this.message.split('').reverse().join('')+''+Date.now();
58             }
59         }
60     });
61 </script>
62 </body>
63 </html>

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/12735701.html