[30天 Vue学好学满 DAY7] 监听器(Watch)

Watch 监听器

具比较传(old & new)
无回传值(return)
监听变数发生异动-> 触发
监听变数无实际异动(true -> true),不进行触发

Key

监听目标

Value

callback 函数

实做

HTML

<button @click="addValue">add</button>
<h3>{{ count }}</h3>
<h3>{{ showValue }}</h3>

定义变数

count: 0,
equalsFive: false,
showValue: "",

定义方法: 按下按钮 count + 1

addValue: function () {
    this.count += 1;
},

监听器

watch: {
    // 监听count 
    count: function (val) {
      console.log(val); // 预设 new value
      this.equalsFive = (val == 5);
    },
    // equalsFive
    equalsFive: function (newVal, oldValue) {
      console.log('old value : ' + oldValue);
      console.log('new value : ' + newVal);
      this.showValue = "It's Five Now";
    },
},

执行测试:初始画面,不进行任何触发
https://ithelp.ithome.com.tw/upload/images/20210906/201295360h5J18o3gB.png

按4次按钮:count触发4次,equalsFive未进行触发
https://ithelp.ithome.com.tw/upload/images/20210906/201295363iZ60BAlCR.png

按第5次按钮:count & equalsFive 进行触发
https://ithelp.ithome.com.tw/upload/images/20210906/20129536ctXWz595nZ.png


物件形式 handler、deep

handler:欲进行的处理
deep:深度观察,call by reference

调整 count HTML

<h3>{{ obj.count }}</h3>

调整变数 count

obj:{
    count: 0,
},

监听器

obj: function (val) {
    console.log(val)
      this.equalsFive = (val.count == 5);
},

进行测试:无监听效果
https://ithelp.ithome.com.tw/upload/images/20210906/2012953646Hbxjk0Fu.png

将监听器加上handler并设定deep

obj: {
    handler: function (val) {
        console.log(val);
        this.equalsFive = val.count == 5;
    },
    deep: true

进行测试:触发成功
https://ithelp.ithome.com.tw/upload/images/20210906/20129536LJyFu6XD7q.png

immediate

初始化即触发handler

调整监听器

obj: {
    handler: function (val) {
        console.log('immediate!');
        this.equalsFive = val.count == 5;
    },
    deep: true,
    immediate: true
},

进行测试:初始即触发
https://ithelp.ithome.com.tw/upload/images/20210906/201295360LVTr40smx.png

大致跟昨天的computed做比较

computed 不论来源是否有实际异动皆触发
watch 监听值实际异动则触发

computed 依赖值 -> 一个结果 (无法异动无关变数)
watch 监听值 -> 程序 (可对其他参数、方法进行操作)

computed 将结果暂存

watch 可取旧值


有错误请不吝指教!

参考资料
https://cn.vuejs.org/v2/guide/computed.html
https://medium.com/unalai
https://cythilya.github.io/2017/04/15/vue-watch/
https://ithelp.ithome.com.tw/articles/10204091
https://medium.com/@jedy05097952/vue-%E9%82%84%E6%98%AF%E4%B8%8D%E6%87%82-computed-83a200571e1b

感谢各路大神 /images/emoticon/emoticon31.gif


<<:  【D7】取得历史资料:三大法人-区分期货与选择权二类

>>:  Day7 - 读 Concurrency is not Parallelism - Rob Pike (二)

DAY29 Aidea专案实作-AOI瑕疵检测(4/4)

经过不懈的努力!我们终於来到此次专案时做的最後一个章节,前三个部分我们已经算是达成任务,成功训练出一...

[Android Studio 30天自我挑战] 练习APP-计算BMI

熟悉版面後,透过基本的原件就可以练习计算BMI的APP了 首先,在xml档新增标题及输入元件(Tex...

[Day7] [笔记] React Props (上)

前言 前两天,我们知道了何谓 Component 、 Component 如何撰写与 React 开...

[第三天]从0开始的UnityAR手机游戏开发-如何开启专案和汇入Vuforia插件到Unity

在开启专案之前必须有Unity授权才能开启和运行专案,所以在开启专案之前会先来教大家如何取得授权。 ...

Day 4 Odoo 资料库栏位建立

Odoo模组开发实战 目录 基础栏位建立 第一章 基础栏位建立 1.设定名称 2.至models/m...