一、计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如:

<div>
{{ message.split('').reverse().join('') }}
</div>

在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。

所以,对于任何复杂逻辑,你都应当使用计算属性。

<div id = 'com'>
<h3>{{msg}}</h3>
<p>{{currentMsg}}</p>
<button @click='clickHandler'>更改</button>
</div>
var com = new Vue({
el:'#com',
data:{
msg:'学习computed'
},
methods:{
clickHandler(){
this.msg = '我更改了数据'
} },
computed:{
currentMsg(){
// computed方法中默认只有getter return this.msg
}
}
})

computed是计算属性,vue会一直监听着里面的变量,如果你的变量发生了变化,computed会立刻执行getter方法

重新渲染到页面上.

这也是vue的核心思想数据驱动视图

计算属性默认只有getter,当然如果你需要也可以设置setter

  var com = new Vue({
el:'#com',
data:{
msg:'学习computed'
},
methods:{
clickHandler(){
this.currentMsg = '我更改了数据'
}
},
computed:{
currentMsg:{
set : function(newValue){
this.msg = newValue;
},
get : function(){
return this.msg;
}
}
}
})

示例一:轮播图:

<div id="app">
<div>
<img :src="currentImg" alt="" @mouseenter="stoplunbo()" @mouseleave="startlunbo()">
<ul>
<li v-for="(item,index) in ImgAttr" @click="liChangeImg(item)">{{index+1}}</li>
</ul>
</div>
<button @click="nextImg()">下一张</button>
<button @click="prevImg()">上一张</button> </div>
   var app = new Vue({
el:'#app',
//所有的数据都放在数据属性里
data:{
currentNum:0,
currentImg:'./1.jpg',
str:'<p>哈哈哈</p>',
ImgAttr:[
{id:1,src:'./1.jpg'},
{id:2,src:'./2.jpg'},
{id:3,src:'./3.jpg'},
{id:4,src:'./4.jpg'}
],
Timer:null, },
created(){
this.Timer = setInterval(this.nextImg,2000)
},
methods:{
//单体模式
clickHandler(){
//this 就是app实例化对象
this.show=!this.show;
},
ChangeColor(){
this.isRed=!this.isRed;
},
nextImg(){
if (this.currentNum==this.ImgAttr.length-1 ){
this.currentNum=-1;
}
this.currentNum++;
this.currentImg=this.ImgAttr[this.currentNum].src;
},
liChangeImg(item){ this.currentNum=item.id-1;
this.currentImg=item.src;
},
stoplunbo(){
clearInterval(this.Timer);
},
startlunbo(){
this.Timer = setInterval(this.nextImg,2000)
},
prevImg(){
if (this.currentNum == 0){
this.currentNum=this.ImgAttr.length-1;
}
this.currentNum--;
this.currentImg=this.ImgAttr[this.currentNum].src; }
}
})

当然这里没有用到计算属性,如果用到了计算属性,也可以进行优化:

示例二:

<div id="app">
<div>{{showli}}</div>
<ul>
<li v-for="(item,index) in songs" @click="changename(index)">
<p>name:{{item.name}} author:{{item.author}}</p>
</li>
</ul>
<button @click="additem()">additem</button>
</div>
<script>
var songs=[
{'id':1,'src':'1.mp3','author':'chen1','name':'桃花朵朵开1'},
{'id':2,'src':'2.mp3','author':'chen2','name':'桃花朵朵开2'},
{'id':3,'src':'3.mp3','author':'chen3','name':'桃花朵朵开3'},
{'id':4,'src':'4.mp3','author':'chen4','name':'桃花朵朵开4'}
]; var app=new Vue({
el:'#app',
data:{
songs:songs,
currentIndex:0,
},
methods:{
changename(index){
this.currentIndex=index;
},
additem(){
this.songs.push({'id':5,'src':'5.mp3','author':'chen5','name':'桃花朵朵开5'})
}
},
computed:{
showli(){
return this.songs[this.currentIndex].name
}
}
})
</script>

这里需要说的是,在computed里面的变量,如果发生了改变,那么就会执行相应的getter,在驱动视图的改变.

vue 计算属性和监听器的更多相关文章

  1. Vue计算属性

    github地址:https://github.com/lily1010/vue_learn/tree/master/lesson06 一 计算属性定位 当一些数据需要根据其它数据变化时,这时候就需要 ...

  2. 在做vue计算属性,v-for处理数组时遇到的一个bug

    bug: You may have an infinite update loop in a component render function 无限循环 需要处理的数组(在 ** ssq **里): ...

  3. vue教程2-03 vue计算属性的使用 computed

    vue教程2-03 vue计算属性的使用 computed computed:{ b:function(){ //默认调用get return 值 } } ---------------------- ...

  4. vue 计算属性 实例选项 生命周期

    vue 计算属性: computed:{} 写在new vue()的属性,只要参与运算,数据不发生变化时,次计算只会执行一次,结果缓存,之后的计算会直接从缓存里去结果.如果其中的值发生变化(不管几个) ...

  5. Vue计算属性缓存(computed) vs 方法

    Vue计算属性缓存(computed) vs 方法 实例 <div id="example"> <p>Original message: "{{ ...

  6. vue 计算属性实现过滤关键词

    效果 html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...

  7. Vue 计算属性 && 监视属性

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...

  8. Vue.js-05:第五章 - 计算属性与监听器

    一.前言 在 Vue 中,我们可以很方便的将数据使用插值表达式( Mustache 语法)的方式渲染到页面元素中,但是插值表达式的设计初衷是用于简单运算,即我们不应该对差值做过多的操作.当我们需要对差 ...

  9. VUE 学习笔记 四 计算属性和监听器

    1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...

随机推荐

  1. Binder与Servicede关联

    Binder是Android上IPC的基础和关键.那么在使用过程中,大多数时候看到的是client与server的结构,即Server通过创建服务来向Client提供服务,Client则通过绑定到Bi ...

  2. jQuery中$().each与$.each的区别

    在jQuery中 $().each与$.each是不同的,$().each用于对jQuery对象做遍历操作处理,而$.each用于循环遍历一个Array或Object对象,相当于for或while循环 ...

  3. 【C#】.NET提供了哪些类型来实现反射

    实现反射的类型大多数都定义在System.Reflection命名空间之下. Assembly 定义一个Assembly,它是可重用.无版本冲突并且可自我描述的公共语言运行库应用程序构造块. Asse ...

  4. mysql :安装过程中的问题

    安装mysql  选择路径的问题 出现如下问题:说明之前安装过mysql,写在的不干净

  5. oracle字符串处理函数

    1.LOWER(string) 将输入的字符串转换成小写: 2.UPPER(string) 将输入的字符串转换成大写: 3.INITCAP(string) 将输入的字符串单词的首字母转换成大写(如果不 ...

  6. [译] 回调地狱——JavaScript异步编程指南

    原文:Callback Hell 什么是 “回调地狱”? 在 JavaScript 中,我们经常通过回调来实现异步逻辑,一旦嵌套层级多了,代码结构就容易变得很不直观,最后看起来像这样: fs.read ...

  7. rsync断点续传

    这经常是我们所说的镜像同步就是这么来的,如果断点续传呢?rsync完全可以做到这一点.man手册再次告诉我们: --partial      By default, rsync will delete ...

  8. JS 手势长按代码

    同时支持长按和点击事件,无依赖版 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  9. 搭建SSH框架整合Struts2和Spring时,使用@Autowired注解无法自动注入

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 搭建SSH框架,在进行Struts2和Spring整合时,使用Spring的@Autowired自动注入失败,运行报错java.lan ...

  10. html及css

    html设置网页的结构内容,css设置样式,要记的标签很多,要学好无非是多练,然后看别人怎样写的代码,对比自己的,这样能更好地理解. 关于浮动,既然所有浮动必须要清除,那在设置浮动的同时,就先把清除浮 ...