VUE3使用watch监测数据变化

 1 // 不要忘了导入要用的 API
 2 import { defineComponent, reactive, watch } from 'vue'
 3 
 4 export default defineComponent({
 5   setup() {
 6     // 定义一个响应式数据
 7     const userInfo = reactive({
 8       name: 'Petter',
 9       age: 18,
10     })
11 
12     // 2s后改变数据
13     setTimeout(() => {
14       userInfo.name = 'Tom'
15     }, 2000)
16 
17     /**
18      * 可以直接监听这个响应式对象
19      * callback 的参数如果不用可以不写
20      */
21     watch(userInfo, () => {
22       console.log('监听整个 userInfo ', userInfo.name)
23     })
24 
25     /**
26      * 也可以监听对象里面的某个值
27      * 此时数据源需要写成 getter 函数
28      */
29     watch(
30       // 数据源,getter 形式
31       () => userInfo.name,
32       // 回调函数 callback
33       (newValue, oldValue) => {
34         console.log('只监听 name 的变化 ', userInfo.name)
35         console.log('打印变化前后的值', { oldValue, newValue })
36       }
37     )
38   },
39 })

 

批量监测

 

 1 import { defineComponent, ref, watch } from 'vue'
 2 
 3 export default defineComponent({
 4   setup() {
 5     // 定义多个数据源
 6     const message = ref<string>('')
 7     const index = ref<number>(0)
 8 
 9     // 2s后改变数据
10     setTimeout(() => {
11       message.value = 'Hello World!'
12       index.value++
13     }, 2000)
14 
15     watch(
16       // 数据源改成了数组
17       [message, index],
18       // 回调的入参也变成了数组,每个数组里面的顺序和数据源数组排序一致
19       ([newMessage, newIndex], [oldMessage, oldIndex]) => {
20         console.log('message 的变化', { newMessage, oldMessage })
21         console.log('index 的变化', { newIndex, oldIndex })
22       }
23     )
24   },
25 })

 

深度监听

 1 import { defineComponent, ref, watch } from 'vue'
 2 
 3 export default defineComponent({
 4   setup() {
 5     // 定义一个响应式数据,注意我是用的 ref 来定义
 6     const nums = ref<number[]>([])
 7 
 8     // 2s后给这个数组添加项目
 9     setTimeout(() => {
10       nums.value.push(1)
11 
12       // 可以打印一下,确保数据确实变化了
13       console.log('修改后', nums.value)
14     }, 2000)
15 
16     // 但是这个 watch 不会按预期执行
17     watch(
18       nums,
19       // 这里的 callback 不会被触发
20       () => {
21         console.log('触发监听', nums.value)
22       },
23       // 因为关闭了 deep
24       {
25         deep: false,
26       }
27     )
28   },
29 })

 

立即执行

 1 import { defineComponent, ref, watch } from 'vue'
 2 
 3 export default defineComponent({
 4   setup() {
 5     // 这个时候不会触发 watch 的回调
 6     const message = ref<string>('')
 7 
 8     // 2s后改变数据
 9     setTimeout(() => {
10       // 来到这里才会触发 watch 的回调
11       message.value = 'Hello World!'
12     }, 2000)
13 
14     watch(message, () => {
15       console.log('触发监听', message.value)
16     })
17   },
18 })

 

 1 import { defineComponent, ref, watch } from 'vue'
 2 
 3 export default defineComponent({
 4   setup() {
 5     // 这一次在这里可以会触发 watch 的回调了
 6     const message = ref<string>('')
 7 
 8     // 2s后改变数据
 9     setTimeout(() => {
10       // 这一次,这里是第二次触发 watch 的回调,不再是第一次
11       message.value = 'Hello World!'
12     }, 2000)
13 
14     watch(
15       message,
16       () => {
17         console.log('触发监听', message.value)
18       },
19       // 设置 immediate 选项
20       {
21         immediate: true,
22       }
23     )
24   },
25 })

 

watchEffect 

 1 export default defineComponent({
 2   setup() {
 3     const foo = ref<string>('')
 4 
 5     setTimeout(() => {
 6       foo.value = 'Hello World!'
 7     }, 2000)
 8 
 9     function bar() {
10       console.log(foo.value)
11     }
12 
13     // 使用 watch 需要先手动执行一次
14     bar()
15 
16     // 然后当 foo 有变动时,才会通过 watch 来执行 bar()
17     watch(foo, bar)
18   },
19 })
 1 export default defineComponent({
 2   setup() {
 3     const foo = ref<string>('')
 4 
 5     setTimeout(() => {
 6       foo.value = 'Hello World!'
 7     }, 2000)
 8 
 9     function bar() {
10       console.log(foo.value)
11     }
12 
13     // 可以通过 watchEffect 实现 bar() + watch(foo, bar) 的效果
14     watchEffect(bar)
15   },
16 })

 

 

来自于: https://vue3.chengpeiquan.com/component.html#基础用法

 

posted @ 2022-07-09 09:28  googlegis  阅读(3406)  评论(0编辑  收藏  举报

坐标合肥,非典型GIS开发人员 GitHub