computed计算属性

computed计算属性的作用是对数据的计算和缓存,优点是能够提高性能

基本使用

 1 <template>
 2   <div>
 3   <p>{{reverseStr}}</p>
 4 
 5   </div>
 6 </template>
 7 <script>
 8   export default {
 9     data(){
10       return{
11         str:"hello world"
12       }
13     },
14     computed:{
15       reverseStr(){
16         return this.str.split("").reverse().join("")
17       }
18     }
19   }
20 </script>
21 
22 <style lang="scss" scoped>
23 
24 </style>

需要注意点是模板中使用的就是返回的计算属性

 

 

 

使用计算属性需要注意点两个点,第一个是必须要有return返回,如果没有return会报错。第二个,要有依赖属性

 1 <template>
 2   <div>
 3   <p>{{reverseStr}}</p>
 4 <p>
 5 {{reverStr()}}</p>
 6   </div>
 7 </template>
 8 <script>
 9   export default {
10     data(){
11       return{
12         str:"hello world"
13       }
14     },
15     methods:{
16        reverStr(){
17          return this.str.split("").reverse().join("")
18       }
19     },
20     computed:{
21       reverseStr(){
22         return this.str.split("").reverse().join("")//没有这个依赖,就和普通的methods没有什么区别
23       }
24     }
25   }
26 </script>
27 
28 <style lang="scss" scoped>
29 
30 </style>

 

此时我们会看到二者实现的功能一样

 

 

 

上面的代码也能实现计算属性的功能,有什么区别?

答:缓存

计算属性侦听的是对应的依赖属性,如果依赖属性没有发生变化,此时就会将缓存的结果抛出,优点就是大大的增加加载性能

 

我们看下面的一个案例

 1 <template>
 2   <div>
 3   <p>{{reverseStr}}</p>
 4   <p>{{reverStr()}}</p>
 5   </div>
 6 </template>
 7 <script>
 8   export default {
 9     data(){
10       return{
11         str:"hello world"
12       }
13     },
14     methods:{
15        reverStr(){
16          console.log(Date.now(),'普通methods')
17          return this.str.split("").reverse().join("")
18       }
19     },
20     computed:{
21       reverseStr(){
22          console.log(Date.now(),'计算属性computed')
23 
24         return this.str.split("").reverse().join("")//没有这个依赖,就和普通的methods没有什么区别
25       }
26     }
27   }
28 </script>
29 
30 <style lang="scss" scoped>
31 
32 </style>

并且在对应的函数中输入Date.now(),我们可以看到控制要对应的输出时间的变化

 

 

 我们此时将计算属性的使用和普通methods的使用都增加几次

 1  <div>
 2   <p>{{reverseStr}}</p>
 3   <p>{{reverseStr}}</p>
 4   <p>{{reverseStr}}</p>
 5 
 6   <p>{{reverStr()}}</p>
 7   <p>{{reverStr()}}</p>
 8   <p>{{reverStr()}}</p>
 9 
10   </div>

此时我们再看浏览器

 

 

 computed只输出了一次,说明computed利用缓存进行判断,发现依赖的str没有发生变化,所以直接抛出结果了,没有再次编译。

computed除了能够获取属性值,还可以进行设置,书写方法,是将computed内部的函数变为对象,然后增加get和set函数

我们看下面的一个案例

 1 <template>
 2   <div>
 3     <table>
 4       <tr>
 5         <td><input v-model="isChecked" type="checkbox">全选</td>
 6         <td>产品名称</td>
 7         <td>产品单价</td>
 8         <td>产品数量</td>
 9         <td>金额</td>
10       </tr>
11       <tr v-for="(item,index) in dataList" :key="index">
12         <td><input v-model="item.isCheck" type="checkbox"></td>
13         <td>{{item.name}}</td>
14         <td>{{item.price}}</td>
15         <td><input :min="0" v-model="item.num" @input="changePri(item.num,index)" type="number" style="width:40px;"></td>
16         <td>¥{{item.amount}}</td>
17       </tr>
18     </table>
19     <p style="color:red;">
20      总价:¥{{totalPrice}}
21     </p>
22   </div>
23 </template>
24 
25 <script>
26   export default {
27     data() {
28       return {
29         dataList:[
30           {isCheck: false, name:'苹果',price:'10',num:0, amount:0},
31           {isCheck: false, name:'香蕉',price:'20',num:0, amount:0},
32           {isCheck: false, name:'草莓',price:'30',num:0, amount:0},
33         ]
34       }
35     },
36     methods:{
37       changePri(num,index) {
38         //修改对应的金额
39         this.dataList[index].amount = this.dataList[index].price * num;
40       }
41     },
42     // 计算总价
43     computed:{
44       totalPrice() {
45         let price = null
46         for(var item of this.dataList) {
47           if(item.isCheck) {
48             price += item.amount
49           }
50         }
51         return price
52       },
53       // 判断是否全选
54       isChecked:{
55         // 设置状态
56         set(val) {
57           // 设置内容
58           if(val) {
59             this.dataList.map((item)=>item.isCheck = true)
60           } else {
61             this.dataList.map((item)=>item.isCheck = false)
62           }
63         },
64         // 获取侦听
65         get() {
66           for(var item of this.dataList) {
67             if(!item.isCheck) {
68               return false;
69             }
70           }
71           return true
72         }
73       }
74     }
75   }
76 </script>
77 
78 <style>
79   td{
80     padding: 0 15px;
81   }
82 </style>

 

 
posted @ 2021-09-15 21:04  keyeking  阅读(3242)  评论(0编辑  收藏  举报