Vue2 Watch监听

在Vue2中,我们可以使用watch来监听一个数据的变化,并且在数据变化时执行一些操作。这个特性是Vue2非常强大的一个功能,可以帮助我们监控一个或多个数据的变化,然后做出相应的反应。

watch语法

要使用watch,我们需要在Vue组件的选项中声明一个watch对象,如下:

复制代码
export default {
  data() {
    return {
      count: 0
    }
  },
  watch: {
    count(newCount, oldCount) {
      console.log(`count变成了${newCount},之前是${oldCount}`)
    }
  }
}

watch对象的每个属性都是一个键值对,其中键表示要监听的数据的名称,而值则是一个函数。这个函数的参数包含两个值:新值和旧值,在数据发生变化时被触发。

实时响应

watch监听器能够很好地与Vue的响应式系统融合,使得我们在数据发生变化时可以及时地进行响应。例如,当用户输入一些文本时,我们可以通过watch来监听输入框的value,然后在用户输入时实时更新一些状态:

复制代码
<input v-model="inputValue" />
export default {
  data() {
    return {
      inputValue: ''
    }
  },
  watch: {
    inputValue(newValue, oldValue) {
      console.log(`输入框的值从${oldValue}变为了${newValue}`)
    }
  }
}

深度监听

在Vue2中,我们可以通过prop对象中的deep属性来进行深度监听。这个属性默认为false,表示不进行深度监听。如果我们需要监听对象或数组中的变化,那么就需要将这个属性设置为true。

示例:

复制代码
export default {
  props: {
    obj: {
      type: Object,
      default: () => ({})
    }
  },
  watch: {
    obj: {
      deep: true,
      handler(newObj, oldObj) {
        console.log('obj发生了变化')
      }
    }
  }
}

取消watch监听

在开发过程中,有时我们需要取消watch监听器。我们可以使用$watch方法来手动添加watch监听器,并且可以从组件实例中移除它。这个方法的第一个参数是要监听的数据的名称,而第二个参数则表示要执行的回调函数。

示例:

复制代码
export default {
  data() {
    return {
      count: 0
    }
  },
  created() {
    this.stopWatch = this.$watch('count', (newCount, oldCount) => {
      console.log(`count变成了${newCount},之前是${oldCount}`)
    })
  },
  methods: {
    stopWatching() {
      this.stopWatch()
    }
  }
}

在上面的示例中,我们在组件创建时通过$watch方法添加了一个watch监听器,并将它保存到了stopWatch变量中。当我们需要取消这个监听器时,我们只需要调用这个变量即可。

总结

通过watch监听器,我们可以实时监控数据的变化,并且在数据发生改变时进行相应的操作。我们还可以使用$watch方法手动添加监听器,以及从组件实例中移除它。这是Vue2非常强大的一个功能,可以帮助我们更好地管理和维护数据。