watch监听属性和计算属性的区别及用法

一、watch监听属性:

1.无缓存性,页面重新渲染时值不变化也会执行(数据变化,就会直接触发响应的操作)。

2.一对多,一个数据影响多个数据。

3.支持异步操作,监听的函数接收两个参数,第一个参数是最新的值;第二个参数是之前的值。

4.immediate属性: immediate设置为 true 时组件加载立即触发回调函数执行。

5.deep属性: 深度监听,修改对象里面任何一个属性都会触发这个监听器里面的 handler 方法来处理响应的逻辑。

二、computed计算属性

1.支持缓存,只有当依赖项数据发生改变,才会重新进行计算。

2.多对一或者一对一,一个数据受多个数据影响。

3.不支持异步,当computed内有异步操作时无效,无法监听数据的变化,此时计算属性也是无效的。

4.计算属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值。

5.如果计算属性属性值是函数,那么默认会走get方法;函数的返回值就是属性值;计算属性computed需要对数据进行修改,需要写get和set两个方法,当数据变化时,调用set方法。

三、watch的用法(不是需要手动进行调用的,当数据中的任何一个数据发生变化都会自动触发,进行相对应的操作

1.普通监听,当值第一次绑定的时候不会监听,只有当值改变的时候才会执行监听函数

<input type="text" v-model="Name"/>  
//监听   当Name值发生变化时触发
watch: {
    Name (newName, oldName) {
        console.log("新值{0},输入之前的值{1}",newName,oldName);
    }
}

2. 设置immediate为true,则在第一次绑定值的时候就会执行监听函数

<input type="text" v-model="Name"/>  
watch: {
    Name: {
        handler (newName, oldName) {
            console.log("新值{0},输入之前的值{1}",newName,oldName);
        },
        immediate: true
    }
}

3.当需要监听对象或者数组的时候,需要设置deep为true,进入深度监听

<input type="text" v-model="Name.name" />
data (){
    return {
        Name: {name:'帅哥'}
    }
},
watch: {
    Name: {
        handler(newName, oldName) {
            console.log("新值{0},输入之前的值{1}",newName,oldName);
        },
        immediate: true,
        deep: true
    }
}

四、computed计算属性的用法(因为计算属性是基于缓存实现的,只在计算属性所依赖的数据发生改变时它们才会重新求值,否则访问计算属性会立即返回之前的计算结果,而不必再次执行函数。 相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。性能开销和watch比  较小

注意:

 计算属性和data属性都是变量并且不能重名,用法和data相同

函数内变量变化, 会自动重新计算结果返回

<template>{{Name}}</template>
<script type="text/javascript">

    const vm = new Vue({
        el: '#id',
        data: {
            a: '张',
            b: '大'
        },
        computed:{
            Name:{
               get(){
                   return this.a+ this.b
               },
               set(value){

               }
            }
        }
    })
</script>

当计算属性只有get时可以简写

<template>{{Name}}</template>
<script type="text/javascript">

    const vm = new Vue({
        el: '#id',
        data: {
            a: '张',
            b: '大'
        },
        computed:{
            Name:function(){
               return this.a+ this.b
            }
        }
    })
</script>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值