vue 计算属性和data_Vue:计算属性

一、为什么要使用计算属性

1、什么是计算属性

计算属性:可以理解为能够在里面写一些计算逻辑的属性。具有如下的作用:

减少模板中的计算逻辑。

数据缓存。当我们的数据没有变化的时候,不会再次执行计算的过程。

依赖固定的数据类型(响应式数据),不能是普通的传入的一个全局数据。

在数据量比较大的时候,计算属性可以帮助我们提高性能,因为计算属性只会在数据变化的时候才会计算。

在讲解计算属性之前先来看下面的一个例子:

需求:外卖套餐A每份15元,客户点了3份,总价打八折,配送费5元,要求在界面显示总价,代码如下:

您购买了{{info.name}}共{{info.count}}份

总价:{{info.count*info.price*info.sale+info.freight}}元

name:'Test',

data(){return{

info:{

userId:1,

price:15,

name:'套餐A',

count:3,

sale:0.8,

freight:5}

}

}

}

界面运行效果:

看了上面的例子,可能有人会问:使用这种方式已经实现了需求,那为什么还要使用计算属性呢?我们知道,vue中模板内的表达式非常便利,设计的初衷是用于简单运算的。如果在模板中放入太多的逻辑会让模板过重而且难以维护,看上面的代码:

总价:{{info.count*info.price*info.sale+info.freight}}元

在这段代码中,模板不在是简单的声明式逻辑,而是复杂的逻辑计算,如果想要在多处引用总价的时候,就会难以维护。所以,对于任何复杂的逻辑,都应当使用计算属性。

看下面使用计算属性的例子:

计算属性

您购买了{{info.name}}共{{info.count}}份

总价:{{totalPrice}}元

name:'ComputedDemo',

data(){return{

info:{

userId:1,

price:15,

name:'套餐A',

count:3,

sale:0.8,

freight:5}

}

},

computed:{//定义计算属性totalPrice

totalPrice:function(){return this.info.count*this.info.price*this.info.sale+this.info.freight

}

}

}

界面显示效果:

注意:计算属性是一个属性,不是方法,不能写在methods中,放在computed属性里面。

上面计算属性的写法也可以使用ES6的写法:

//使用ES6写法

totalPrice(){return this.info.count*this.info.price*this.info.sale+this.info.freight

}

二、计算属性和方法的区别

1、区别

上面的例子除了使用计算属性,还可以使用方法实现:

计算属性

您购买了{{info.name}}共{{info.count}}份

使用计算属性获取总价:{{totalPrice}}元

使用方法获取总价:{{getTotalPrice()}}元

name:'ComputedDemo',

data(){return{

info:{

userId:1,

price:15,

name:'套餐A',

count:3,

sale:0.8,

freight:5}

}

},

computed:{//定义计算属性totalPrice

//totalPrice:function(){

//return this.info.count*this.info.price*this.info.sale+this.info.freight;

//}

//使用ES6写法

totalPrice(){return this.info.count*this.info.price*this.info.sale+this.info.freight;

}

},

methods:{

getTotalPrice(){return this.info.count*this.info.price*this.info.sale+this.info.freight;

}

}

}

界面显示效果:

通过上面的例子可以看出:计算属性和方法实现的最终效果是相同的。那么计算属性和方法有什么区别呢?计算属性是基于它们的响应式依赖进行缓存的,只有在响应式依赖发生改变时才会重新求值。这就意味着只要响应式依赖没有发生改变,多次访问计算属性会立即返回之前的计算结果,而不必再次执行计算。相比之下,调用方法总会再次执行函数。总价计算属性和方法的区别如下:

计算属性在依赖发生改变时会自动改变,而方法在依赖发生改变时需要触发才会改变。

计算属性在依赖发生改变时才会重新计算,而方法在每次调用时都会执行。

看下面的例子:

计算属性

您购买了数量

使用计算属性获取总价:{{totalPrice}}元

计算属性

使用方法获取总价:{{data}}元

name:'ComputedDemo',

data(){return{

info:{

userId:1,

price:15,

name:'套餐A',

count:3,

sale:0.8,

freight:5},

data:0}

},

computed:{//定义计算属性totalPrice

//totalPrice:function(){

//return this.info.count*this.info.price*this.info.sale+this.info.freight;

//}

//使用ES6写法

totalPrice(){

console.log('计算属性');return this.info.count*this.info.price*this.info.sale+this.info.freight;

}

},

methods:{

getTotalPrice(){

console.log('方法');this.data= this.info.count*this.info.price*this.info.sale+this.info.freight;

}

}

}

当依赖发生改变时会多次打印“计算属性”,而方法需要在点击按钮的时候才会发生改变。依赖不发生改变时点击按钮,也会打印“方法”。如下图所示:

2、计算属性使用场景

假如我们有一个性能开销比较大的计算属性A,它需要遍历一个巨大的数组并做大量的计算,然后我们可能有其他的计算属性依赖于计算属性A。如果不使用计算属性,那么将不可避免的多次进行计算,会消耗很大的性能,这种情况下就需要使用计算属性。

三、修改计算属性的值

在上面的例子中都是使用的获取后的计算属性的值,那么如何修改计算属性的值呢?看下面的例子:

修改计算属性

num:{{num}}

计算属性num2:{{num2}}

改变计算属性的值

name:'ComputedDemo2',

data(){return{

num:100}

},

computed:{

num2(){return this.num-10;

}

},

methods:{

change(){this.num2=60;

}

}

}

效果:

这时会发现直接修改计算属性的值报错了,因为不能直接修改计算属性的值,如果要修改计算属性的值,需要修改其依赖项的值,看下面的代码:

修改计算属性

num:{{num}}

计算属性num2:{{num2}}

改变计算属性的值

exportdefault{

name:'ComputedDemo2',

data(){return{

num:100}

},

computed:{

num2:{//当计算属性要修改时先触发set方法

//读取当前计算属性中的值,get方法可以隐藏,默认进入的是get方法

get:function(){return this.num-10;

},

set:function(val){this.num=val;

}

}

},

methods:{

change(){//计算属性不能直接修改

this.num2=60;

}

}

}

修改前的效果:

修改后的效果:

总结

计算属性的值不能修改,如果要修改计算属性的值,要通过计算属性里面的set方法修改其依赖项的值才能修改计算属性的值。

四、监听属性

监听属性(watch)是用来监听data中的数据是否发生变化,一般是监听data中的某个属性。

更加灵活、通用的API。

watch中可以执行任何逻辑,如函数节流,Ajax异步获取数据,甚至操作DOM。

1、监听普通属性

看下面的代码:

监听属性

姓名:

{{userName}}

年龄:

{{age}}

name:'watchDemo',

data(){return{

userName:"abc",

age:23}

},

methods:{

change(){

}

},

watch:{//监听userName的变化

//有两个参数,newValue表示变化后的值,oldValue表示变化前的值

userName:function(newValue,oldValue){

console.log('修改前的值:'+oldValue);

console.log('修改后的值:'+newValue);

},//监听age的变化

age:function(newValue,oldValue){

console.log('修改前的值:'+oldValue);

console.log('修改后的值:'+newValue);

}

}

}

界面效果:

2、监听属性和计算属性的区别

监听属性和计算属性的区别主要有下面几点:

计算属性性能更优。一个监听属性只能监听一个属性的变化,如果要同时监听多个,就要写多个监听属性,而计算属性可以同时监听多个数据的变化。

监听属性可以获取改变之前的属性值。

计算属性能做的,watch都能做,反之则不行。

能用计算属性尽量用计算属性。

需求:userName或age改变的时候打印出当前的userName和age值。

用监听属性实现:

监听属性

姓名:

{{userName}}

年龄:

{{age}}

{{info}}

name:'watchDemo',

data(){return{

userName:"abc",

age:23,

info:''}

},

methods:{

change(){

}

},

watch:{//监听userName的变化

//有两个参数,newValue表示变化后的值,oldValue表示变化前的值

userName:function(newValue,oldValue){//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

},//监听age的变化

age:function(newValue,oldValue){//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

}

}

}

如果要实现上述的需求,则需要对userName和age都进行监听,监听属性里面的代码都是重复的,如果有多个,那么就要写多个监听属性。在看计算属性:

监听属性

姓名:

{{userName}}

年龄:

{{age}}

{{getUserInfo}}

name:'watchDemo',

data(){return{

userName:"abc",

age:23,

info:''}

},

methods:{

change(){

}

},//watch:{

监听userName的变化

有两个参数,newValue表示变化后的值,oldValue表示变化前的值

//userName:function(newValue,oldValue){

console.log('修改前的值:'+oldValue);

console.log('修改后的值:'+newValue);

//this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

//},

监听age的变化

//age:function(newValue,oldValue){

console.log('修改前的值:'+oldValue);

console.log('修改后的值:'+newValue);

//this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

//}

//}

computed:{

getUserInfo(){return '我的姓名:'+ this.userName+',年龄:'+this.age;

}

}

}

如果使用计算属性则只需要写一次就可以实现上面的需求了。

3、监听复杂对象

上面的例子中是监听的普通属性,那么如何监听对象里面的属性呢?看下面的代码:

监听属性

姓名:

{{userName}}

年龄:

{{age}}

{{getUserInfo}}

监听对象属性

姓名:

{{obj.name}}

name:'watchDemo',

data(){return{

userName:"abc",

age:23,

info:'',//对象

obj:{

name:'123'}

}

},

methods:{

change(){

}

},

watch:{//监听userName的变化

//有两个参数,newValue表示变化后的值,oldValue表示变化前的值

userName:function(newValue,oldValue){//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

},//监听age的变化

age:function(newValue,oldValue){//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

},//监听对象中属性的变化

'obj.name':function(newValue,oldValue){

console.log('修改前的值:'+oldValue);

console.log('修改后的值:'+newValue);

}

},

computed:{

getUserInfo(){return '我的姓名:'+ this.userName+',年龄:'+this.age;

}

}

}

效果:

能不能执行监听对象呢?答案是可以的,看下面代码:

监听属性

姓名:

{{userName}}

年龄:

{{age}}

{{getUserInfo}}

监听对象属性

姓名:

{{obj.name}}

监听对象

姓名:

{{obj.name}}

name:'watchDemo',

data(){return{

userName:"abc",

age:23,

info:'',//对象

obj:{

name:'123'}

}

},

methods:{

change(){

}

},

watch:{//监听userName的变化

//有两个参数,newValue表示变化后的值,oldValue表示变化前的值

userName:function(newValue,oldValue){//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

},//监听age的变化

age:function(newValue,oldValue){//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

this.info= '我的姓名:'+ this.userName+',年龄:'+this.age;

},//监听对象中属性的变化

//'obj.name':function(newValue,oldValue){

//console.log('修改前的值:'+oldValue);

//console.log('修改后的值:'+newValue);

//}

//直接监听对象

obj:{//handler表示默认执行的函数

handler(newValue,oldValue){

console.log('修改前的值:')

console.log(oldValue);

console.log('修改后的值:');

console.log(newValue);

},//表示深度监听

//true:表示handler函数会执行

//false:表示handler函数不会执行

deep:true}

},

computed:{

getUserInfo(){return '我的姓名:'+ this.userName+',年龄:'+this.age;

}

}

}

效果:

GitHub代码地址:https://github.com/JiangXiaoLiang1988/computed.git

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

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

相关文章

Linux添加/删除用户和用户组

本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数。 1、建用户: adduser phpq //新建phpq用户 passwd phpq //给phpq用户设置密码 2、建工作组 groupadd test …

mysql 计算近30天总金额_mysql┃一条更新语句是怎么执行的???

本文共:3018字 预计阅读时间:8分钟文章首发于我的微信公众号:哪儿来的moon,欢迎大家关注mysql┃一条更新语句是怎么执行的???前言 通过上一篇文章的内容,大家已经对mysql的基本架构有…

arduinowifi.send怎么获取响应_ChatterBot代码解读-获取对话

这个过程比较复制,安装处理的流程,依次进行代码解读。在定义一个ChatBot后,可以进行对话的训练,这个过程参考:水中的鱼:ChatterBot代码解读-训练数据​zhuanlan.zhihu.com然后就是用如下的代码&…

[jQuery] jQuery函数

(1)文档就绪函数$(document).ready(function(){--- jQuery functions go here ----});为了防止文档在完全加载(就绪)之前运行 jQuery 代码。如果在文档没有完全加载之前就运行函数,操作可能失败。下面是具体的例子&…

beautifulsoup网页爬虫解析_Python爬虫神器:PyQuery,解析网页更简单,小白也能学会

图/文:迷神我们做python爬虫,通过requests抓取到内容就需要正则匹配,或者其他解析库解析内容。很多可能和我一样的人,都使用jquery的,那用的还是非常爽的。而pyquery库就是jQuery的Python实现,能够以jQuery…

ubuntu设置始终亮屏_ubuntu系统每次启动屏幕都是最大亮度问题的解决方法

这个方法你尝试过没首先你要确保有这个文件:复制代码代码如下:/sys/class/backlight/acpi_video0/brightnesscat出来的值就是你当前的屏幕亮度.我们修改下面的文件加入一些用户启动设置:复制代码代码如下:sudo gedit /etc/rc.local在 exit 0 的上方加入以下代码(确保exit 0没有…

unityios开发--加载视频以及加载完成之后自动跳转 .

在做游戏或者是虚拟漫游一般都会用到在开始的时候加载一段视频,这个视频可能一个介绍整个游戏或者是整个项目的。在加载完了之后自动的跳转到主画面或一个场景,在前在网上百度了一下找到的大部分都是win的好不容易找到了ios的。 Unity3D中播放游戏视频的…

rnn神经网络模型_一文读懂序列建模(deeplearning.ai)之循环神经网络(RNNs)

作者:Pulkit Sharma,2019年1月21日翻译:陈之炎校对:丁楠雅本文为你详细介绍序列模型,并分析其在不同的真实场景中的应用。简介如何预测一个序列中接下来要发生什么事情是一个非常吸引人的课题,这是我对数据…

mysql 人名用什么类型_如何选择合适的MySQL数据类型

一、MySQL数据类型选择原则更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型。越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小。简单就好:简单的数据类型的操作通常需要更少的CPU周期。例如:整型比字…

am335x uart5配置

任务:配置uart5

XML Schema ---complexType-----复合元素

混合的复合类型可包含属性、元素以及文本。 带有混合内容的复合类型 XML 元素&#xff0c;"letter"&#xff0c;含有文本以及其他元素&#xff1a; <letter>Dear Mr.<name>John Smith</name>.Your order <orderid>1032</orderid>will …

Java笔记(一)—StringBuilder类

1、StringBuilder类概述 StringBuilder是一个可变的字符串类&#xff0c;主要指的是StringBuilder对象 中的内容是可变的。与之相比String对象的内容是不变的。2、StringBuilder常用构造方法 public StringBuilder() {} //创建空白可变字符串 public StringBuilder(String st…

ubuntu下制作u盘镜像_deepin下制作win10启动U盘

1.准备①下载multibootusb&#xff1a;http://multibootusb.org/page_download/ ②准备一个win10的镜像文件 ③准备一个U盘&#xff0c;最好先备份U盘数据再格式化一道2.打开multibootusb工具输入开机密码&#xff0c;点击认证3.multibootusb操作部分①选择U盘的第一个分区 ②安…

Shared_from_this 几个值得注意的地方

shared_from_this()是enable_shared_from_this<T>的成员 函数&#xff0c;返回shared_ptr<T>。首先需要注意的是&#xff0c;这个函数仅在shared_ptr<T>的构造函数被调用之后才能使 用。原因是enable_shared_from_this::weak_ptr并不在构造函数中设置&#x…

asterisk1.8 账号信息mysql存储(动态)

1. 首先需要先编译出以下6个模块 res_realtime.so pbx_realtime.so func_realtime.so res_config_mysql.so app_mysql.so cdr_mysql.so 其中有些模块&#xff0c;asterisk默认并不编译&#xff0c;需要修改menuselect.makeopts这个文件&#xff0c;将里面的相应…

签证上的mult是什么意思_申根签证中mult是什么意思

展开全部申根签证中mult是是多次的意思&#xff0c;指可以在有效期内多次往返申根国家。类型申根签证分62616964757a686964616fe78988e69d8331333431373939为入境和过境两类。1.入境签证有一次入境和多次入境两种。签证持有者分别可一次连续停留90天或每半年多次累计不超过3个月…

Java拆分字符串

1、例如给出如下字符串"91 27 46 38 50"如何将其拆分成{"91", "27", "46", "38", "50"}呢&#xff1f;2、我们可以通过String类中的public String[] split(String regex)方法来实现String s "91 27 46 38 5…

Perl正则表达式匹配

\w([-.]\w)*((aa.com)|(bb.com)|(163.com)) 这个正则表达式可实现匹配含有aa.com或bb.com或163.com 的email 转载于:https://www.cnblogs.com/inbase/archive/2013/04/01/2994479.html

大数据翻页_大数据量下的分页解决方法

最好的办法是利用sql语句进行分页&#xff0c;这样每次查询出的结果集中就只包含某页的数据内容。再sql语句无法实现分页的情况下&#xff0c;可以考虑对大的结果集通过游标定位方式来获取某页的数据。sql语句分页&#xff0c;不同的数据库下的分页方案各不一样&#xff0c;下面…

centos7 安装git_Centos7.4 Yapi 服务搭建

Centos Yapi服务搭建转载请标明原文出处参考以下网址&#xff0c;排名不分先后https://github.com/YMFE/yapihttps://blog.csdn.net/guangzhou007_java/article/details/90779222https://www.jianshu.com/p/994bc7b19b26我的服务器环境阿里云服务器 centos 7.4使用 https://one…