watch、computed、methods的区别

1.计算属性Computed

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

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

2 . Computed 与 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'
    }
}
})

在官方文档中,强调了computed区别于method最重要的两点:

1 . computed是属性调用,而methods是函数调用
2 . computed带有缓存功能,而methods不会被缓存

属性调用:
1 .computed定义的方法我们是以属性访问的形式调用,{{computedTest}}
2 .methods定义的方法,我们必须要加上()来调用,{{methodTest()}}
缓存功能:
计算属性具有缓存:只有当计算属性所依赖的属性发生改变时,才会重新去计算
methods不会被缓存:方法每次都会去重新计算结果。
缓存好处:
相比大家都知道HTTP缓存,其核心作用就是对一些服务端未更新的资源进行复用,避免一些无谓的请求,优化了用户的体验
对于computed也是一样的:
在上面的例子中,methods定义的方法是以函数调用的形式来访问的,那么test2-1,test2-2,test2-3是反复地将methodTest方法运行了三遍,如果我们碰到一个场景,需要1000个methodTest的返回值,那么毫无疑问,这势必造成大量的浪费
更恐怖的是,如果你更改了message的值,那么这1000个methodTest方法每一个又会重新计算。。。。

所以,官方文档才反复强调对于任何复杂逻辑,你都应当使用计算属性

computed依赖于data中的数据,只有在它依赖数据发生改变` `时computd属性才会重新计算

如上例,在Vue实例化的时候,computed定义computedTest方法会做一次计算,返回一个值,在随后的代码编写中,只要computedTest方法依赖的message数据不发生改变,computedTest方法是不会重新计算的,也就是说test3-1,test3-2是直接拿到了返回值,而非是computedTest方法重新计算的结果。

这样的好处也是显而易见的,同样的,如果我们碰到一个场景,需要1000个computedTest的返回值,那么毫无疑问,这相对于methods而言,将大大地节约内存
哪怕你改变了message的值,computedTest也只会计算一次而已。
备注:
1 . computed其实是既可以当做属性访问也可以当做方法访问
2 . computed的由来还有一个重要原因,就是防止文本插值中逻辑过重,导致不易维护

watch

  • 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=" " 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>

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

methods,watch,computed的区别

1 . computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;
2 . methods 方法表示一个具体的操作,主要书写业务逻辑;
3 . 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];
}
}
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值