vue中Computed、Methods、Watch区别

computed

计算属性只有当依赖值发生改变时才会重新计算,否则会缓存生成的属性值 无论多少次使用都只调用一次

<template>
  <div class="home">
    {{formMsg}}
    <button @click="formMsg = '芋圆味糖罐'">点击修改</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: 'hello'
    }
  },
  computed: {
    formMsg() {
    // 必须要有返回值,没有return值为undefined,计算属性作为属性({{formMsg}})去使用
      return this.msg.split('').reverse().join('')
    }
  }
}
</script>

当我们去点击按钮修改formMsg的值时,浏览器会报错
在这里插入图片描述
这是因为计算属性不能直接赋值,它里面没有设置set属性,我们需为其添加一个set属性

<template>
  <div class="home">
    {{formMsg}}	// 会显示:芋圆味糖罐
    <button @click="formMsg = '芋圆味糖罐'">点击修改</button>
  </div>
</template>

<script>
export default {
  name: 'Home',
  data() {
    return {
      msg: 'hello'
    }
  },
  computed: {
    formMsg: {
      get() {
      	return this.msg
      },
      set(val) {
      	this.msg = val
      }
    }
  }
}
</script>
特性

计算属性只有当依赖值发生改变时才会重新计算,否则会缓存生成的属性值 无论多少次使用都只调用一次

<template>
  <div class="home">
    {{formMsg}}
    {{formMsg}}
    {{formMsg}}
    {{formMsg}}
    <button @click="msg= '芋圆味糖罐'">点击改变msg</button>
  </div>
</template>

<script>
export default {
  name: 'Home',
  data() {
    return {
      msg: 'hello'
    }
  },
  computed: {
    formMsg() {
      console.log(1)
      return this.msg.split('').reverse().join('')
    }
  }
}
</script>
不管我们使用多少次{{formMsg}},在浏览器中都只会输出一个1
只有当点击按钮[msg发生了变化],才会再次输出1

watch

深度监听

# 对象
<template>
    <div class='home'>
        <button @click="obj.name = 'uu盘'">改变对象中name属性</button>
    </div>
</template>

<script>
export default {
    data() {
        return {
            obj:{
                name:'hello',
            }
        };
    },
    watch:{
    	// 方法一:监听对象中的单个属性变化的方法
        'obj.name'(newVal,oldVal) {
            console.log(newVal);    // uu盘
            console.log(oldVal);    // hello
        },
        // 方法二:深度监听 可以监听引用数据类型中所有的属性
        obj:{
            handler(val) {
                console.log(val); // {name:'uu盘'}
            },
            deep:true,		// 开启深度监听
            immediate: true	// 页面进入后数据监听会立即执行一次
        }
    }
};
</script>
# 数组
<template>
    <div class='home'>
        <button @click="change">改变数组</button>
    </div>
</template>

<script>
export default {
    data() {
        return {
            arr:[1,2,3]
        };
    },
    methods:{
        change() {
            this.arr.push(4)
        }
    },
    watch:{
        // 监视程序只接受简单的点分隔路径(obj.name)
        // 'arr[0]'(newVal,oldVal) {	错误写法
        //     console.log(newVal,oldVal);
        // }
        arr:{
            handler(val) {
                console.log(val);	// [1,2,3,4]
            },
            deep:true
        }
    }
};
</script>

methods

methods 方法表示一个具体的操作,主要书写业务逻辑

<template>
    <div class='home'>
        你购买的数量:{{num}}<br>
        <button @click="add">增加数量</button>
    </div>
</template>

<script>
export default {
    data() {
        return {
            num:1,
        };
    },
    methods: {
        add() {
            this.num++
        }
    }
};
</script>
methods和computed的区别

computed是属性调用,而methods是函数调用
computed带有缓存功能,而methods不会被缓存
属性调用是 {{reverseMsg}}
函数调用 {{reverseMesssage()}}

<div id="app">
  {{reverseMsg}}
   <hr>
  {{reverseMesssage()}}
</div>
app = new Vue({
        el:"#app",
        data:{
            msg:"hello word",
        },
        methods:{
            reverseMesssage(){
                return this.msg.split("").reverse().join("");
            },
        },
        computed:{
            reverseMsg(){
                return this.msg.split("").reverse().join("");
            },
        }
    });
watch和computed的区别

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

总结

  1. computed属性的结果会被缓存,只有当依赖值发生改变才会重新计算,一般处理复杂的逻辑的时候使用,擅长处理一个数据受多个数据影响(购物车商品结算);
  2. methods 方法表示一个具体的操作,主要书写业务逻辑;
  3. watch一个对象,主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作,擅长处理一个数据影响多个数据(搜索框,表单验证)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值