Vue !!!一定要懂的 watch 监听 和 computed 计算

131 阅读1分钟

总结:watch 监听属性 和computed 计算 属性

watch

  • 类型vm.$watch( expOrFn, callback, [options]
  1. 参数
    expOrFn :{string | function } 字符串和方法
    callback: {Object | function } 对象和方法
    [options] : {Object| options} 对象和参数
    返回值 {function} unwatch 用法: 观察一个表达式或者一个函数计算结果的变化。回调函数得到的参数为新值和旧值 表达式只接收简单的键路径;复杂的表达式,用一个函数取代。
  2. 应用
    监听prpos ,$emit或本组件的值执行异步操作
  3. 特点:
    无缓存性,页面重新渲染时值不变化也会执行。
  4. 有deep immediate
    computed :
  • 类型{ [key: string]: Function | { get: Function, set: Function } }

1.参数
[key: string]: Function
{ get: Function, set: Function }
2. 应用
简化tempalte 里面的{{}}计算和处理props或$emit 的传值
3. 特点
具有缓存性 ,页面重新渲染值不变化 计算属性会立即返回之前的计算结果,而不必再次执行函数。
4. 有getter setter

watch 监听属性

监听自身属性变化 监听路由变化 一个数据影响多个数据

//  data部分
a:1,
b:2,
c:,
d:4,
e:{
   f:{
      g:5
   }
}
watch :{
 a(val,oldval){
     console.log(val,oldval) 
 }
 // 方法名
 b:'someMethods',
 // 该回调会在任何被侦听的对象的property改变时被调用,不论其被嵌套多深
 c:{
       handler(val,old){
          
       },
       deep:true  
 },
 //  该回调再侦听之后就立即被调用
 d:{
 handler:"somemethods",
 immediate:true
 },
 // 可以传入回调数组,他们会被逐一调用
 e:[
 'handle1',
 handle2(){   },
 {
 handler:handle3(){   },
 }
 ],
 'e.f'(){  }
 }
}

不要使用箭头函数来定义watcher函数
箭头函数绑定了父级作用域的上下文 ,this不会按照期望指向Vue实例
eg1
<template>
  <div class="example">
    {{message}}
    <br>
   <input v-model="question">
   <p>
    {{answer}}
   </p>
  </div>
</template>

<script>
export default {
 name:"watchDemo",
    data(){
        return{
  message:'lemon and oragnge?',
  question:'',
  answer:''
        }
    },
    watch:{
          question(){
            this.answer =' qiu de ma dei'
            this.debounce()
          }

    },
    methods:{
       debounce(){
              if(this.question =='lemon'){
                this.answer ='酸Q 酸 Q'
              }else{
                this.answer='我也要吃'
              }
}

    }

}
</script>

// vm.$watch 返回一个取消观察函数,用来停止触发回调
var unwatch = vm.$watch('a',cb)
// 之后取消观察 
unwatch()

### 选项 deep 
        检查对象内部值的变化 ,监听数组是不需要的
### 选项 immediate 
        将立即以表达式的当前值触发回调
        
### 监听路由变化
watch :{
  '$route':function(new,old){
  }
}

computed 计算属性

一个数据影响多个数据
在一个计算属性中可以完成各种复杂的逻辑,包括运算,函数调用等,只要最终返回一个结果就可以。
每一个计算属性都包含了一个getter()和一个setter() get()取值的时候调用 set 重新赋值的时候调用
本质是方法 但是不能调用
不支持异步 异步操作无效无法监听 用于多对一的情况

image.png

get(getter):  get函数中的值,被调用或被修改就会调用
set(setter):**说绑定的数据被修改后会返回最新的数据**
<template>
  <div>
<input type="checkbox" v-model="checked">
  </div>
</template>

<script>
 
export default {
 name:"computedDemo",
    data(){
        return{
 list:['lemon','orange','orange','mango']
        }
    },
    // 完整写法
    computed:{
           checked:{
            get(){
                return this.list.every(x=>x=='flower')  // list被调用就回调用
            },
            set(v){
                console.log(v)  // 含绘制是修改的具体值

            }
           }
    },
    // 简写 读取的时候
     computed:{
           checked(){
                return this.list.every(x=>x=='flower')  // list被调用就回调用
            }
    }
}
</script>