VUE的侦听器watch

这是关于VUE的watch侦听器的学习笔记,这里面介绍了关于VUE的watch侦听器的一些使用方法和注意事项。
侦听属性watch:
1.当被监视的属性变化时, 回调函数自动调用, 进行相关操作
2.监视的属性必须存在,才能进行监视,否则就监听不了,在浏览器的控制台上就会报错
3.监视的两种写法:
(1).new Vue时传入watch配置
(2).通过vm.$watch()
深度监听:
1.Vue中的watch默认不监测对象内部值的改变(一层),deep一般默认为false。
2.配置deep:true可以监测对象内部值改变(多层)。
3.当配置为deep:true,.Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以!
4.使用watch时根据数据的具体结构,决定是否采用深度监视。
computed和watch之间的区别:
1.computed能完成的功能,watch都可以完成。
2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
这两个的使用,我们要根据具体情况而定。
两个重要的小原则:
1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。
2.所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。
案例代码1:主要是介绍了watch的基本使用方法
案例代码2:主要介绍了深度侦听
案例代码3:主要是对比计算属性和侦听属性

案例代码1:

<!DOCTYPE html>
<html lang="en">
<head>
                  <meta charset="UTF-8">
                  <meta http-equiv="X-UA-Compatible" content="IE=edge">
                  <meta name="viewport" content="width=device-width, initial-scale=1.0">
                  <title>监视天气</title>
                  <script type="text/javascript" src="../vue_js/vue.js"></script>
</head>
<body>
        <div id="wd">
                  <h1>武汉的今日真的很{{weather}}</h1>
                  <button @click = "xiugai">切换按钮</button>
        </div> 
        <script>
                Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
                  const watchExampleVM = new Vue({
                                    el:"#wd",
                                    data:{
                                                      isWeather:true
                                    },
                                    computed:{
                                        weather(){
                                                return this.isWeather?'很热':'很冷';
                                        }
                                    },
                                    methods: {
                                        xiugai(){
                                                this.isWeather = !this.isWeather;
                                        }
                                    },
                                    watch:{
                                        //immediate:true, //初始化时让handler调用一下
                                        isWeather(newValue,oldValue){
                                                console.log("天气变化了"+newValue+","+oldValue);
                                        }
                                    }

                  });
        </script>         
</body>
</html>

案例代码2:

<!DOCTYPE html>
<html lang="en">

<head>
                  <meta charset="UTF-8">
                  <meta http-equiv="X-UA-Compatible" content="IE=edge">
                  <meta name="viewport" content="width=device-width, initial-scale=1.0">
                  <title>深度监视天气的变化</title>
                  <script type="text/javascript" src="../vue_js/vue.js"></script>
</head>

<body>
                  <div id="root1">
                                    <h1>武汉的天气是真的{{weatherOfHotOrCold}}</h1>
                                    <button @click="weacherListener">点击按钮进行切换变器,并且监视天气的变化</button>
                                    <h1>我们在一个伟大的国家里,这个国家是{{country.Asia.CH}}</h1>
                                    <button @click="showGreatCountry">我爱中国</button>
                  </div>
                  <script>
                                    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
                                    const weatherVM = new Vue({
                                                      el: '#root1',
                                                      data: {
                                                                        isHotOrCold: true,
                                                                        country: {
                                                                                          Asia: {
                                                                                                            CH: 'China'
                                                                                          }
                                                                        }
                                                      },
                                                      computed: {
                                                                        weatherOfHotOrCold() {
                                                                                          return this.isHotOrCold ? '炎热' : '很冷';
                                                                        }
                                                      },
                                                      methods: {
                                                                        weacherListener() {
                                                                                          this.isHotOrCold = !this.isHotOrCold;
                                                                        },
                                                                        showGreatCountry() {
                                                                                          this.country.Asia.CH = '最大的国家---->中国';
                                                                        }
                                                      },
                                                      watch: {

                                                                        isHotOrCold: {
                                                                                          handler(newValue, oldValue) {
                                                                                                            console.log(newValue + "---" + oldValue);
                                                                                          }
                                                                        },
                                                                        country: {
                                                                                          deep: true,
                                                                                          handler() {
                                                                                                            alert(this.country.Asia.CH + "是世界上最伟大的国家");
                                                                                          }
                                                                        }
                                                      }
                                    })
                  </script>
</body>

</html>

案例代码3:

<!DOCTYPE html>
<html lang="en">

<head>
                  <meta charset="UTF-8">
                  <meta http-equiv="X-UA-Compatible" content="IE=edge">
                  <meta name="viewport" content="width=device-width, initial-scale=1.0">
                  <title>姓名案例的watch实现</title>
                  <script type="text/javascript" src="../vue_js/vue.js"></script>
</head>

<body>
                  <div id="demo1">
                                    <h1>我们这里使用计算属性实现姓名案例</h1>
                                    姓氏:<input type="text" v-model="surname"></br>
                                    名字:<input type="text" v-model="name"></br>
                                    完整的名字:<span>{{fullName}}</span>
                                    <h1>我们这里使用watch侦听实现姓名案例,全名那里改变的事件比前面延迟一秒钟</h1>
                                    姓氏:<input type="text" v-model="watch_surname"></br>
                                    名字:<input type="text" v-model="watch_name"></br>
                                    完整的名字:<span>{{watch_fullName}}</span>
                  </div>
                  <script>
                                    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
                                    const vm = new Vue({
                                                      el: '#demo1',
                                                      data: {
                                                                        surname: '张',
                                                                        name: '三',
                                                                        watch_surname: '李',
                                                                        watch_name: '四',
                                                                        watch_fullName: '李-四'
                                                      },
                                                      computed: {
                                                                        fullName: {
                                                                                          get() {
                                                                                                            return this.surname + "-" + this.name;
                                                                                          }
                                                                        }
                                                      },
                                                      watch: {
                                                                        //正常完整的写法
                                                                        'watch_surname': {
                                                                                          handler(value1) {
                                                                                                            console.log(value1);
                                                                                                            this.watch_fullName = value1 + "-" + this.name;
                                                                                          }
                                                                        },
                                                                        'watch_name': {
                                                                                          handler(value2) {
                                                                                                            setTimeout(() => {
                                                                                                                              console.log(this);
                                                                                                                              this.watch_fullName = this.watch_surname + "-" + value2;
                                                                                                            }, 1000);
                                                                                          }
                                                                        }
                                                                        //简写形式
                                                                        /*watch_surname(val) {
                                                                                          setTimeout(() => {
                                                                                                            console.log(this)
                                                                                                            this.watch_fullName = val + '-' + this.watch_name;
                                                                                          }, 1000);
                                                                        },
                                                                        watch_name(val) {
                                                                                          this.watch_fullName = this.watch_surname + '-' + val
                                                                        }*/
                                                      }
                                    });
                                    //正常完整的写法
                                    /*vm.$watch('watch_surname', {
                                                      handler(value) {
                                                                        this.watch_fullName = value + "---" + this.watch_name;
                                                                        console.log(this.watch_fullName);
                                                      }
                                    })*/
                                    //简写形式
                                    /*vm.$watch('watch_name',function(value){
                                                      console.log(this);
                                                      this.watch_fullName = this.watch_surname + "---" + value;             
                                    })*/
                  </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值