Vue监听属性watch

Vue.js监听属性

我们可以通过watch来响应数据的变化

例子:

千米和米之间的相互换算

千米:<input v-model="kilometers"> 米:<input v-model="meters">
  watch: {

    kilometers:function (val) {
      this.meters = val * 1000
    },
    meters: function (val) {
      this.kilometers = val / 1000
    }

  }

 

Vue2中,watch属性用于监视数据的变化,当被监视的属性变化时,回调函数会自动调用以进行相关操作。使用watch属性需要注意,被监视的属性必须存在于`data`或`computed`中 [^2]。 ### 基本使用 可以监视`data`中的值,通过`watch`属性定义对某个属性的监视。当属性值发生改变时,`handler`函数会被调用,在这个函数里可以观察到旧值和新值的变化。还可以设置`immediate`为`true`,让`handler`在初始化时就调用一次。示例代码如下: ```vue <template> <span>{{isHot ? '炎热':'寒冷'}}</span> <button @click="onClick">切换天气</button> </template> <script> export default { data: { isHot: true }, methods: { onClick() { this.isHot = !this.isHot; } }, watch: { isHot: { immediate: true, handler(newValue, oldValue) { console.log('被调用了', newValue, oldValue); } } } }; </script> ``` ### 监听对象属性 #### 监听对象部分属性 可以直接监听对象中的某个属性,示例如下: ```javascript new Vue({ el: '#app', data: { user: { firstName: 'John', lastName: 'Doe' } }, watch: { 'user.firstName': { handler: function(newVal, oldVal) { console.log('First name changed:', newVal); } } } }); ``` #### 监听整个对象 Vue中的`watch`默认不监测对象内部值的改变(一层),配置`deep: true`可以监测对象内部值的改变(多层)。示例如下: ```vue <div id="app"> <div> <label for="a">A:</label> <input v-model="myObject.a" id="a"> </div> <div> <label for="b">B:</label> <input v-model="myObject.b" id="b"> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2"></script> <script> new Vue({ el: '#app', data: { myObject: { a: 1, b: 2 } }, watch: { 'myObject.a': function(newVal, oldVal) { console.log('myObject.a changed:', newVal, oldVal); }, 'myObject.b': function(newVal, oldVal) { console.log('myObject.b changed:', newVal, oldVal); }, myObject: { handler(newVal, oldVal) { console.log('myObject changed:', newVal, oldVal); }, deep: true } } }); </script> ``` ### 其他配置项 - **`handler`**:其值是一个回调函数,即监听到变化时应该执行的函数 [^5]。 - **`deep`**:其值是`true`或`false`,确认是否深入监听。一般监听时不能监听到对象属性值的变化,设置为`true`可监听对象属性的改变(深度监听) [^5]。 - **`immediate`**:其值是`true`或`false`,确认是否以当前的初始值执行`handler`函数。若为`true`,该回调将会在侦听开始之后被立即调用 [^5]。 示例代码如下: ```javascript var vm = new Vue({ data: { a: 1, b: 2, c: 3, d: 4, e: { f: { g: 5 } } }, watch: { a: function (val, oldVal) { console.log('new: %s, old: %s', val, oldVal); }, b: 'someMethod', c: { handler: function (val, oldVal) { /* ... */ }, deep: true }, d: { handler: function (val, oldVal) { /* ... */ }, immediate: true }, e: [ function handle1 (val, oldVal) { /* ... */ }, function handle2 (val, oldVal) { /* ... */ } ], 'e.f': function (val, oldVal) { /* ... */ } } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值