Explorar o código

feat: 添加 watch 侦听器

nicetry12138 hai 1 ano
pai
achega
84e815c11a
Modificáronse 2 ficheiros con 144 adicións e 0 borrados
  1. 107 0
      前端/Vuejs.md
  2. 37 0
      前端/src/VueDemo/demo1/index5.html

+ 107 - 0
前端/Vuejs.md

@@ -1181,3 +1181,110 @@ const vnode = {
 也就是计算属性有更好的性能表现,对于重复数据减少的计算次数
 
 ### 侦听器 Watch
+
+在 `data` 中定义了数据,数据通过 `{{}}` 语法绑定到 `template` 中,数据变化时更新显示内容。在某些情况下,期望在代码中监听某个数据的变化,这个时候就要使用 `watch` **侦听器**
+
+`watch` 的类型是 `{[key: string]: string | Function | Object | Array}`
+
+```html
+<div id="app1"></div>
+<template id="template1">
+
+    <!-- 使用 v-model 绑定数据 -->
+    <input type="text" v-model="message" >
+</template>
+<script>
+    Vue.createApp({
+        template: '#template1',
+        data() {
+            return {
+                message: ""
+            }
+        },
+        methods: {
+            
+        },
+        watch: {
+            message(newVal, oldVal) {
+                console.log(newVal, oldVal);
+            }
+            // 或者 message: function(newVal, oldVal) {}
+        }
+    }).mount('#app1');
+</script>
+```
+
+当 `data` 的 `message` 数据修改的时候,会触发 `watch` 中的 `message` 函数,将当前 `message` 和之前 `message` 的值传递到函数中
+
+> 比如根据 `message` 的变化,发送网络请求实时查询信息
+
+[官方文档有更为详细的案例介绍](https://cn.vuejs.org/api/options-state.html#watch)
+
+```js
+export default {
+  data() {
+    return {
+      a: 1,
+      b: 2,
+      c: {
+        d: 4
+      },
+      e: 5,
+      f: 6
+    }
+  },
+  watch: {
+    // 侦听根级属性
+    a(val, oldVal) {
+      console.log(`new: ${val}, old: ${oldVal}`)
+    },
+    // 字符串方法名称
+    b: 'someMethod',
+    // 该回调将会在被侦听的对象的属性改变时调动,无论其被嵌套多深
+    c: {
+      handler(val, oldVal) {
+        console.log('c changed')
+      },
+      deep: true
+    },
+    // 侦听单个嵌套属性:
+    'c.d': function (val, oldVal) {
+      // do something
+    },
+    // 该回调将会在侦听开始之后立即调用
+    e: {
+      handler(val, oldVal) {
+        console.log('e changed')
+      },
+      immediate: true
+    },
+    // 你可以传入回调数组,它们将会被逐一调用
+    f: [
+      'handle1',
+      function handle2(val, oldVal) {
+        console.log('handle2 triggered')
+      },
+      {
+        handler: function handle3(val, oldVal) {
+          console.log('handle3 triggered')
+        }
+        /* ... */
+      }
+    ]
+  },
+  methods: {
+    someMethod() {
+      console.log('b changed')
+    },
+    handle1() {
+      console.log('handle 1 triggered')
+    }
+  },
+  created() {
+    this.a = 3 // => new: 3, old: 1
+  }
+}
+```
+
+> `{handler(val, oldVal) {}}` 与 `function(val, oldVal) {}` 效果一样
+

+ 37 - 0
前端/src/VueDemo/demo1/index5.html

@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>My Web Page</title>
+</head>
+<body>
+    <!-- 通过 CDN 导入 vue -->
+    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
+    
+    <div id="app1"></div>
+    <template id="template1">
+
+        <!-- 使用 v-model 绑定数据 -->
+        <input type="text" v-model="message" >
+    </template>
+    <script>
+        Vue.createApp({
+            template: '#template1',
+            data() {
+                return {
+                    message: ""
+                }
+            },
+            methods: {
+                
+            },
+            watch: {
+                message(newVal, oldVal) {
+                    console.log(newVal, oldVal);
+                }
+            }
+        }).mount('#app1');
+    </script>
+</body>
+</html>