vue的computed计算属性(getter、setter)、计算属性的缓存

vue计算属性:对于任何复杂逻辑,都选择使用计算属性

<body>
  <div id="app">
  <!--计算属性引用时不用加(),把其当作一个属性-->
    <h2>{{totalPrice}}</h2>
  </div>
  <script src="../js/vue.js"></script>
  <script>
    var vm=new Vue({
      el:'#app',
      data:{
        books:[
          {id:110,name:"unix",price:119},
          {id:111,name:"unix",price:105},
          {id:112,name:"unix",price:98},
          {id:113,name:"unix",price:87},
        ]
      },
      computed:{
        totalPrice:function(){
          //计算books的总价
         let result = 0;
         for(let i = 0;i<this.books.length;i++){
           result +=this.books[i].price
         }
         return result;
        }
      }
    })
  </script>
</body>

处理总和更简洁的写法:

         let result =0;
          for (let i in this.books){
            result+=this.books[i].price;
          }
          return result;
          let result =0;
          //book直接为数组中的每一项
          for (let book of this.books){
            result+=book.price;
          }
          return result;

reduce():计算数组元素相加后的总和.

 totalPrice:function(){
          return this.books.reduce((sum,cur)=>{
            return sum + cur.price
          },0)
        }
 //在该方法中,cur依次为books中的每一项,而sum初始为0,开始与cur累加

计算属性实现字符串拼接:

  <div id="app">
    <h2>{{fullName}}</h2>
  </div>
  
  <script src="../js/vue.js"></script>
  <script>
    var vm=new Vue({
      el:'#app',
      data:{message:'你好',firstName:'Lebron',lastName:'James'},
      computed:{
        fullName:function(){
          return this.firstName + ' '+ this.lastName
        }
      }
    })
  </script>

计算属性的setter和getter

计算属性按照属性的方式使用,即引用时{{fullname}}而不是{{fullname()}},原因:(修改上面拼接字符串的代码)

fullName属性对应的是一个对象,相当于在computed对象中定义一个属性fullName,对应的依旧是一个对象,
所以使用fullName属性,就写成{{fullName}}.
计算属性中会有一个set方法、一个get方法,完整的计算属性应该写成下面的样子:
       // 需要获取fullName的值的时候,就会调用get方法,
       //所以页面显示的时abc,修改return的值就会更改fullName的值。
      computed: {
        // 计算属性的底层:
        fullName: {
          set: function () {
          },
          // 需要获取fullName的值的时候,就会调用get方法,
          //所以页面显示的时abc,修改return的值就会更改fullName的值。
          get: function () {
           return 'abc'
           //return this.firstName + ' '+ this.lastName
          }
        }
      }

一般不会使用到set,因为计算属性的目的就是计算到一个值然后返回结果,set是设置计算属性的值,可以删掉只写get也是可以的,变成一个只读属性:

      computed: {
        fullName: {
          get: function () {
            return 'abc'
          }
        }
      }

当没有set方法时,代码可以简写,直接写成:(最初使用的书写方式)

      computed: {
        fullName: function () {
            return 'abc'
          }
      }

也可以加上set方法:

      computed: {
        fullName: {
          set: function () {
            console.log('--调用了set方法');
          }, 
          get: function () {
            return 'abc'
          }
        } 

在调试工具中修改fullName的值,查看调用了set方法:
在这里插入图片描述
使用一下fullName的set方法:

        fullName: {
          set: function (newValue) {//传入一个参数
            console.log('--调用了set方法',newValue);
            const name = newValue.split(' ');
            this.firstName =  name[0];
            this.lastName = name[1];
            console.log(this.firstName);
            console.log(this.lastName);
          },
          get: function () {
            return this.firstName + ' '+ this.lastName;
          }
          }

在控制台进行操作,通过修改vm.fullName的值,在set方法中进行处理修改this.firstName与this.lastName的值,来修改页面显示的fullName.
在这里插入图片描述

计算属性与methods的对比(计算属性的缓存):

计算属性会进行缓存,多次使用时计算属性只会调用一次,methods中方法使用几次就调用几次。

<body>
  <div id="app">
    <!-- 1 -->
    <h2>{{firstName}}{{lastName}}</h2>
    <!-- 使用methods -->
    <h2>{{getFullName()}}</h2>
    <h2>{{getFullName()}}</h2>
    <h2>{{getFullName()}}</h2>
    <!-- 使用computed -->
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
  </div>
  
  <script src="../js/vue.js"></script>
  <script>
    var vm=new Vue({
      el:'#app',
      data:{message:'你好',firstName:'Lebron',lastName:'James'},
      methods:{
        getFullName:function(){
          console.log('调用了methods');
          return this.firstName + ' '+ this.lastName
        }
      },
      computed:{
        fullName:function(){
          console.log('调用了computed');
          return this.firstName + ' '+ this.lastName
        }
      }
    })
  </script>
</body>

运行结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值