Vue学习笔记之侦听器

1、基本侦听器

当简单响应式属性发生变化时,可通过添加属性的侦听器,自动监测属性变化事件,如下代码,定义了3个响应式属性,分别为question、answer、loading,侦听器定义在关键字watch区域,使用语法格式question(newQuestion,oldQuestion)定义侦听器函数,当输入包含?时,将自动调用异步函数getAnswer,从api中获取问题答案,并同步更新响应式属性的数据。

<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<div id="app">
    <p>
        Ask a yes/no question:
        <input v-model="question" :disabled="loading" />
    </p>
    <p>{
  {answer}}</p>
</div>
<script>
    const { createApp } = Vue;
    createApp({
        data(){
            return {
                question: '',
                answer: 'Questions usually contain a question mark.;-)',
                loading: false,
                obj: {
                    name:'黄飞虎'
                }
            }
        },
        watch: {
            question(newQuestion, oldQuestion) {
                this.obj.name = newQuestion;
                if (newQuestion.includes('?')) {
                    this.getAnswer();
                }
            },
            'obj.name'(newvalue) {
                console.log(newvalue);
            },
            obj: {
                //handler(newvalue, oldvalue) {
                //    console.log(newvalue.name + ',' + oldvalue.name);
                //},
                //deep: true //深层侦听器,对象任何属性更改均能监测
                handler(newvalue) {
                    console.log(newvalue.name);
                },
                flush:'post',//侦听器回调中访问的 DOM 将是被 Vue 更新之前的状态,则设置此属性
                immediate: true //组件初始化后立即执行上述回调函数
            }
        },
        methods: {
            async getAnswer() {
                this.loading = true;
                this.answer = 'Thinking...';
                try {
                    const res = await fetch('https://yesno.wtf/api');
                    this.answer = (await res.json()).answer;
                } catch (error) {
                    this.answer = 'Error! Could not reach the API.' + error;
                } finally {
                    this.loading = false;
                }
            }
        },
        created() {
            const unwatch = this.$watch('obj.name', (newvalue) => {
                console.log('命令式创建侦听器:'+newvalue);
            });
            unwatch();//停止该侦听器
        }
    }).mount('#app');
</script>

2、层级属性侦听器

可侦听复杂对象的某个属性的变化,使用.隔开关键字语法形式,如上述代码,定义了复杂对象obj,使用语法'obj.name'(newvalue)定义侦听器处理函数。

watch:{
'obj.name'(newvalue) {
                console.log(newvalue);
            }
}

3、深层侦听器

使用deep:true关键字修饰侦听器,可以监听嵌套对象所有属性的变更,如下代码,增加了obj对象的深层侦听器。

watch: {
            obj: {
                handler(newvalue, oldvalue) {
                    console.log(newvalue.name + ',' + oldvalue.name);
                },
                deep: true //深层侦听器,对象任何属性更改均能监测
            }
        }

4、即时回调侦听器

使用immediate: true关键字修饰侦听器,可以在组件初始化之后立即执行侦听器回调函数,

watch: {
            obj: {
                handler(newvalue) {
                    console.log(newvalue.name);
                },
                immediate: true //组件初始化后立即执行上述回调函数
            }
        }

5、回调的触发时机

如果想在侦听器回调中能访问被 Vue 更新之后的 DOM,请使用flush:'post'关键字修饰侦听器,

watch: {
            obj: {
                handler(newvalue) {
                    console.log(newvalue.name);
                },
                flush:'post'//侦听器回调中访问的 DOM 将是被 Vue 更新之前的状态,则设置此属性
            }
        }

6、命令式创建侦听器

可使用关键字$watch创建侦听器,也可以随时停止侦听器,如下代码:

created() {
            const unwatch = this.$watch('obj.name', (newvalue) => {
                console.log('命令式创建侦听器:'+newvalue);
            });
            unwatch();//停止该侦听器
        }

相关推荐

  1. Vue学习笔记侦听器

    2024-01-30 17:34:01       69 阅读
  2. vue 侦听器

    2024-01-30 17:34:01       46 阅读
  3. vue-侦听器

    2024-01-30 17:34:01       27 阅读
  4. vue侦听器

    2024-01-30 17:34:01       62 阅读
  5. Vue3 watch侦听器

    2024-01-30 17:34:01       45 阅读
  6. Vue侦听器(Watch)深度分析

    2024-01-30 17:34:01       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-30 17:34:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-30 17:34:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-30 17:34:01       87 阅读
  4. Python语言-面向对象

    2024-01-30 17:34:01       96 阅读

热门阅读

  1. 【力扣经典面试题】27. 移除元素

    2024-01-30 17:34:01       64 阅读
  2. Spring JPA与Hibernate学习使用

    2024-01-30 17:34:01       60 阅读
  3. Oracle Extractor 软件下载

    2024-01-30 17:34:01       68 阅读
  4. git由SSH更改为HTTPS

    2024-01-30 17:34:01       51 阅读
  5. CSS transition(过渡效果)详解

    2024-01-30 17:34:01       52 阅读
  6. 【Rust】第七节:枚举与模式匹配

    2024-01-30 17:34:01       70 阅读
  7. Tensorflow2.x实现用于model.fit()中的医学图像dataset

    2024-01-30 17:34:01       42 阅读