我们都知道在Vue构造函数的参数对象中有一个【data】属性,该属性值是一个对象,该对象是对数据的代理,是一个键值对并且时刻与页面表现是一致的,但是这里面只能是简单的键值对,不能拥有业务逻辑,并且由于【data】中的属性属于同一个生命周期,所以如果我们需要某一个属性是依赖于另外一个属性时,在【data】中是做不到的,于是Vue为我们提供了【计算属性】
一、计算属性
1.1 概述
计算属性归根结底也是属性,它也是跟表现层是时刻同步的,虽然我们可以在插值中对数据进行各种处理,但是插值中的表达式处理毕竟只能用于简单的运算,不能拥有太多的业务逻辑。
<body> <div id="app"> <h1>{{name.toUpperCase()}}</h1> <!-- <h1>BLUE</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { name: 'blue' } }) </script>
上面代码是我们熟悉的在插值中使用表达式,但是这里面我们不能写入业务代码。
1.2 计算属性语法
在构造函数的参数对象中有一个【computed】属性,该属性就是用于定义计算属性的,该对象中的【键】也就是我们的计算属性,与【data】不同的是,计算属性的键值是一个【拥有返回值的函数】,该函数中可以访问到【data】中的所有属性。
<body> <div id="app"> <h1>{{rs}}</h1> <!-- <h1>BLUE LOVE PINK</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { hs: 'BLUE', wf: "PINK" }, computed: { rs:function(){ return `${this.hs} LOVE ${this.wf}` } } }) </script>
上面代码属性【rs】是定义的一个计算属性,该属性值是通过【data】中的两个属性值计算得到,返回一个拼接的字符串(这儿使用了ES6的【模板字符串】)并且当【data】中的相关值变化之后,【rs】属性都会进行重新计算。
可能刚开始对计算属性会有些疑惑,比如上面的例子我把代码写成下面这样子也是可以的
<body> <div id="app"> <h1>{{hs}} LOVE {{wf}}</h1> <!-- <h1>BLUE LOVE PINK</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { hs: 'BLUE', wf: "PINK" } }) </script>
上面的代码运行效果和我们使用计算属性的效果是一样的,但是这样的写法只适用于简单的处理,【计算属性可以处理更复杂的业务逻辑】,比如我们根据【data】中的一个属性值进行数据请求用于构建一个属性,我们就必须使用计算属性了。
【注意!!】计算属性虽然是一个方法,但是在Vue内部会被翻译成一个属性,我们可以使用实例【vm.rs】访问到数据的。
1.3 计算属性和过滤器的比较
如果用于对【data】中【单个】属性的【简单】处理,推荐使用过滤器,但是如果一个值使用了【data】中至少2个值或者对一个值进行复杂处理,那么就推荐使用计算属性了。
<body> <div id="app"> <h1>{{hs | lover}}</h1> <!-- <h1>BLUE LOVE PINK</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { hs: 'BLUE', }, filters: { lover(value){ return `${value} LOVE PINK` } } }) </script>
上面代码就使用了一个【data】属性值做简单的处理,所以使用过滤器,而且也发现了过滤字符串“LOVE PINK”是不可变的。
1.4 计算属性和Methods的比较
计算属性就是为了定属性的时候处理复杂的业务逻辑,而且在插值中我们可以使用表达式,那么我们是否可以通过使用在插值中调用一个有返回值的函数呢?它和计算属性又有什么区别呢?
<body> <div id="app"> <h1>{{rs}}</h1> <!-- <h1>EULB</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { name: 'BLUE', }, computed: { rs: function () { return [...this.name].reverse().join(''); } } }) </script>
上面代码将数据进行反向处理(使用了【ES6数组字符串扩展】 ),当我们改变name的值的时候,计算属性【rs】会跟着改变。下面我们将它改成一个方法结合插值表达式进行处理,看看区别。
<body> <div id="app"> <h1>{{ rs() }}</h1> <!-- <h1>EULB</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { name: 'BLUE', }, methods: { rs() { return [...this.name].reverse().join(''); } } }) </script>
上面代码将计算属性改成了一个方法结合插值表达式,发现效果和计算属性没差别,改变name的值的时候页面也刷新了。那是不是这两者就真的没区别呢,答案当然是否定的,如果没有区别干嘛还有计算属性的存在。
【计算属性是基于依赖进行缓存的】,只有计算属性的依赖发生改变时才会重新求值,也就是说如果依赖没有发生改变,那么计算属性会立刻返回之前的计算结果,假如我们有一个性能开销比较大的的计算属性 A ,它需要遍历一个极大的数组和做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用 method 替代。
1.5 计算属性和Watch的比较
我们发现计算属性会监听依赖,如果依赖发生变化则会从新计算属性,那么【监听器】也有这么一个功能,那么我们应该在什么时候使用【计算属性】,什么时候使用【监听器】呢?
<body> <div id="app"> <h1>{{fullName}}</h1> </div> </body> <script> let vm = new Vue({ el: "#app", data: { firstName: 'Jack', lastName: 'Blue', fullName: 'Jack Blue' }, watch: { firstName: function (val) { this.fullName = val + ' ' + this.lastName }, lastName: function (val) { this.fullName = this.firstName + ' ' + val } } }) </script>
上面代码中我们监听firstName和lastName用于构建fullName,效果很好,当firstName和lastName任意一个值改变的时候fullName都会随之改变。下面我们看一下计算属性的写法
<body> <div id="app"> <h1>{{fullName}}</h1> <!-- <h1>Jack Blue</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { firstName: 'Jack', lastName: 'Blue', }, computed: { fullName() { return this.firstName + ' ' + this.lastName } } }) </script>
上面代码使用计算属性的方式进行了改造,fullName 依赖 firstName和 lastName 两个属性,当这两个属性任意一个发生变化,fullname都会重新进行计算。但是计算属性是不是简洁了很多呢!
【总结!!】当一个属性需要依赖多个【data】中的属性时,建议使用计算属性,如果我们不是对属性进行操作,只是单纯的依据【data】中的某个值变化后做一些【非属性操作】时或者是在数据变化响应时,【执行异步操作或开销较大的操作】(比如:将变化后的值存入数据库,而不是改变其他属性)就使用Watch。
1.6 计算属性的setter
上面我们是使用的计算属性都是用于对计算属性的取值,计算属性默认页只给了【getter】,但是在需要的时候我们可以人为的html" target="_blank">添加【setter】
<body> <div id="app"> <h1>{{fullName}}</h1> <!-- <h1>Jack Blue</h1> --> </div> </body> <script> let vm = new Vue({ el: "#app", data: { firstName: 'Jack', lastName: 'Blue', }, computed: { fullName: { //getter get() { return this.firstName + ' ' + this.lastName }, //setter set(newValue) { var names = newValue.split(' ') this.firstName = names[0] this.lastName = names[names.length - 1] } } } }) </script>
上面代码定义了计算属性的一个setter,注意当需要定义setter的时候语法上面是有区别的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
计算属性 在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作。在模板中放入太多的逻辑会让模板过重且难以维护。例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 在这种情况下,模板不再简单和清晰。在实现反向显示 message 之前,你应该确认它。这个问题在你不止一次反向显示 messag
1. 前言 本节介绍计算属性的使用方法。包括什么是计算属性,计算属性的特点,还有计算属性和方法在实际使用中的区别。其中重点掌握计算属性和方法的区别,了解它之后,才能在日常工作中灵活使用计算属性和方法。 2. 慕课解释 计算属性就是当其依赖属性的值发生变化时,这个属性的值会自动更新,与之相关的DOM部分也会同步自动更新。— 官方定义 计算属性实际上是一个方法,它可以完成各种复杂的逻辑,包括运算、函数
本文向大家介绍vue计算属性及使用详解,包括了vue计算属性及使用详解的使用技巧和注意事项,需要的朋友参考一下 一、什么是计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如: 这里的表达式包含3个操作,并不是很清晰,所以遇到复杂逻辑时应该使用Vue特带的计算属性computed来进行处理。 二、计算属性的用法 在一个计算属性里
本文向大家介绍Vue计算属性的学习笔记,包括了Vue计算属性的学习笔记的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Vue计算属性的学习笔记,供大家参考,具体内容如下 ①模板内的表达式实际上只用于简单的运算,对于复杂逻辑,使用计算机属性。 ②基础例子: 这里我们声明了一个计算机属性reversedMessage,我们提供的函数将用作属性vm.reversedMessage的getter
本文向大家介绍vue计算属性get和set用法示例,包括了vue计算属性get和set用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了vue计算属性get和set用法。分享给大家供大家参考,具体如下: 计算属性是什么:vue文档里是这么说的,模板中绑定太多的逻辑会让模板过重且难以维护。 换句话说,就是可以自己设置值(b值),这个值和data下定义的值(a值)存在某些关系,b的值是基
我有一个Vuex实例,其中包含两个变量: 我有我的主Vue实例,其中日期属性是从继承的: 我最初称之为不带任何额外参数,但是一旦和的值更改,我想调用上面的之类的函数。但是,当我更改和的值时,没有任何变化。 可能值得注意的是,当我使用Vue插件在Chrome中进行检查,并单击根组件时,视图中会突然显示更改?很奇怪