watch (观察者)

基础使用方式

观察响应式依赖(数据),当依赖发生变化时,将会触发函数执行。

  1. <script>
  2. import { createComponent, watch, ref } from '@vue/composition-api'
  3. export default createComponent({
  4. setup() {
  5. const count = ref(0)
  6. watch(() => console.log(count.value))
  7. // -> logs 0
  8. setTimeout(() => {
  9. count.value++
  10. // -> logs 1
  11. }, 1000)
  12. }
  13. })
  14. </script>

观察一个源对象

如果需要获取观察源对象变化的新值和旧值,可以提供一个回调函数,它接收两个可选参数,第 1 个是新值,第 2 个是旧值。

  • 观察一个 reactive 对象
  1. <script>
  2. import { createComponent, watch, reactive } from '@vue/composition-api'
  3. export default createComponent({
  4. setup() {
  5. // 观察reactive
  6. const state = reactive({ count: 0 })
  7. watch(
  8. () => state.count,
  9. (count, prevCount) => {
  10. console.log(count)
  11. console.log(prevCount)
  12. }
  13. )
  14. setTimeout(() => {
  15. state.count++
  16. }, 1000)
  17. }
  18. })
  19. </script>
  • 观察一个 ref 对象
  1. <script>
  2. import { createComponent, watch, ref } from '@vue/composition-api'
  3. export default createComponent({
  4. setup() {
  5. //直接观察 ref
  6. const count = ref(0)
  7. watch(count, (count, prevCount) => {
  8. console.log(count)
  9. console.log(prevCount)
  10. })
  11. setTimeout(() => {
  12. count.value++
  13. }, 1000)
  14. }
  15. })
  16. </script>

观察多个源

reactive 和 ref 都是可以被观察的,可以使用数组的方式,来同时观察多个源。

  1. <script>
  2. import { createComponent, watch, ref } from '@vue/composition-api'
  3. export default createComponent({
  4. setup() {
  5. const fooRef = ref(0)
  6. const barRef = ref(0)
  7. watch([fooRef, barRef], (currArr, prevArr) => {
  8. console.log(currArr, 'newValue')
  9. console.log(prevArr, 'oldValue')
  10. })
  11. // or
  12. watch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => {
  13. /****/
  14. })
  15. setTimeout(() => {
  16. fooRef.value++
  17. barRef.value++
  18. /* 打印
  19. * [1,1] "newValue"
  20. * [0,0] "oldvalue"
  21. */
  22. }, 1000)
  23. }
  24. })
  25. </script>

关闭 watch

watch 被创建时,会返回一个关闭函数,可以用该函数关闭一个 watch。

  1. <script>
  2. import { createComponent, watch, ref } from '@vue/composition-api'
  3. export default createComponent({
  4. setup() {
  5. const count = ref(0)
  6. const stop = watch(() => console.log(count.value))
  7. stop() //关闭该观察者
  8. setTimeout(() => {
  9. // 更改count的值,但是不会触发观察者。
  10. count.value++
  11. }, 1000)
  12. }
  13. })
  14. </script>

懒调用

使用前面的示例可以看到,观察者第一次被创建都会去触发一遍回调函数,假如需要当值被改变时才触发观察者,可以加入lazy配置。

  1. <script>
  2. import { createComponent, watch, ref } from '@vue/composition-api'
  3. export default createComponent({
  4. setup() {
  5. const count = ref(0)
  6. // 第一次执行不会打印
  7. watch(count, value => console.log(value), { lazy: true })
  8. setTimeout(() => {
  9. count.value++
  10. // -> logs 1
  11. }, 1000)
  12. }
  13. })
  14. </script>