vue笔记3,计算笔记

栏目: 编程语言 · 发布时间: 6年前

内容简介:我们己经可以搭建出一个简单的 Vue 应用,在模板中双向绑定一些数据或表达式了。但是表达式如果过长,或逻辑更为复杂时,就会变得臃肿甚至难以阅读和维护举例。

一、使用计算属性的原因

我们己经可以搭建出一个简单的 Vue 应用,在模板中双向绑定一些数据或表达式了。但是表达式如果过长,或逻辑更为复杂时,就会变得臃肿甚至难以阅读和维护

举例

<div>
{{ text.split ( ’,’ ) •reverse () . join (’,’)}}
</div>
这里的表达式包含 3 个操作,并不是很清晰,所以在遇到复杂的逻辑时应该使用 计算属性

二、 计算属性用法

所有的计算属性都以函数的形式写在 Vue 实例内的computed 选项内,在一个计算属性里可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回计算后的结果

计算属性还可以依赖多个 Vue 实例的数据, 只要其中任一数据变化,计算属性就会重新执行 ,视图也会更新

小技巧: 计算属性还有两个很实用的小技巧容易被忽略:

一是计算属性可以依赖其他计算属性:

二是计算属性不仅可以依赖当前 Vue 实例的数据,还可以依赖其他实例的数据

实例 :展示两个购物车的物品总价

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="demo">
        {{prices}}
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> 
<script> 
    var app2 =new Vue({
        el:'#abc',
        data:{
            msg:'ssssssfffff'
        }
    })
    var app1 =new Vue({
        el:'#demo',
        data:{
            package1:[
                {
                    name:'iphone8',price:6999,count:3
                },
                {
                    name:'ipad',price:3600,count:6
                }
            ],
            package2:[
                {
                    name:'iphone8',price:6999,count:3
                },
                {
                    name:'ipad',price:3600,count:6
                }     
            ]
        },
        computed:{
            prices:function(){ //不定义的话,默认是getter函数
                var prices=0;
                for(var i=0;i<this.package1.length;i++){
                    prices =prices+ this.package1[i].price *this.package1[i].count
                }
                for(var j=0;j<this.package2.length;j++){
                    prices +=this.package2[j].price * this.package2[j].count
                }
                return prices+'-------'+app2.msg  //定义msg是代表计算属性可以依赖多个vue实例的数据
            }
        }
    })
</script> 
</body>
</html>

三、getter和setter

每一个计算属性都包含一个 getter 和一个 setter函数!

默认手法是getter来读取 , 当手动修改计算属性的值就像修改一个普通数据那样时,就会触发 set

ter函数,执行一些自定义的操作

计算属性除了上述简单的文本插值外,还经常用于动态地设置元素的样式名称 class 和内联样式 style

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="abc">
        my name is {{fullName}}<hr>
        my name is {{firstName}}{{lastName}}<hr>
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> 
<script> 
    var app2 =new Vue({
        el:'#abc',
        data:{
            firstName:'zhang',
            lastName:'sanfeng'
        },
        computed:{
            //计算属性的默认用法是getter函数
            // fullName:function(){
            //     return this.firstName+''+this.lastName
            // }
            fullName:{
                get:function(){
                    return this.firstName+''+this.lastName
                },
                set:function(newValue){
                    console.log('我是set方法,我被调用了')
                    var names=newValue.split(',')//分割成数组
                    this.firstName=names[0]
                    this.lastName=names[1]
                }
            }
        }
    })
</script>
</body>
</html>

四、计算属性的缓存

调用 methods 里的方法也可以与计算属性起到同样的作用

页面中的方法: 如果是调用方法,只要页面重新渲染,方法就会重新执行。不需要渲染,则不需要重新执行

计算属性:不管渲染不渲染,只要计算属性依赖的数据未发生变化,就永远不变

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="demo">
        {{text}}<br>
        {{text.split(',').reverse().join(',')}}<hr>
        {{reverseText}}<hr>
        计算属性的缓存
        {{now}}<hr>
        通过methods拿到时间戳(方法需要加括号)
        {{thisTime()}}
    </div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script> 
<script>
    //需求是把123,456,789编程789,456,123
    var app =new Vue({
        el:'#demo',
        data:{
            text:'123,456,789'
        },
        computed:{
            reverseText:function(){
                return this.text.split(',').reverse().join(',');
                //由于文本取值只能用单行表达式,逻辑过程就会变得臃肿,所以遇到复杂的逻辑时,应当使用计算属性。
                //计算属性可以用多行表达式,运算和函数调用等,
            },
            now:function (){
                return Date.now()
            }
        },
        methods:{
            thisTime:function(){
                return Date.now()
            }
        }
    })
</script> 
</body>
</html>

当我们改变text 的值,页面重新渲染,所以通过methods调用的计算属性的值重新更新了,但计算属性的没有变

vue笔记3,计算笔记

结论: 没有使用计算属性,在 methods 里定义了一个方法实现了相同的效果,甚至该方法还可以接受

参数,使用起来更灵活。既然使用 methods 就可以实现,那么为什么还需要计算属性呢?

原因就是

计算属性是基于它的依赖缓存的。 一个计算属性所依赖的数据发生变化时,它才会重新取值

何时使用: -----------使用计算属性还是 methods 取决于你是否需要缓存,当遍历大数组和做大量计算时,应当使用计算属性,除非你不希望得到缓存


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Redis设计与实现

Redis设计与实现

黄健宏 / 机械工业出版社 / 2014-6 / 79.00

【官方网站】 本书的官方网站 www.RedisBook.com 提供了书本试读、相关源码下载和勘误回报等服务,欢迎读者浏览和使用。 【编辑推荐】 系统而全面地描述了 Redis 内部运行机制 图示丰富,描述清晰,并给出大量参考信息,是NoSQL数据库开发人员案头必备 包括大部分Redis单机特征,以及所有多机特性 【读者评价】 这本书描述的知识点很丰富,......一起来看看 《Redis设计与实现》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具