初衷:为了解决模块里面有太多的计算逻辑让模版难以维护。
计算属性可以依赖一个数据也可以依赖多个数据的变化
使用场景:
商品单价和数量改变时,商品总价更改。如果写在方法里面,那么每次修改商品单价和数量时都会去调用这个方法,这种每次去调用都会消耗一部分性能,对页面渲染并不友好。所以就可以使用计算属性,计算属性可以使用缓存
计算属性不能在外部直接进行赋值,如果想要给计算属性赋值,就需要使用set/get方法,而且计算属性里面使用对象写法。
如购物车里面商品,全选按钮会根据商品是否全选中来决定是否被选中
-
"mini" v-model="checkedAll"> - checkedAll: {
- get() {
- return this.cartProducts.every(item => item.isChecked);
- },
- set(newVal) {
- this.cartProducts.map(item => (item.isChecked = newVal));
- }
- }
1. 计算属性会被加入到vue实例
2. 计算属性所依赖的数据未发生变化,结果会被缓存(缓存依赖于数据的变化,数据没有变化不会缓存),下一次页面更新时首先会查看数据是否变化,如果没有变化不会触发computed函数会直接读取缓存的内容
监听器适用于数据发生改变时做一些副作用相关的处理
- var vm = new Vue({
- data: {
- a: 1,
- b: 2,
- c: 3,
- d: 4,
- e: {
- f: {
- g: 5
- }
- }
- },
- watch: {
- a: function (val, oldVal) {
- console.log('new: %s, old: %s', val, oldVal)
- },
- // 方法名
- b: 'someMethod',
- // 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深(对对象的深度监听)
- c: {
- handler: function (val, oldVal) { /* ... */ },
- deep: true
- },
- // 该回调将会在侦听开始之后被立即调用(页面加载时就触发)
- d: {
- handler: 'someMethod',
- immediate: true
- },
- // 你可以传入回调数组,它们会被按顺序逐一调用
- e: [
- 'handle1',
- function handle2 (val, oldVal) { /* ... */ },
- {
- handler: function handle3 (val, oldVal) { /* ... */ },
- /* ... */
- }
- ],
- // watch vm.e.f's value: {g: 5}(只监听对象的某个属性)
- 'e.f': function (val, oldVal) { /* ... */ }
- },
- methods:{
- someMethod(){
- console.log("methods方法中监听");
- }
- }
- })
- vm.a = 2 // => new: 2, old: 1
watch内部可以处理异步相关逻辑