监视属性—watch

  • 当被监视的属性变化时,回调函数自动调用,进行相关操作
  • 监视的属性必须存在,才能进行监视
  • 监视的两种不同写法(请看 基本用法区域)

基本用法

写法1:

<div id="root">
        <h2>今天的天气很{{result}}</h2>
        <input type="button" value="切换" @click="change">
    </div>

<script>
            new Vue({
            data() {
                return {
                    isHot: true
                }
            },
            computed: {
                result() {
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                change() { this.isHot = !this.isHot }
            },
            watch:{
                result:{
                    immediate:true,  //初始化时让handler调用下
                    handler(newValue,oldValue){
                        console.log('现在是:'+ newValue + ';' + '原本是:'+ oldValue )
                    }
                }
            }
        
        }).$mount('#root')
        </script>

PS:handler方法 和 immediate 属性 在什么时候用呢? 答案是:在值最初时候watch就执行

写法2(非创建实例时):

        const vm = new Vue({
            data() {
                return {
                    isHot: true
                }
            },
            computed: {
                result() {
                    return this.isHot ? '炎热' : '凉爽'
                }
            },
            methods: {
                change() { this.isHot = !this.isHot }
            }
           
        
        }).$mount('#root')
        
        vm.$watch('isHot', {
            immediate: true,
            handler(newValue, oldValue) {
                console.log(newValue + '!')
            }
        })

这个方法是在创建实例的时候不知道监视什么,后续用户调用的时候发现需要监视,那么就用这个方法即可

简写(不调用deep和immediate时可使用)

例:

watch:{
                result(){
                        console.log('现在是:'+ newValue + ';' + '原本是:'+ oldValue )
                    }
                }

深度监视

  • (1)Vue中的 watch 默认不监测对象内部值的改变(只有一层监视)
  • (2) 配置deep:true 可以监测对象内部值改变(配置就开启多层监视)
  • 备注:Vue自身是可以监测到对象内部值的改变的,但是 Vue 提供的 watch 默认是不可以的,我们根据数据的具体结构,决定是否采用深度监视

例:

        <div id="root">
            <h2>a:{{numbers.a}}</h2>
            <input type="button" value="+1" @click="numbers.a++">
        </div>

        <script>
            new Vue({
            data() {
                return {
                    numbers:{
                        a:2,
                        b:1
                    }
                }
            },
            watch:{
                numbers:{
                    deep:true,
                    immediate:true,
                    handler(){
                        console.log('a,改变了')
                    }
                }
            }
        
        }).$mount('#root')

总结下:
(1)handler 函数是当监视对象发生改变时调用
(2)immediate 默认为false ,开启为true。作用是初始化时就让 handler 调用一下(一刷新 handler就立刻运行一次)
(3)deep 默认为false ,开启为true。开启后作用是深度监视

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容