首页 > 语言 > JavaScript > 正文

深入浅析Vue.js中 computed和methods不同机制

2024-05-06 15:20:25
字体:
来源:转载
供稿:网友

在vue.js中,有methods和computed两种方式来动态当作方法来用的

1.首先最明显的不同 就是调用的时候,methods要加上()

2.我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。

而使用 methods ,在重新渲染的时候,函数总会重新调用执行

为了方便理解,先上一段源码

<!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <title>title</title>    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>  </head>  <body>    <div class="test">  <!--computed计算属性-->      <p>{{now}}</p>      <p>{{now}}</p>      <p>{{now}}</p>      <p>{{now}}</p>      <hr />      <!--横线分割--></div>    <div class="test2">  <!--methods方法,注意new()加了括号-->      <p>{{now()}}</p>      <p>{{now()}}</p>      <p>{{now()}}</p>      <p>{{now()}}</p>    </div>  </body>  <script type="text/javascript">    var myVue = new Vue({      el: ".test",      computed: {        now: function() {          var yanshi = 0;          for(var o = 0; o < 2000; o++) {   //延时            for(var q = 0; q < 2000; q++) {              yanshi++;            }          }          return Date.now()        }      }    });    var vue2 = new Vue({      el: '.test2',      methods: {        now: function() {          var yanshi = 0;          for(var o = 0; o < 2000; o++) {            for(var q = 0; q < 2000; q++) {              yanshi++;            }          }          return Date.now()        }      }    })  </script></html>

运行结果如上,可以看出computed计算属性的话,每次进入页面将一直沿用第一次的信息,不会再触发now,这就是依赖缓存。(有延时的情况下 多次输出时间相同)

那什么是相关依赖发生改变时才会重新取值呢 比方说reversedMessage function()计算属性中调用了message变量

就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。

而methods是实时的,在重新渲染时,函数总会重新调用执行,不会缓存,(多次输出时间不同)

可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :所以其实computed也是可以传参的。

ps:下面看下vue计算属性computed和methods的区别

在new Vue的配置参数中的computed和methods都可以处理大量的逻辑代码,但是什么时候用哪个属性,要好好区分一下才能做到正确的运用vue。computed称为计算属性,顾名思义,计算就要返回一个计算的结果,所以,当我们要处理大量的逻辑,但是最后要取得最后的结果的时候可以用computed;简单示例:要求:<input type="text v-model="num1"><input type="text v-model="num2">现在要返回num1和num2的和;<script>  new Vue({    el:"#box",    data:{        num1:0,        num2:0        }    computed:{          result:function(){            return this.num1 + this.num2              // 计算属性必须有一个返回值        }    }   })</script>methods:是方法的意思,在js中,我们把一些函数叫做方法,一般情况下,要触发这个方法就要执行,要执行就要有一个源来触发,所以就需要一个事件源。这是和computed的一点不同之处;methods的示例:要求:</button @click="do()">点击弹出<//button><script>  new Vue({    el:"#box",    data:{        num1:0,        num2:0        }    methods:{          do:function(){           alert('ok')           //这里根据情况,可以返回有返回值也可以没有返回值。        }    }   })</script>对比computed 和 methods:computed计算的结果如果不发生改变就不会触发result这个函数。而methods中一般都是定义的需要事件触发的一些函数。每次只要触发事件,就会执行对应的方法。如果把computed中的方法写到method中会浪费性能。computed必须返回一个值页面绑定的才能取得值,而methods中可以只执行逻辑代码,可以有返回值,也可以没有。            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选