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

  • 相关阅读:
    20181120-1 每周例行报告
    20181113-2 每周例行报告
    20181030-4 每周例行报告
    20181023-3 每周例行报告
    第六周例行报告
    软件功能说明书final修订
    第十二周——例行报告
    PSP总结报告
    第十一周——例行报告
    PSP Daily软件beta版本——基于NABCD评论,及改进建议
  • 原文地址:https://www.cnblogs.com/chenxuming/p/9352192.html
Copyright © 2020-2023  润新知