Vue中的监视属性

1.一个天气案例

有一个坑:

当页面中并没有用到info这个属性的时候,开发者工具不会更新变换之后的数据

<body>

  <!-- 准备一个容器 -->

    <div id="root"><!-- <h2>今天天气很{{info}}</h2> --><h2>今天天气很一般</h2><button @click="changeWeather">切换天气</button>

  </div>

</body>

<script type="text/javascript">

  Vue.config.productionTip = false //阻止vue在启动时生成生产提示

  new Vue({

​    el: '#root',

​    data: {
​      isHot: true},
​    computed: {info() {return this.isHot ? '炎热' : '凉爽'}},
​    methods: {changeWeather() {this.isHot = !this.isHot
​      }}

  })

</script>

image-20211223210605164

image-20211223210656454

一种简写:

在@click后面能够写一些简单的语句,就比如把上面的methods中的changeWeather方法中的语句直接写在@click后面。但是这种情况适用于@click后面放一句语句,但凡后面需要做两件事,这样直接写在@click后就不太合适了

<button @click="isHot=!isHot">切换天气</button>

2.监视属性

监视属性watch:

​ 1.当被监视属性变化时,回调函数(handler)自动调用,进行相关操作

​ 2.监视的属性必须存在,才能进行监视

​ 3.监视的两种写法:

​ (1)new Vue时传入watch配置

​ (2)通过vm.$watch监视

第一种:在创建的Vue实例中写如下语句(如果很明确要监视谁,可选择第一种方法)

watch: {

​      isHot: {

​        immediate: true,  //初始化时让handler调用一下// 这里的handler什么时候被调用?当isHot发生改变时候handler(newValue, oldValue) {

​          console.log('isHot被调用了', newValue, oldValue);}}}

第二种:首先保证vue实例创建完成,然后 在先写监视的对象,然后再写一个配置对象(如果创建实例的时候不知道要监视谁,后续根据用户的一些行为知道需要监视,可以调用这个API)

const vm = new Vue({....}) 
vm.$watch('isHot', {

​    immediate: true,  //初始化时让handler调用一下// 这里的handler什么时候被调用?当isHot发生改变时候handler(newValue, oldValue) {

​      console.log('isHot被调用了', newValue, oldValue);}

  }
  )

3.深度监视

​ (1)Vue中的watch默认不监测对象内部值的变化(一层)

​ (2)配置deep:true可以监测对象内部值的改变(多层)

​ 备注:

​ (1)Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以

​ (2)使用watch时根据数据的具体结构,决定是否采用深度监视

 data: {
            isHot: true,  //其实isHot是简写写法,原始的写法是'isHot'
            numbers: {
                a: 1,
                b: 1
            }
        },

//我要监测a的值的变化,这种形式就是监视多级结构中某个属性的变化'numbers.a': {handler() {
​           console.log('a被改变了');}}//如果想要监视多级结构中所有属性的变化,并且是深入到numbers中的属性的变化,借用一个配置项deep,加上这个选项之后,不管里面的哪一个属性变化都算numbers变化了

​      numbers: {

​        deep: true,   //默认的是falsehandler() {

​          console.log('a被改变了');}}

4.监视属性的简写形式

简写的前提是:不需要immediate、deep,也就是配置项中**只有handler()**时候,可以开启简写形式

备注:所有Vue管理的函数要写成普通函数,不要写成箭头函数

第一种监视方式:new Vue时传入watch配置

直接以监测的对象为函数名,监测对象名(){},这里的这个函数就相当于handler()来用,handler中写啥就在这里写啥

      isHot(newValue, oldValue) {

​          console.log('isHot被调用了', newValue, oldValue);

​        } 

第二种监视方式:通过vm.$watch监视

括号中写(监测的对象,函数),这个函数中的内容,就相当于原来handler()

  vm.$watch('isHot', function (newValue, oldValue) {

​    console.log('isHot被调用了', newValue, oldValue);

  })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值