vue3 computed watchEffect

307 阅读2分钟

这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

vue3 computed和vue2 computed用法上差不多

vue2的用法 简单写下

{
  data: function() {
     return{
        a: 1,
        b: 2
     }
  },
  computed: {
    add: function() {
       return this.a+this.b
    }
  }
}

vue3 的简单写法

一般情况下第一种方式用的多

import { computed,ref  } from 'vue' // 在vue里解构出来
{
  setup(props,ctx) {
     let g = ref(1)
     let h = computed(()=> 'fasfasas'+g)  // computed就是在getter上又多加了一层,也就是有两个getter
     
     return {
       h
     }
  }

}
  // 第二种写法
{

setup(props,ctx) {
   let g = ref(1)
   let h = computed({ // 第两种方式 是可以设置get set
     getter: function() {
       return g+1
     }
     setter: function(val) {
       g.value = val-1
     }
   })
}
}

watchEffect 会立即执行,并且响应式的追踪依赖 (watchEffect源码上会有一个依赖收集的过程,并且响应式的监听,只要数据改变了就回去再去执行) 注意 在当前组件卸载/销毁的时候 watchEffect会停止监听

watchEffect 会返回一个具柄函数 如果你执行了 watchEffect返回的参数 也会停止监听

vue5.png 没有执行返回的stop 执行

vue6.png 上面是打印的log

vue55.png 上面图片是执行了stop代码的截图

下面是log 执行了一次

vue55.png

watchEffect副作用(如请求数据)

watchEffect((onInvalidate)=>{  //watchEffect里也有一个传过来的参数

// onInvalidate也是一个函数 调用的话 需要传一个参数
onInvalidate(()=>{ // 这个函数什么时候会执行 第一次不会执行,只有在所监听的数据即将发生改变了之后才会执行
   console.log('onInvalidate')
})

})

上面说的可能比较理论一点,咱们看下代码,和日志

vue555.png 这是打印出来的日志

vue666.png 大家看可以看到 都是在数据变化之前就触发了onInvalidate函数

这个用法的一个场景就是截流了,一个输入框我们输入文字,然后请求接口,当时我们需要它最后一次才执行,在这里的用法

watchEffect(async function(onInvalidate) {
 let g = await ajax()   
onInvalidate(()=>{ // 在这里截流

})
})

上面是一个简单的场景介绍