1、前言

本篇是Vue中最常用到的API之一computed属性,转载信息如下:

作者:gunelark
链接:https://www.cnblogs.com/gunelark/p/8492468.html

2、正文

看了网上很多资料,对vuecomputed讲解自己看的都不是很清晰,今天忙里抽闲,和同事们又闲聊起来,对computed这个属性才有了一个稍微比较清晰的认识,下面的文章有一部分是转自: https://www.w3cplus.com/vue/vue-computed-intro.html --w3cplus.com

感觉这篇文章上面的例子通俗易懂,所以此处借用了。

自己的理解:

  • computed用来监控自己定义的变量,该变量不在data里面声明,直接在computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其他处理;
  • computed比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化,举例:购物车里面的商品列表和总金额之间的关系,只要商品列表里面的商品数量发生变化,或减少或增多或删除商品,总金额都应该发生变化。这里的这个总金额使用computed属性来进行计算是最好的选择

与watch之间的区别:

刚开始总是傻傻分不清到底在什么时候使用watch,什么时候使用computed。这里大致说一下自己的理解:

  • watch主要用于监控vue实例的变化,它监控的变量当然必须在data里面声明才可以,它可以监控一个变量,也可以是一个对象,但是我们不能类似这样监控,比如:
watch:{    goodsList.price(newVal,oldVal){        //监控商品列表中是商品价格    }}

这样会报错。只能监控整个对象或单个变量,如下所示:

data(){ return {   example0:"",   example1:"",   example2:{      inner0:1,                   innner1:2               } }},watch:{  example0(newVal,oldVal){//监控单个变量       ……  },  example2(newVal,oldVal){//监控对象       ……  },}
  • watch一般用于监控路由、input输入框的值特殊处理等等,它比较适合的场景是一个数据影响多个数据
    以下内容是摘自https://www.w3cplus.com/vue/vue-computed-intro.html w3cplus.com

计算属性可用于快速计算视图(View)中显示的属性。这些计算将被缓存,并且只在需要时更新。

Vue中有多种方法为视图设置值:

  • 使用指令直接将数据值绑定到视图
  • 使用简单的表达式对内容进行简单的转换
  • 使用过滤器对内容进行简单的转换

除此之外,我们还可以使用计算属性根据数据模型中的值或一组值来计算显示值。

计算属性

计算属性允许我们对指定的视图,复杂的值计算。这些值将绑定到依赖项值,只在需要时更新。

例如,我们可以在数据模型中有一个results数组:

假设我们想要查看所有主题的总数。我们不能使用filtersexpressions来完成这个任务。

  • filters:用于简单的数据格式,在应用程序的多个位置都需要它
  • expressions:不允许使用流操作或其他复杂的逻辑。他们应该保持简单

这个时候,计算属性就可以派上用场。我们可以向模型中添加一个计算值,如下:

效果如下:

计算属性 VS 方法

我们可以使用Vue中的method计算出学科的总分,最终得到的总数结果是相同的。

在上例的基础上,我们把computed区块中的totalMarks函数整体移到methods中。同时在模板中将{{ totalMarks }} 替换成{{ totalMarks() }}。 你最终看到的结果是一样的,如下所示:

虽然这两种方式输出的结果是相同的,但是性能将遭受毁灭性的打击。使用这种方法totalMarks()方法在每次页面渲染时都被执行一次(例如,使用每一个change)。

如果我们有一个计算属性,那么Vue会记住计算的属性所依赖的值(在我们这个示例中,那就是results)。通过这样做,Vue只有在依赖变化时才可以计算值。否则,将返回以前缓存的值。这也意味着只要results还没有发生改变,多次访问totalMark计算属性会立即返回之前的计算结果,而不必再次执行函数。

上面两个示例也说明,在Vue中计算属性是基于它们的依赖进行缓存的,而方法是不会基于它们的依赖进行缓存的。从而使用计算属性要比方法性能更好。

这也同样意味着下面的计算属性将不再更新,因为Date.now()不是响应式依赖:

相比之下,每当触发重新渲染时,方法的调用方式将总是再次执行函数。因此,函数必须是一个纯函数。它不能有副作用。输出只能依赖于传递给函数的值。

那么我们为什么需要缓存?假设我们有一个性能开销比较大的的计算属性A,它需要遍历一个极大的数组和做大量的计算。然后我们可能有其他的计算属性依赖于A。如果没有缓存,我们将不可避免的多次执行Agetter!如果你不希望有缓存,请用方法来替代。

计算属性的setter

计算属性默认只有getter,不过在需要时你也可以提供一个setter

效果如下:

你在输入框中输入一个fullName,然后点击set按钮,可以看到对应的效果。你现在再运行app.fullName="Airen liao"时,计算属性的setter会被调用,app.firstNameapp.lastName也相应地会被更新。如下图所示:

观察者:

虽然计算属性在大多数情况下更合适,但有时候也需要一个自定义的watcher。这是为什么Vue通过watch选项提供一个更通用的方法,来响应数据的变化。当你想要在数据变化响应时,执行异步操作或开销较大的操作,这是很有用的。

Vue确实提供了一种更通用的方式来观察和响应Vue实例上的数据变动:watch属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用watch。然而,通常更好的想法是使用计算属性而不是命令式的watch回调。比如下面的示例:

上面代码是命令式的和重复的。将它与计算属性的版本进行比较:


我创建了一个用来记录自己学习之路的公众号,感兴趣的小伙伴可以关注一下微信公众号:niceyoo

Vue中的computed属性相关推荐

  1. computed用发_Vue中的computed属性和nextTick方法

    computed computed属性的实现原理 Vue实例初始化时,给data的每个属性(dataKey)都添加getter和setter方法 计算属性computed初始化时,提供的函数将作为对应 ...

  2. [vue] vue中data的属性可以和methods中的方法同名吗?为什么

    [vue] vue中data的属性可以和methods中的方法同名吗?为什么 源码 中的 initData() 方法 if (methods && hasOwn(methods, ke ...

  3. Vue 中的 ref 属性详解

    Vue 中的 ref 属性详解 我们先来读一下vue的官方文档 我们来分析官方文档 首先ref的引用是相当于一个DOM节点(如果是子组件则指向的是其实例),而且是一个string类型的值. 通俗的将就 ...

  4. vue - 深入理解vue中的scoped属性

    文章目录 1,前言 2,scoped原理 3,父子组件使用scoped的不同情况 4,第一种:父组件未添加scoped,子组件未添加scoped 5,第二种:父组件未添加scoped,子组件添加sco ...

  5. vue中的ref属性

    vue中的ref属性   使用vue开发时经常会用到ref属性,ref属性有什么作用呢?我刚开始用的时候发现这个属性有点鸡肋,总是感觉可有可无,但是随着不断的使用vue,慢慢地发现它的作用还是挺重要的 ...

  6. Vue中的computed计算属性

    文章目录 computed与watch的异同 不同点 相同点 示例 源码 结果 分析 computed与watch的异同 不同点 触发条件不同   computed计算属性会依赖于使用它的data属性 ...

  7. vue 中的计算属性

    一.Vue的计算属性是什么? 它的计算属性是 computed 二.计算属性computed的特点有哪些? computed是计算属性.实时响应的.计算属性会依赖于它所使用的data中的属性,只要是依 ...

  8. Vue中的computed是什么?怎么用?

    提示:前端查漏补缺,仅代表个人观点,不接受任何批评 文章目录 一.computed是什么? 二.使用注意事项 1.计算属性的结果会被缓存 2.computed和method的区别 总结 1. 使用场景 ...

  9. 面试题!vue中的计算属性、方法、侦听属性

    1.计算属性 详细的内容可跳转至vue 计算属性 可以使用计算属性来代替在表达式中进行的复杂运算,以便于能够更方便的维护与复用逻辑. 计算属性是在选项对象中使用 computed 字段来定义. 特点: ...

最新文章

  1. 购买《四级网络工程师预测试卷与考点解析》,哪里最便宜?
  2. nmap脚本(nse)使用总结
  3. python中赋值不正确的_python中的“赋值与深浅拷贝”
  4. 【Linux】26.VScode安装、插件、快捷键等基本用法
  5. 关于火车票预定助手的声明
  6. php imap模块的添加
  7. 什么是activemq_什么是ActiveMQ?
  8. 支撑双十一的网络引擎:飞天洛神
  9. 计算机专业的口号运动会四字,计算机系运动会口号
  10. 在Java中使用标准输入输出设备进行字符串,整数浮点数等 的输入输出操作
  11. Tomcat的下载及环境变量配置
  12. 云计算IaaS核心技术全景指南
  13. php alert弹出框位置,jQuery_基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果),原理很简单: 获取当前屏幕( - phpStudy...
  14. Java版2048小游戏
  15. Eplan教学视频合集-百度网盘-收集于网络
  16. Java中的数据类型
  17. 温度反转效应(文末附2018数字IC后端最新校招笔试题目)
  18. U盘装系统,免设置bios(非pe镜像启动)
  19. fastJson字符串与Map,数组,对象,复杂对象之间的转换
  20. 蓝桥杯, 38线译码器74Hc138

热门文章

  1. [html] 请说说你在写布局时对于浏览器兼容性的感受或总结
  2. [html] js放在html的<body>和<head>有什么区别?
  3. [css] 请使用css写一个多级的下拉菜单
  4. [css] 当拿到一个新的项目,让你对这个项目的css做下架构设计,你该如何下手?
  5. [vue-cli]vue-cli3插件有写过吗?怎么写一个代码生成插件?
  6. 前端学习(1857)vue之电商管理系统电商系统之登录过程和token
  7. 前端学习(1440):实例选项el
  8. 前端学习(1368):app.use使用
  9. java学习(160):interrupt方法
  10. win10安装iis(亲测,工作需要)