Vue.js 创建一个 CNODE 社区(2)

还是继续入门 demo

这篇博文应该有点长,因为觉得了解了 computed 之后,应该还会继续学下去,所以这里会包含 computed 和 v-bind 的相关学习内容。


computed

什么是计算属性

所有的计算属性都以函数的形式写在 Vue 实例内的computed 选项内,最终返回计算后的结果。

为什么使用计算属性以及如何使用

vue计算

逻辑过长,会变的臃肿,难以维护。

使用计算属性

使用计算属性可以完成各种复杂的逻辑,包括运算、函数调用等,只要最终返回一个结果即可。

如计算一个购物车总价:

购物车总价

计算属性还可以依赖多个 Vue 实例的数据

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

我们声明了一个新的 Vue 实例 app2,然后在 app 中的计算属性 prices 中调用 app2 中的属性:

var app2 = new Vue({
  el:'#app2',
  data:{
    msg:' this\'s app2'
  }
})
var app = new Vue({
  el:'#app',
  data:{
    text:'123,456,789',
    package:[
      {
        package1:{
          name:'iphone',
          price:6900,
          count:2
        },
        package2:{
          name:'ipad',
          price:5900,
          count:3
        }
      }
    ]
  },
  //定义计算属性
  computed:{
    reverseText:function(){
      // this 代表了这个 Vue 实例
      return this.text.split(',').reverse().join(',')
    },
    prices:function(){
      var price = 0
        for(let key in this.package[0]){
          price += this.package[0][key].price*this.package[0][key].count
        }
      return price + app2.msg
    }
  }
})

app2

app2

计算属性中的 getter 和 setter

每一个计算属性都包含-个 getter 和一个 setter。

如果计算属性直接跟一个 function,默认的就是 getter ,如上面那几个例子。

如果计算属性设置 getter 和 setter,同时给计算属性设置值的时候,他就会根据 setter 先拿到新数据,处理过之后,再交由 getter 处理:

getter

setter

计算属性和 methods 的区别

调用 methods 里的方法也可以与计算属性起到同样的作用。那他们有什么区别呢?

通过 demo 来理解,使用不同的方法获取时间戳,我们在 methods 中定义一个方法:

methods:{
    thisTime:function(){
        return Date.now()
    }
}

在 computed 中定义一个属性:

computed:{
    nowTime:function(){
        return Date.now()
    }
}

在页面中显示出来:

<!--下面使用了 计算属性-->
{{ nowTime}}
<br>
<!--下面使用了 methods-->
{{ thisTime() }}

第一次渲染:

渲染前

通过给 app.text 重新赋值,再次渲染:

渲染后

可以看到,在渲染后,通过 methods 获取到的数据发生了改变;而计算属性获取到的数据并没有发生改变。

注意 渲染是渲染,页面刷新是刷新;页面刷新,一定会重新渲染;页面重新渲染,页面不一定要刷新。

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

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

如何选择 methods 和计算属性:

是否需要缓存,需要缓存,选择计算属性;不需要缓存,使用 methods。


小总结

JSbin 代码链接

  • 创建以一个vue实例,并使用计算属性和方法实现一个字符串翻转的操作,写出核心代码

HTML:

<div id="app">
    {{ textReverse() }}
    {{ textReverse2 }}
</div>

JS:

var app = new Vue({
    el:'#app',
    data:{
        text:'reverse text'
    },
    methods:{
        textReverse:function(){
            return this.text.split('').reverse().join('')
        }
    },
    computed:{
        textReverse2:function(){
            return this.text.split('').reverse().join('')
        }
    }
})
  • 何时使用模板内表达式,何时使用计算属性

当表达式所需的逻辑链较短,数据处理需求不大时,可以使用模板内表达式。

当逻辑链变长,逻辑更为复杂时,使用计算属性。

  • 计算缓存 vs Methods,两者的区别

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

他们的区别在于:

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

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

  • 代码题

实例化一个vue实例,在data中定义一个姓氏firstName和名字firstName,还有一个全称叫fullName。

提示:fullName = firstName + firstName。

需求:分别使用watch监听器和计算属性来实现以下功能实现,只要姓氏firstName和名字firstName中的任意一个改变,全称fullname就会改变

老师真鸡贼...还没有看到 watch 呐哈哈,还是得去预习一下再做这道题了:

HTML:

<div id="app">
    {{ fullName }}
</div>

computed:

var app = new Vue({
    el:'#app',
    data:{
        firstName:'Zhang',
        lastName:'da',
        fullName:'Zhang da'
    },
    computed:{
        fullName:{
            get:function(){
                return this.firstName + ' ' + this.lastName
            },
            set:function(newValue){
                let name = newValue.split(',')
                this.firstName = name[0]
                this.lastName = name[1]
            }
        }
    },
})

watch:

var app = new Vue({
    el:'#app',
    data:{
        firstName:'Zhang',
        lastName:'da'
    },
    watch:{
        firstName:function(val,oldVal){
            this.fullName = val + ' ' + this.lastName
            console.log(oldVal)
        },
        lastName:function(val,oldVal){
            this.fullName = this.firstName + ' ' + val
            console.log(oldVal)
        }
    }
})

v-bind

动态地绑定一个或多个特性,或一个组件 prop 到表达式。

在绑定 class 或 style 特性时,支持其它类型的值,如数组或对象。

之前在 (1) 已经略微了解过 v-bind,现在来更深入地了解一下他的用法。

绑定 class - 对象

绑定 class 对象语法,对象的键是类名,值是布尔值。

绑定class对象

设置false后

绑定多个对象

绑定 class - 计算属性

当 class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性

绑定到对象属性

active 就是类名,他是否会启用,取决于他的值是否为 true。当 this.isActive 为 true 且 !this.isBorder 也为 true 时,这个样式才能显示出来。

绑定 class - 数组

绑定 class 数组,数组中的成员 对应着 类名

把绑定数组

数组和对象混用

把对象写入数组中,如:

HTMl:

<div :class='[{borderStyle:isActive},"className"]'></div>

JS:

var app = new Vue({
    el:'#app',
    data:{
        isActive:true,
        className:'lineStyle'
    }
})

CSS:

.lineStyle{
    line-height:666px;
}

绑定内联样式

还可以绑定内联样式:

<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
  activeColor: 'red',
  fontSize: 30
}

还可以直接绑定到一个样式对象:

<div v-bind:style="styleObject"></div>
data:{
    styleObject:{
        color:"red",
        fontSize:"30px"
    }
}

关于 v-bind 的 demo 详见 JSbin


小总结

  • 写出本课中v-bind的作用,并分别写出v-bind的变量语法,数组语法,对象语法

作用:通过数据绑定操作元素的 class 列表和内联样式

变量语法: v-bind:class=变量名,变量名在 Vue 实例里的 data 对象内定义,变量的赋值内容则是类名。

数组语法: v-bind:class=[数组成员],可以绑定多个 class,数组成员可以是对象,如果是对象的话,这个对象的值为 true ,这个 class 才可以会被使用;如果是数组成员是变量,则需要的 Vue 实例里的 data 对象内设置变量,变量的赋值内容则是类名。

对象语法: v-bind:class = {类名:布尔值},通过判断布尔值,来确定 class 是否被启用。

变量语法

HTML:

<div :href='url'></div>

JS:

data:{
    url:'http://www.acfun.cn/'
}

数组语法

HTML:

<div :class='[className1,className2]'></div>

JS:

data:{
    className1:'divStyle',
    className2:'borderStyle'
}

对象语法

HTML:

<div :class='{divStyle:isActive}'></div>

JS:

data:{
    isActive:true
}

绑定计算属性:

HTML:

<div :class='className'></div>

CSS:

.active{
    color:red;
}

JS:

...
data:{
    isActive:true,
    isBorder:true
},
computed:{
    className:function(){
        return {
            active: this.isActive || isBorder
        }
    }
}

本篇博文到此结束,主要学习了计算属性 computed 和 v-bind 的一些用法,其实 Vue 的官方文档里面也有相关的教程,但是老师讲得也是十分详细,对照着看很容易理解,多写 demo 也增加了对 Vue 的认识。

猜你喜欢

转载自www.cnblogs.com/No-harm/p/9716024.html