美文网首页
Vue计算属性

Vue计算属性

作者: lyp82nkl | 来源:发表于2019-07-09 16:03 被阅读0次

    计算属性

    先来看一个小demo:”反转字符串“

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>计算属性</title>
    </head>
    <body>
        <div id="demo">
            {{text}}   <br>
            <!-- 分割成数组,再反转,再用 , 连接 -->
            {{text.split(',').reverse().join(',')}} <br>
            <!-- 逻辑过长就会变成臃肿,难以维护,所以遇到复杂的逻辑是,应该使用计算属性-->
       
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        
       <script>
            //需求:'123,456,789'变成'789,456,123'
            var app = new Vue({
                el:"#demo",
                data:{
                    text:'123,456,789'
                },
              })
       </script>
    </body>
    </html>
    

    这个demo{{ }} 中要写很长(好吧其实不算长),如果有更多更复杂的需求,就要在 {{ }} 中写很长的表达式,会很臃肿,难以维护。为了解决这个问题,应该使用计算属性。

        <div id="demo">
            {{reverseText}} 
        </div>
     
      
       <script>
            //需求:'123,456,789'变成'789,456,123'
            var app = new Vue({
                el:"#demo",
                data:{
                    text:'123,456,789'
                },
                //计算属性
                computed:{
                    //如果计算属性直接跟一个 function 默认的就是 getter 函数
                    reverseText:function(){
                        return this.text.split(',').reverse().join(',')
                    }
                }
            })
    

    总结:

    • 如果表达式过长,或者逻辑过于复杂时,就可以使用计算属性;
    • 计算属性中的函数,一定要返回一个值。

    方法与计算属性的区别--缓存

    同一个demo:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>计算属性</title>
    </head>
    <body>
        <div id="demo">
            {{text}}   <br>
            <hr>
            计算属性的缓存:<br>
            {{now}} <br>
            通过method 拿到时间戳(方法一定要加括号):<br>
            {{thisTime()}}
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        
       <script>
            //需求:'123,456,789'变成'789,456,123'
            var app = new Vue({
                el:"#demo",
                data:{
                    text:'123,456,789'
                },
                //计算属性
                computed:{
                    //如果计算属性直接跟一个 function 默认的就是 getter 函数
                    reverseText:function(){
                        return this.text.split(',').reverse().join(',')
                    },
                    now:function(){
                        return Date.now()
                    }
                },
                //页面中的方法:如果是调用方法,只要页面重新渲染,方法就会重新执行
                methods: {
                    thisTime:function(){
                        return Date.now()
                    }
                },
            })
       </script>
    </body>
    </html>
    

    未修改text 值之前:



    当修改 text 值 为app.texrt = 1 值之后,页面渲染值为1。
    下面时间戳用计算属性的并未改变,用method写的值发生了改变



    结论:
    • 计算属性:不管渲染不渲染,只要计算属性依的数据未发生变化,就永远不变
      method:页面中的方法:如果是调用方法,只要页面重新渲染,方法就会重新执行,不需要渲染,则不需要执行。
    • 没有使用计算属性,在 methods 里定义了一个方法实现了相同的效果,甚至该方法还可以接受 参数,使用起来更灵活。既然使用 methods 就可以实现,那么为什么还需要计算属性呢?原因就是 计算属性是基于它的依赖缓存的。 一个计算属性所依赖的数据发生变化时,它才会重新取值,所以text 只要不改变,计算属性也 就不更新

    getter 和 setter

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

    <div id="app">
        {{ fullName }}                      // 3、渲染 fullName
    </div>
    
    var app = new Vue({
      el: '#app',
      data: {                               // 1、在data中定义 firstName 和 lastName
        firstName: 'zahng',
        lastName: 'san'
      },
      computed: {                          // 2、在计算属性中定义 fullName
        fullName: function () {
          return this.firstName + this.lastName
        }
      }
    })
    
    //zhang san
    

    上面代码并没有出现 getter 和 setter ,是因为,计算属性默认使用 getter 函数,即使没有明确写出 getter 函数,计算属性也会默认使用它。
    改写:

    computed: {
        fullName: {
          get: function () {             // 这里就明确写出了 getter 函数
            return this.firstName + this.lastName
          }
        }
    }
    
    //上下两段代码完全等价
    computed: {
        fullName: function () {         
            return this.firstName + this.lastName
          }
      }
    

    setter 函数与 getter 函数类似,也是写在计算属性中。而不同之处在于,getter 函数是默认用法,setter 函数不是默认用法。如果你要使用 setter 函数,那么你必须要手动写出 setter 函数。

        <div id="aaa">
              我的姓名是----{{fullName}}
        </div>
    
    
      var app = new Vue({
                el:"#aaa",
                data:{
                    firstname:'zhang',
                    lastname:'san'
                },
                computed: {
                    //计算属性的默认用法是 getter函数
                    // fullName:function(){
                    //     return this.firstname+' '+this.lastname
                    // },
                    //设置全成名字,就要调用set方法
                    fullName:{
                        get:function(){
                            return this.firstname+' '+this.lastname
                        },
                    set:function(newValue){
                        console.log('我是set方法,我被调用了')
                        //用逗号分隔
                        var names = newValue.split(',');//分隔为数组
                        this.firstname = names[0];// 数组第一个值赋值给 firstName
                        this.lastname = names[1];  // 数组第二个值赋值给 lastName
                        
                    }
                    }
                },
            })
    

    在控制台中改变名字:


    总结:
    • 每一个计算属性都包含一个 getter 函数和 setter 函数;
    • 计算属性会默认使用 getter 函数;
    • 也可以提供 setter 函数,当修改计算属性的值时,就会触发 setter 函数,执行一些自定义的操作。

    相关文章

      网友评论

          本文标题:Vue计算属性

          本文链接:https://www.haomeiwen.com/subject/qdyxkctx.html