1、什么是计算属性

  • 如果模板中的表达式存在过多的逻辑,那么模板会变得臃肿不堪,维护起来也异常困难,因此为了简化逻辑出现了计算属性;

    <template>
    <div id="example">
    <p>{{message.split(" ").reverse().join('!')}}</p>
    </div>
    </template>
    <script>
    export default {
    name: "example",
    data() {
    return {
    message : 'i am chinese person'
    };
    },
    methods : { },
    mounted(){ }
    };
    </script>

    上述表达式比较繁琐,因此我们采用计算属性实现

  • 特点:在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果就可以;
    <template>
    <div id="example">
    <p>源数据:{{message}}</p>
    <p>更改后的数据:{{changeMessage}}</p>
    </div>
    </template>
    <script>
    export default {
    name: "example",
    data() {
    return {
    message : 'i am chinese person'
    };
    },
    computed : {
    //getter方法
    changeMessage : function(){//无需进行声明
    return this.message.split(" ").reverse().join('!')
    }
    }
    };
    </script>

    结果为:

  • 计算属性拥有的两个方法:getter   setter   用来实现数据的双向绑定

    <template>
    <div id="example">
    <p>给定以下三个词语组成一句话</p>
    <span>{{combine}}</span>&nbsp;&nbsp;&nbsp;&nbsp;
    <span>{{mom}}</span>&nbsp;&nbsp;&nbsp;&nbsp;
    <span>{{dad}}</span>&nbsp;&nbsp;&nbsp;&nbsp;
    <p style="padding:12px 0">答案为:{{result}}</p>
    <button @click="btn">改变语句</button>
    </div>
    </template>
    <script>
    export default {
    name: "example",
    data() {
    return {
    mom: "妈妈",
    dad: "爸爸",
    combine: "组成了一个家"
    };
    },
    computed: {
    result : {//与不写get set方法的形式有区别
    //一个计算属性的getter
    get : function(){//三个值变化的时候,result的值会自动更新,也会自动更新DOM结构
    return this.mom + this.dad + this.combine
    },
    // 一个计算属性的setter
    set : function(newVal){//当设置result的时候,其他的值也会相应的发生改变
    this.mom = newVal.substr(0,2);
    this.dad = newVal.substr(2,2);
    this.combine = newVal.substr(4)
    }
    }
    },
    methods : {
    btn(){
    this.result = "医生警察为人民服务"
    }
    }
    };
    </script>

    首次渲染结果为:

      点击按钮结果为:

 2、计算属性缓存(最大的特点)-----属性变化才执行getter函数,否则使用缓存  默认为true使用缓存

  • 作用:如果频繁的使用计算属性,而计算属性方法中有大量的耗时操作(例如getter中循环一个大的数组以执行很多操作),会带来一些性能问题;

    <template>
    <div id="example">
    <p>给定以下三个词语组成一句话</p>
    <span>{{combine}}</span>&nbsp;&nbsp;&nbsp;&nbsp;
    <span>{{mom}}</span>&nbsp;&nbsp;&nbsp;&nbsp;
    <span>{{dad}}</span>&nbsp;&nbsp;&nbsp;&nbsp;
    <p style="padding:12px 0">答案为:{{result}}</p>
    <button @click="btn">改变语句</button>
    </div>
    </template>
    <script>
    export default {
    name: "example",
    data() {
    return {
    mom: "妈妈",
    dad: "爸爸",
    combine: "组成了一个家"
    };
    },
    computed: {
    result : {//与不写get set方法的形式有区别
    //一个计算属性的getter
    cache: true,//打开缓存
    get : function(){//三个值变化的时候,result的值会自动更新,也会自动更新DOM结构
    return new Date().getTime() + this.mom + this.dad + this.combine
    },
    // 一个计算属性的setter
    set : function(newVal){//当设置result的时候,其他的值也会相应的发生改变
    this.mom = newVal.substr(0,2);
    this.dad = newVal.substr(2,2);
    this.combine = newVal.substr(4)
    }
    }
    },
    methods : {
    btn(){
    this.result = "医生警察为人民服务"
    }
    }
    };
    </script>

3、使用过程中遇到的问题

  • 计算属性getter不执行的场景

    • 当包含计算属性的节点被移除并且模板当中其他地方没有在引用该属性时,对应的getter不会再执行;

      <template>
      <div id="example">
      <button @click="btn">总价格的显示隐藏</button>
      <p v-if="showTotal">总价格是:{{totalPrice}}</p>
      </div>
      </template>
      <script>
      export default {
      name: "example",
      data() {
      return {
      showTotal : true,
      basePrice : 100,
      };
      },
      computed: {
      totalPrice : {
      get : function(){
      return this.basePrice * 99
      }
      }
      },
      methods: {
      btn(){
      this.showTotal = !this.showTotal
      }
      }
      };
      </script>

      在本程序中,p元素移除后,计算属性在别的地方不会再被使用,因此getter方法不会被执行;若每次都不执行,请加入缓存cache:false

    • 当节点移除,其他地方使用计算属性时:
      <template>
      <div id="example">
      <p>{{totalPrice}}</p>
      <button @click="btn">总价格的显示隐藏</button>
      <p v-if="showTotal">总价格是:{{totalPrice}}</p>
      </div>
      </template>
      <script>
      export default {
      name: "example",
      data() {
      return {
      showTotal : true,
      basePrice : 100,
      };
      },
      computed: {
      totalPrice : {
      cache : false,
      get : function(){
      console.log(1)
      return this.basePrice * 99
      }
      }
      },
      methods: {
      btn(){
      this.showTotal = !this.showTotal
      }
      }
      };
      </script>

      每次都执行getter

简述Vue中的计算属性的更多相关文章

  1. Vue学习之vue中的计算属性和侦听器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. Vue中的计算属性与$watch

    计算属性:在模板中绑定表达式是非常便利的,但是他们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么vue.js将绑定表达式限制为一个表达式. ...

  3. Vue中的计算属性和监听器(computed 与 watch)

    react中数据是单向绑定的,而vue中数据是双向绑定的.为什么? 在react中,主要是通过setState 去改变state的值:而在vue中,会自动的触发set 与get 改变属性的值. 在vu ...

  4. 浅谈vue中的计算属性和侦听属性

    计算属性 计算属性用于处理复杂的业务逻辑 计算属性具有依赖性,计算属性依赖 data中的初始值,只有当初始值改变的时候,计算属性才会再次计算 计算属性一般书写为一个函数,返回了一个值,这个值具有依赖性 ...

  5. 怎样理解 Vue 中的计算属性 computed 和 methods ?

    需求: 在 Vue 中, 我们可以像下面这样通过在 引号 或 双花括号 内写 js 表达式去做一些简单运算, 这是可以的, 不过这样写是不直观的, 而且在 html 中 夹杂 一些运算逻辑这种做法其实 ...

  6. Vue中computed(计算属性)、methods、watch的区别

    实现效果:字符串的动态拼接 methods方法 html: <div id="app"> <!-- 监听到文本框数据的改变 --> <input ty ...

  7. Vue中的计算属性

    一.什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护. 二.计算属性的用法 在一个计算属性里可以完成各种复杂的逻辑,包括运算.函 ...

  8. Vue中computed计算属性

    话不多说,使用方法直接上代码//在模板中调用computedTest这个函数,切记不要在函数后添加()<template> <div class="home"&g ...

  9. vue中computed计算属性与methods对象中的this指针

    this 指针问题 methods与computed中的this指针 应该指向的是它们自己,可是为什么this指针却可以访问data对象中的成员呢? 因为new Vue对象实例化后data中的成员和c ...

随机推荐

  1. 使用Medusa美杜莎暴力破解SSH密码

    使用Medusa美杜莎暴力破解SSH密码 1.Medusa简介 Medusa(美杜莎)是一个速度快,支持大规模并行,模块化的爆力破解工具.可以同时对多个主机,用户或密码执行强力测试.Medusa和hy ...

  2. socket keepalive 服务端异常断线

    异常断线  客户端检测不到  没有重连

  3. FAT12

    FAT12 is one of FAT file system families,mostly used on 1.44MB floppy disk. FAT 's full name is File ...

  4. DevExpress v18.2版本亮点——Analytics Dashboard篇(一)

    行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...

  5. redis面试题集錦

    1为什么Redis需要把所有数据放到内存中? Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘.所以Redis具有快速和数据持久化的特性.如果不将数据放到内存中,磁盘 ...

  6. java web中乱码的种类和一些解决方式

    在java web课堂测试中遇到了一些乱码问题 ,从百度上找到了许多种解决方法和乱码的种类,在这里总结一下. 一.文件出现乱码 [右击文件]->[Properties]->[Resourc ...

  7. 【leetcode】523. Continuous Subarray Sum

    题目如下: 解题思路:本题需要用到这么一个数学定理.对于任意三个整数a,b,k(k !=0),如果 a%k = b%k,那么(a-b)%k = 0.利用这个定理,我们可以对数组从头开始进行求和,同时利 ...

  8. logstash+redis收集负载均衡模式下多台服务器的多个web日志

    一.logstash的简介 一般我们看日志来解决问题的时候要么 tail+grep 要么 把日志下载下来再搜索,可以应付不多的主机和应用不多的部署场景.但对于多机多应用部署就不合适了.这里的多机多应用 ...

  9. css雪碧图-css精灵图

    先将图片拼接在一张图上.类似实现的效果图 图片地址为合并后的图片地址,通过background-position调整背景图的位置.效果如: HTML: <div class="logo ...

  10. 【rust】Rust 的构建系统和包管理工具Cargo认识并初步使用(2)

    Cargo 是 Rust 的构建系统和包管理工具,同时 Rustacean 们使用 Cargo 来管理它们的 Rust 项目.Cargo 负责三个工作:构建你的代码,下载你代码依赖的库并编译这些库.我 ...