Vue2基础篇-11-监视属性

1. demo1- 使用点击事件完成

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title> 监视属性-天气案例</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>今天天气很{{info}}</h3>
        <!-- <button @click="changeWeather">切换天气</button> -->

        <!-- 如果是非常简单的表达式,也可以这样写,因为它是从vm上找,vm上存在的都能这样玩,但是还是建议使用方法 -->
        <button @click="isHot = !isHot">切换天气</button>
    </div>
    <script text="text/javascript">
        new Vue({
            el: "#root",
            data: {
                isHot: true
            },
            computed: {
                info() {
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                changeWeather() {
                    this.isHot = !this.isHot
                }
            },
        })
    </script>
</body>
</html>

2. demo2-使用监视属性完成

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>监视属性-天气案例-watch</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>今天天气很{{info}}</h3>
        <button @click="{{changeWeather()}}">切换天气</button>
    </div>
    <script text="text/javascript">
        const vm = new Vue({
            el: "#root",
            data: {
                isHot: true
            },
            computed: {
                info() {
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                changeWeather() {
                    this.isHot = !this.isHot
                }
            },
            // watch: {
            //     immediate: true,  //默认是false,当改成true时,使用场景就是初始化时,让handler调用一下
            //         //handler什么时候调用?当isHot发生变化时
            //          除了可以监视data内的属性之外,computed里面的方法属性也可以监视
            //         handler(newValue, oldValue) {
            //             console.log('isHot被修改了', newValue, oldValue);
            //     }
            // }
        })
        //除了在vm里面可以写watch监视之外,在外面也可以这样写
        vm.$watch('isHot', {
            immediate: true,
            handler(newValue, oldValue) {
                console.log('isHot被修改了', newValue, oldValue);
            }

        })

        /**
         *    监视属性watch:
         * 
         *      1. 当被监视的属性变化时,回调函数自动调用,进行相关操作;
         *      2. 监视的属性必须存在,才能进行监视!!
         *      3. 监视的两种写法:
         *         1. new Vue时传入watch 配置
         *         2. 通过vm.$watch监视
         *
    </script>
</body>
</html>

3. 深度监视

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>监视属性-天气案例-深度监视-watch</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>数字为{{numbers.a}}</h3>
        <button @click="{{numbers.a++}}">切我数字自增</button>
    </div>
    <script text="text/javascript">
        const vm = new Vue({
            el: "#root",
            data: {
                numbers: {
                    a: 1,
                    b: 1
                }
            },
            watch: {
                //监视多级结构中某个属性的变化,这里需要注意,vue里面的key都是字符串,只是我们有时候简写,把字符串的逗号省略了

                // 'numbers.a': {
                //     handler() {
                //         console.log("number被修改了")
                //     }
                // },

                //这样写表面看是会监视numbers的内部所有数据的变化,其实不是,它监视的是numbers这个整体的地址,而不是里面具体的元素的变化
                numbers: {
                    deep: true,  //要想监测到具体某个元素的变化,需要打开深度监测
                    handler() {
                        console.log("number被修改了")
                    }
                }
            }
        })
        /**
         * 深度监视
         *
         *   1. Vue中的watch默认不监测对象内部值的改变(一层);
         *   2. 配置 deep:true 可以监测对象内部值改变(多层);
         *
         * 备注:
         *
         *    1. Vue自身可以监测对象内部值得改变,但Vue提供的watch默认不可以;
         *    2. 使用watch时根据数据的具体结构,决定是否采用深度监视
         *
    </script>
</body>
</html>

4. 深度监视 简写

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>监视属性-天气案例-深度监视-watch-简写</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <div id="root">
        <h3>数字为{{numbers.a}}</h3>
        <button @click="{{numbers.a++}}">切我数字自增</button>
    </div>
    <script text="text/javascript">
        const vm = new Vue({
            el: "#root",
            data: {
                numbers: {
                    a: 1,
                    b: 1
                }
            },
            // watch: {
            //     //简写
            //     numbers(newValue, oldValue) {
            //         immediate: true  //初始化时让handker调用一下
            //         deep: true  //深度检测  
            //         console.log('number被修改了', newValue, oldValue)
            //     }
            // }
        })
        //简写
        vm.$watch('numbers', function (newValue, oldValue) {
            console.log('number被修改了', newValue, oldValue)
        })
    </script>
</body>
</html>

5. computed和watch的区别

        //计算属性与监视属性(侦听属性比对)  https://cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7-vs-%E4%BE%A6%E5%90%AC%E5%B1%9E%E6%80%A7
       /**
        *   computed和watch 之间的区别:
        *      1. computed能完成的功能,watch都可以完成。
        *      2. watch能完成的功能,computed不一定能完成,比如 watch可以进行异步操作;
        *
        * 两个重要的小原则:
        *
        *     1. 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件 实例对象。
        *     2. 所有不被Vue所管理的函数(定时器的回调函数,ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alan0517

感谢您的鼓励与支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值