失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > vue中Computed Methods Watch区别

vue中Computed Methods Watch区别

时间:2021-05-04 21:40:09

相关推荐

vue中Computed Methods Watch区别

一、methods、watch、computed的区别

computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算,主要当作属性来使用;methods 方法表示一个具体的操作,主要书写业务逻辑;watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;可以看作是 computed 和 methods 的结合体;

计算属性的getter与setter

计算属性默认只有get,在需要的时候也可以设置set方法

fullName: {get: function () {return this.firstName + " " + this.lastName;},set: function (val) {this.firstName = val.split(' ')[0];this.lastName = val.split(' ')[1];}}

二、计算属性Computed

模板内使用js表达式是很方便的,设计的目的只是为了简单运算。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何复杂逻辑,你都应当使用计算属性。

<!-- 复杂运算 --><div>{{message.split('').reverse().join('')}}</div><!-- 计算属性代替复杂运算 --><div>{{reverseMessage}}</div>computed: {<!-- 计算属性的getter -->reverseMessage: function () {return this.message.split('').reverse().join('');}}

三、Computed与methods对比

同样都可以达到计算属性的效果

1 . computed是属性调用,而methods是函数调用

2 . computed带有缓存功能,而methods不会被缓存

属性调用:

(1)、computed定义的方法我们是以属性访问的形式调用,{{computedTest}}

(2)、 methods定义的方法,我们必须要加上()来调用,{{methodTest()}}缓存功能:

计算属性具有缓存:只有当计算属性所依赖的属性发生改变时,才会重新去计算

methods不会被缓存:方法每次都会去重新计算结果。

<!--HTML部分--><div id="app"><h1>{{message}}</h1><p class="test1">{{methodTest}}</p><p class="test2-1">{{methodTest()}}</p><p class="test2-2">{{methodTest()}}</p><p class="test2-3">{{methodTest()}}</p><p class="test3-1">{{computedTest}}</p><p class="test3-2">{{computedTest}}</p></div><!--script部分-->let vm = new Vue({el: '#app',data: {message: '我是消息,'},methods: {methodTest() {return this.message + '现在我用的是methods'}},computed: {computedTest() {return this.message + '现在我用的是computed'}}})

注意:

1 . computed其实是既可以当做属性访问也可以当做方法访问

2 . computed的由来还有一个重要原因,就是防止文本插值中逻辑过重,导致不易维护

watch

watch是观察某一个属性的变化,重新计算属性值。computed是通过所依赖的属性的变化重新计算属性值。大部分情况下watch和computed几乎没有差别。但如果要在数据变化的同时进行异步操作或者是比较大的开销,那么watch为最佳选择。

Vue的watch属性可以用来监听data属性中数据的变化

<div id="app"><input type="text" v-model="firstname" /></div><script type="text/javascript">var vm = new Vue({el:"#app",data:{firstname:"",lastname:""},methods:{},watch:{firstname:function(){console.log(this.firstname)}}})</script>

可以从上述代码中实践得知,输入框内的值变化多少次,控制台就会打印多少次

同时还可以直接在监听的function中使用参数来获取新值与旧值

watch:{firstname:function(newValue,OldValue){console.log(newValue);console.log(OldValue);}}

其中第一个参数是新值,第二个参数是旧值

同时Watch还可以被用来监听路由router的变化,只是这里的监听的元素是固定的

<div id="app"><!--由于Vue-router的hash匹配原则所以我们需要在原定义的路径上加一个#号--><!-- <a href="#/login" rel="external nofollow" >登录</a><a href="#/register" rel="external nofollow" >注册</a>--><router-link to="/login" tag="span">登录</router-link><router-link to="/register">注册</router-link><router-view></router-view></div></body><script>var login={template:'<h1>登录组件</h1>'}var register={template:'<h1>注册组件</h1>'}var routerObj = new VueRouter({routes:[//此处的component只能使用组件对象,而不能使用注册的模板的名称{path:"/login",component:login},{path:"/register",component:register}]})var vm = new Vue({el:'#app',data:{},methods:{},router:routerObj,//将路由规则对象注册到VM实例上watch:{'$route.path':function(newValue,OldValue){console.log(newValue);console.log(OldValue);}}})</script>

如果觉得《vue中Computed Methods Watch区别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。