【Vue】基础语法(四)计算属性与监视

一、计算属性

  1. 定义:要用的属性不存在,要通过已有属性计算得来。
    例如:已知姓和名,求全名。
  2. 原理:底层借助了Objcet.defineproperty方法提供的getter和setter。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <div id="root">
        姓:<input type="text" v-model="firstName"> <br/><br/>
        名:<input type="text" v-model="lastName"> <br/><br/>
        全名:<span>{{fullName}}</span> <br/><br/>
    </div>
     
     
    <script type="text/javascript">
            Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。
        const vm = new Vue({
            el:'#root',
            data:{
                firstName:'张',
                lastName:'三',
            },
            computed:{
                fullName:{
                                    //get什么时候调用?1.初次读取fullName时。2.所依赖的数据发生变化时。
                    get(){
                        console.log('get被调用了')
                        return this.firstName + '-' + this.lastName
                    },
                    //set什么时候调用? 当fullName被修改时。
                    set(value){
                        console.log('set',value)
                        const arr = value.split('-')
                        this.firstName = arr[0]
                        this.lastName = arr[1]
                    }
                }
            }
        })
    </script>
  3. 优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便。
  4. 备注:
    (1)计算属性最终会出现在vm上,直接读取使用即可。
    (2)如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。
  5. 简写形式
    1
    2
    3
    4
    5
    6
    computed:{
        fullName(){
        console.log('get被调用了')
        return this.firstName + '-' + this.lastName
        }
    }

      备注(使用场景):当不需要set()改变依赖数据时可以使用简写形式,调用方式不变。

二、监视属性(watch)

  1. 当被监视的属性变化时, 回调函数自动调用, 进行相关操作
  2. 监视的属性必须存在,才能进行监视!!
  3. 监视的两种写法:
    (1)new Vue时传入watch配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    使用:
    <h2>今天天气很{{info}}</h2>
     
    定义:
    watch:{
            isHot:{
            immediate:true, //初始化时让handler调用一下
            //handler什么时候调用?当isHot发生改变时,可以监控到变化以及变化前后的值
            handler(newValue,oldValue){
                console.log('isHot被修改了',newValue,oldValue)
            }
          }
    }
    (2)通过vm.$watch监视
    1
    2
    3
    4
    5
    6
    7
    8
    定义在vue外面的
    vm.$watch('isHot',{
        immediate:true, //初始化时让handler调用一下
        //handler什么时候调用?当isHot发生改变时。
        handler(newValue,oldValue){
            console.log('isHot被修改了',newValue,oldValue)
        }
    })
  4. 深度监视
    (1)Vue中的watch默认不监测对象内部值的改变(一层)。
    (2)配置deep:true可以监测对象内部值改变(多层)。
    1
    2
    3
    4
    5
    6
    numbers:{
        deep:true,
        handler(){
            console.log('numbers改变了')
        }
    } 
  5. 监视属性简写:
    (1)new Vue时传入watch配置简写:
    1
    2
    3
    isHot(newValue,oldValue){
        console.log('isHot被修改了',newValue,oldValue,this)
    }

      备注(使用场景):当不需要immediate和deep时可以使用

    (2)通过vm.$watch监视简写:
    1
    2
    3
    vm.$watch('isHot',(newValue,oldValue)=>{
        console.log('isHot被修改了',newValue,oldValue)
    })

      备注(使用场景):当不需要immediate和deep时可以使用

三、computed和watch之间的区别:

  1. computed能完成的功能,watch都可以完成。
  2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    watch:{
        firstName(val){
            setTimeout(()=>{       //为什么用箭头函数:如果不用箭头函数,this指向的将是window,因为setTimeout是window的方法;写成箭头函数,这样this的指向才是vm 或 组件实例对象。         console.log(this)
                this.fullName = val + '-' + this.lastName
            },1000);
        },
        lastName(val){
            this.fullName = this.firstName + '-' + val
        }
    }

      备注:

      (1)所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。

      (2)所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。

posted @   饭啊饭º  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示