导读

在一些时候,我们会在模板中一些数据。会处理过多的逻辑。这个时候就非常的不好看,也难以维护。比如像下面的代码:

<div id="app">{{ message.split('').reverse().join('') }}
</div>

像这个数据就要做三步的处理。先把数据转换为数组。再将数组翻转,然后再将数组连接起来。这样看起来就会非常的麻烦,当我们处理复杂逻辑时,都应该使用计算属性。尤其是在这种情况下,下面我们来讲一下计算属性的基础用法。

基础用法

计算属性是vivo配置对象中的属性,使用方法如下:

<div id="app"><!-- 计算属性的值可以像data数据一样,直接被使用 --> {{ someComputed }}
</div>
const vm = new Vue({el: '#app',computed: {// 返回的值,就是计算属性的值someComputed () {return 'some values'}}
})

例如,我们想要获取到一串字符串的翻转字符串,我们可以利用计算属性来做:

<div id="app"><p>原始字符串: "{{ msg }}"</p><p>翻转字符处啊: "{{ reversedMsg }}"</p>
</div>
const vm = new Vue({el: '#app',data: {msg: 'Hello'},computed: {reversedMsg: function () {return this.msg.split('').reverse().join('');}}
})

我们可以看到,reversedMsg的值取决于msg的值,所以,当我们更改msg的值是,reversedMsg的值也会随之更改。

计算属性 vs 方法

其实,我们上述的功能,利用方法也可以实现,如:

<div id="app"><p>原始字符串: "{{ msg }}"</p><p>翻转字符串: "{{ reversedMsg() }}"</p>
</div>
const vm = new Vue({el: '#app',data: {msg: 'Hello'},methods: {reversedMsg: function () {return this.msg.split('').reverse().join('');}}
})

虽然在表达式中调用方法也可以实现同样的效果,但是使用计算属性和使用方法有着本质的区别。 当使用方法时,每一次页面重新渲染,对应的方法都会重新执行一次,如:

<div id="app"><p>{{ name }}</p><p>{{ reversedMsg() }}</p>
</div>
const vm = new Vue({el: '#app',data: {msg: 'Hello',name: 'shanshan'},methods: {reversedMsg: function () {console.log('方法执行啦');return this.msg.split('').reverse().join('');}}
})
vm.name = 'duyi';

在上面的例子中我们可以看到,一旦更改name的值,页面会重新渲染,此刻控制台中打印出方法执行啦这串字符串,代表着reversedMsg这个函数执行了,但是我们并不需要该方法执行,因为改动的数据和这个函数没有任何关系,如果这个函数内的逻辑很复杂,那么对于性能来讲,也是一种消耗。

但是利用计算属性做,就不会有这样的现象出现,如:

const vm = new Vue({el: '#app',data: {msg: 'Hello',name: 'shanshan'},computed: {reversedMsg: function () {console.log('计算执行啦');return this.msg.split('').reverse().join('');}}
})
vm.name = 'duyi';

此时可以看到,当给数据name重新赋值时,计算属性并没有执行。 所以,计算属性和方法的最本质的区别,是:计算属性是基于响应式依赖进行缓存的,计算属性的值一直存于缓存中,只要它依赖的data数据不改变,每次访问计算属性,都会立刻返回缓存的结果,而不是再次执行函数。而方法则是每次触发重新渲染,调用方法将总会再次执行函数。

那么,为什么需要缓存呢?

假如说,我们有一个计算属性A,它需要遍历一个巨大的数组并且做巨大的计算。然后我们需要使用到这个计算属性A,如果没有缓存,我们就会再次执行A的函数,这样性能开销就变得很大了。

深入计算属性

计算属性除了写成一个函数之外,还可以写成一个对象,对象内有两个属性,getter&setter,这两个属性皆为函数,写法如下:

const vm = new Vue({el: '#app',computed: {fullName: {getter () {// 一些代码},setter () {// 一些代码}}}
})

getter 读取

在前面,我们直接将计算属性写成了一个函数,这个函数即为getter函数。也就是说,计算属性默认只有getter。 getter的this,被自动绑定为Vue实例。

何时执行?

当我们去获取某一个计算属性时,就会执行get函数。

const vm = new Vue({el: '#app',data: {msg: 'Hello'},computed: {reversedMsg: {getter () {return this.msg.split('').reverse().join('');}}}
})

setter 设置

可选,set函数在给计算属性重新赋值时会执行。 参数:为被重新设置的值。 setter的this,被自动绑定为Vue实例。

const vm = new Vue({el: '#app',data: {msg: 'Hello',firstStr: ''},computed: {reversedMsg: {getter () {return this.msg.split('').reverse().join('');},setter (newVal) {this.firstStr = newVal[0];}}}
})

要注意,即使给计算属性赋了值,计算属性也不会改变,在重复一遍,只有当依赖的响应式属性变化了,计算属性才会重新计算。

教你什么时候用Vue计算属性!!!相关推荐

  1. vue教程2-03 vue计算属性的使用 computed

    vue教程2-03 vue计算属性的使用 computed computed:{b:function(){ //默认调用getreturn 值}}--------------------------c ...

  2. vue修改计算属性的值_八.Vue计算属性

    Vue计算属性 前言 我们要做的是springboot和vue.js所做的前后端分离的hr项目,所以从来没接触到vue的小伙伴,可以这篇文章 学Vue入门,这一篇就够了 模板内的表达式非常便利,但是设 ...

  3. 5.Vue 计算属性和侦听器

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. 5.Vue 计算属性和侦听器 ...

  4. Vue计算属性、方法、侦听器

    文章目录 一.基础计算模板 二.计算属性computed 三.方法methods 四.侦听器watch 五.总结 六.源码地址 一.基础计算模板 <!DOCTYPE html> <h ...

  5. Vue 计算属性 computed

    <!--计算属性:1. 定义:要用的属性不存在,要通过已有的属性计算得来2. 原理:底层借助了 Object.defineProperty 方法提供的 getter 和 setter3. get ...

  6. 你知道,什么时候用Vue计算属性吗?

    摘要:当我们处理复杂逻辑时,都应该使用计算属性. 本文分享自华为云社区<深入理解计算属性,知道什么时候该用Vue计算属性吗?>,作者: 前端老实人 . 计算属性 有些时候,我们在模板中放入 ...

  7. vue计算属性与监听器的区别

    vue计算属性与监听器的区别 计算属性(computed) 监听器(watch) 监听data中没有的值 监听data中有的值 使用时触发 使用不会触发 值有变化就触发 值有变化就触发 没有settt ...

  8. Vue计算属性、监视属性

    一.Vue计算属性 1. 定义:要用的属性不存在,要通过已有属性计算得来 2. 原理:底层借助了Object.defineproperty方法提供的getter和setter 3. get函数什么时候 ...

  9. vue计算属性与监视属性

    计算属性与监视属性 计算属性 在computed对象中定义计算属性的方法,在页面中使用{{方法名}} 监视属性 通过 vm对象中的$watch方法或者 watch配置来监视指定的属性, 当属性发生变化 ...

最新文章

  1. MySQL数据库备份命令
  2. 网页、网站规划与设计1
  3. 传智播客--WPF基础视频学习--sender解释(小白内容)
  4. Heroku创始人Adam Wiggins发布十二要素应用宣言
  5. 2.1 二元分类-深度学习-Stanford吴恩达教授
  6. distributed representations的意义
  7. java 广义表_java 输入广义表 生成二叉树 | 学步园
  8. 图像纹理合成_EnhanceNet:通过自动纹理合成实现单图像超分辨率
  9. Ibatis - Open quote is expected for attribute {1} associated with an element type '
  10. springboot超详细教程_CG原画插画教程:超详细线稿教程
  11. 【算法系列之六】两整数之和
  12. 5 年之后,产品经理,没了?
  13. Bailian2744 子串【字符串】
  14. 抽丝剥茧,在实践中深入学习QTP
  15. 软件测试 -- 入门 4 软件测试原则
  16. 从零开始学PCR技术(二):Taq DNA酶
  17. 海伦公式c语言double,海伦公式
  18. Objective C 类变量的声明
  19. win10 笔记本蓝牙不见了
  20. (PDF统一页面大小)PDF统一缩放至A4或指定大小

热门文章

  1. #CF div2 1670D Very Suspicious题解(思维+贪心)
  2. IDEA如何建立 包中包
  3. ftp常见错误代码记录下
  4. 有哪些小巧好用的pdf阅读器
  5. 处理R安装后出现You're using a non-UTF8 locale, therefore only ASCII characters will work.的情况
  6. 高中计算机竞赛考试题,2019年高中信息技术基本功竞赛试卷试题
  7. 聊一聊2038年问题
  8. [Git] 配置Github Gitee reference加速
  9. linux下使用迅雷的完美办法(免费)
  10. nginx 基本使用