vue 计算属性和监听器

一、计算属性

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

<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,在驱动视图的改变.

 

posted @ 2018-07-23 00:05  R00M  阅读(394)  评论(0编辑  收藏  举报