Vue中的computed属性

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作304:uni返回上一页面

activated(){this.cheange(0) },用于刷新uni页面的操作 返回上一个页面

订单管理系统(含源码)

本文demo下载和教学视频地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1077 实例使用PhpMySqlhtmlcss技术实现了订单管理系统, 系统可以分为多个角色进行登录操作, 每个角色分别对应相应的功能, 实例中介绍了一个强大的工具phpStudy&a…

工作305:对选择的数值清空

<template><div><!--选择账号 选择账号的具体页面 选择添加账号--><el-button icon"el-icon-plus" size"medium" click"open" :disabled"viewMode">添加账号</el-button><!--title表示标题 close表示…

openstack placement 组件作用理解

例如&#xff0c;一个资源提供者可以是一个计算节点&#xff0c;共享存储池&#xff0c;或一个IP分配池。placement服务跟踪每个供应商的库存和使用情况。例如&#xff0c;在一个计算节点创建一个实例的可消费资源如计算节点的资源提供者的CPU和内存&#xff0c;磁盘从外部共享…

Spring和SpringMVC总结篇

作者&#xff1a;肥宅兜链接&#xff1a;https://www.cnblogs.com/doudouxiaoye/p/5693399.html 1.为什么使用Spring ? 方便解耦&#xff0c;简化开发;通过Spring提供的IoC容器&#xff0c;可以将对象之间的依赖关系交由Spring进行控制&#xff0c;避免硬编码所造成的过度程序…

Python3爬虫(十一) 爬虫与反爬虫

Infi-chu: http://www.cnblogs.com/Infi-chu/ 一、重要概念 二、爬虫反爬虫进化论 转载于:https://www.cnblogs.com/Infi-chu/p/8981537.html

Io 异常: Invalid number format for port number

报错信息&#xff1a; Caused by: java.sql.SQLException: Io 异常: Invalid number format for port number at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.ja…

工作308:控制change

<div class"container" style"text-align: left;margin-top: 20px;margin-left: 10%" ><!--双向绑定数据checkedData 加入多选框的样式绑定的是checkData的数据 本次位置是一个数组 当其中选择的数值发生变化的时候 会触发对应的方法 --><e…

配置Maven环境变量-Eclipse/Idea添加Maven

1. 文件下载 官网下载地址&#xff1a;http://maven.apache.org/download.cgi 下方有我提供的下载链接。 由于下载缓慢&#xff0c;提供一份我的下载链接&#xff1a;https://www.lanzous.com/i7v2ryb 2. 解压文件 3. 环境变量 3.1、新建环境变量&#xff0c;如下所示&#xff…

HTML第二课——css

请关注公众号&#xff1a;自动化测试实战 先给大家提个建议&#xff0c;就是用sublime编辑器来编写。用其他的也无所谓&#xff0c;我只是建议&#xff0c;因为这个会帮你自动补全很多代码。 css概念 css叫层叠样式表。意思就是一层一层的叠加。作用就是让页面中的可视化标签变…

工作309:selectaccount方法接收值

<template><div><!--选择账号 选择账号的具体页面 选择添加账号--><el-button icon"el-icon-plus" size"medium" click"open" :disabled"viewMode">添加账号</el-button><!--title表示标题 close表示…

Invalid connection string format, a valid format is: host:port:sid

报错信息&#xff1a; Caused by: java.sql.SQLException: Io 异常: Invalid connection string format, a valid format is: "host:port:sid" at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.Databa…

Java代码优化

为什么要Java代码优化&#xff1f; 代码优化的最重要的作用应该是&#xff1a;避免未知的错误。在代码上线运行的过程中&#xff0c;往往会出现很多我们意想不到的错误&#xff0c;因为线上环境和开发环境是非常不同的&#xff0c;错误定位到最后往往是一个非常小的原因。因此&…

工作306:.sync解决子组件改变自身值 父组件也改变自身数值

Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-

修改MyEclipse/Eclipse左侧文字大小(MacOS/Windows)

一、Windows 首先找到 Eclipse/MyEclipse 的安装目录&#xff0c;然后找到如下目录&#xff1a; \plugins\org.eclipse.ui.themes_1.1.200.v20160815-0536\css\e4_basestyle.css 修改此 css 文件&#xff0c;添加如下内容&#xff1a; CTabFolder Tree{ font-size: 12px;} 二…

Kubernetes tutorial - K8S 官方入门教程

tutorials 教程 kubectl 的命令手册 1 Creating a Cluster 1.1 Using Minikube to Create a Cluster Kubernetes Clusters Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit. The abstractions in Kubernetes all…

前端js判空处理,js字符串判空,js数组判空

1、字符串 在 js 中&#xff0c;字符串为空会有这么几种形式&#xff0c;""&#xff0c;null&#xff0c;undefined&#xff0c;如果在已知变量为空串的情况下可以直接采用 if (string.length 0) 这种形式&#xff0c;今天总结一下常用的几种方法&#xff0c;方便下…

前端学习(2846):css浮动和定位布局

<< 我们一起来做秒杀 >>一、css浮动 float none left rightclearnone both left right二、css定位#div_test{position:relative;top:20px;left:30px;z-index:10; }#div_test2{position:absolute;top:20px;left:30px;z-index:-10; }

uniapp增加百度统计代码(h5)

做了个微信公众号文章互相阅读的h5界面&#xff0c;http://mptask.wintp.top/&#xff08;只能微信浏览器打开&#xff09;&#xff0c;其中用到了统计代码&#xff0c;记录如下。 1、新建 tj.html 界面 可放置在项目的根目录&#xff0c;文件名称根据自己情况命名。 2、粘贴内…