vue中的watch可以监听哪些值?

vue中的watch监听,除了监听data中的数据

还可以监听props、$route、$emit、computed

watch:{//监听路由变化

$route( to , from ){

console.log( to , from )

// to , from 分别表示从哪跳转到哪,都是一个对象

// to.path ( 表示的是要跳转到的路由的地址 eg: /home );

}

}

export default {
        data() {
            return {
                floorData0: {},
                floorData1: {},
                floorData2: {},
            }
        },
        props:['floorData'],
        watch:{  // 监听props
        floorData:(newVal,oldVal) => {
                console.log(newVal);
                this.floorData0 = newVal[0];
                this.floorData1 = newVal[1];
                this.floorData2 = newVal[2];
            }
 } }

vue中的watch监听数据变化以及watch中各属性详解:

1、监听data数据变化

watch: {

  data(val, newval) {

    console.log(val)

    console.log(newval)

  }

}

2、通过watch监听docData数据的变化,数据发生变化时,this.change_number++(使用深度监听)

watch: {

  docData: {

    handler(newVal) {

      this.change_number++

    },

    deep: true

  }

}

3、通过watch监听data数据的变化,数据发生变化时,执行changeData方法

watch: {

  data: 'changeData' // 值可以为methods的方法名

},

methods: {

  changeData(curVal,oldVal){

    conosle.log(curVal,oldVal)

  }

}

延伸:

详解watch中的immediate、handler和deep属性

(1)immediate和handler

这样使用watch时有一个特点,就是当值第一次绑定时,

不会执行监听函数,

只有值发生改变时才会执行。如果我们需要在最初绑定值的时候也执行函数,

则就需要用到immediate属性。

watch: {

  docData: {

    handler(newVal) {

      this.change_number++

    },

    immediate: true

  }

}

(2)deep

当需要监听一个对象的改变时,

普通的watch方法无法监听到对象内部属性的改变,

此时就需要deep属性对对象进行深度监听。

data() {

  return {

    docData: {

      'doc_id': 1,

      'tpl_data': 'abc'

    }

  }

},

watch: {

  docData: {

    handler(newVal) {

      this.change_number++

    },

    deep: true

  }

}

设置deep:true则可以监听到docData.doc_id的变化,

此时会给docData的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。

如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:

data() {

  return {

    docData: {

      'doc_id': 1,

      'tpl_data': 'abc'

    }

  }

},

watch: {

    'docData.doc_id': {

      handler(newVal, oldVal) {

      ......

      },

    deep: true

  }

}