当前位置:首页 > VUE

vue watch实现

2026-01-13 05:04:09VUE

使用 watch 监听数据变化

在 Vue 中,watch 用于监听数据的变化并执行相应的回调函数。通过 watch 可以监听响应式数据的变化,包括 datacomputedprops 中的数据。

export default {
  data() {
    return {
      message: 'Hello Vue',
      count: 0
    }
  },
  watch: {
    // 监听 message 的变化
    message(newVal, oldVal) {
      console.log('message changed:', oldVal, '->', newVal)
    },
    // 监听 count 的变化
    count(newVal, oldVal) {
      console.log('count changed:', oldVal, '->', newVal)
    }
  }
}

监听对象或数组的深层变化

默认情况下,watch 是浅层的,不会监听对象或数组内部属性的变化。如果需要监听深层变化,可以设置 deep: true

export default {
  data() {
    return {
      user: {
        name: 'Alice',
        age: 25
      }
    }
  },
  watch: {
    user: {
      handler(newVal, oldVal) {
        console.log('user changed:', oldVal, '->', newVal)
      },
      deep: true // 监听深层变化
    }
  }
}

立即触发监听回调

如果需要监听器在初始化时立即执行一次回调,可以设置 immediate: true

export default {
  data() {
    return {
      message: 'Hello Vue'
    }
  },
  watch: {
    message: {
      handler(newVal, oldVal) {
        console.log('message changed:', oldVal, '->', newVal)
      },
      immediate: true // 初始化时立即执行
    }
  }
}

监听动态属性

如果需要监听动态变化的属性(如 props 中的动态值),可以使用函数返回监听的目标。

vue watch实现

export default {
  props: ['userId'],
  watch: {
    // 监听 userId 的变化
    userId(newVal, oldVal) {
      console.log('userId changed:', oldVal, '->', newVal)
    }
  }
}

使用 $watch 动态监听

除了在 watch 选项中定义监听器,还可以通过 this.$watch 动态添加监听器,并可以手动取消监听。

export default {
  data() {
    return {
      message: 'Hello Vue'
    }
  },
  created() {
    // 动态添加监听器
    const unwatch = this.$watch('message', (newVal, oldVal) => {
      console.log('message changed:', oldVal, '->', newVal)
    })

    // 取消监听
    setTimeout(() => {
      unwatch()
    }, 5000)
  }
}

监听计算属性

watch 也可以监听 computed 计算属性的变化。

vue watch实现

export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName() {
      return `${this.firstName} ${this.lastName}`
    }
  },
  watch: {
    fullName(newVal, oldVal) {
      console.log('fullName changed:', oldVal, '->', newVal)
    }
  }
}

监听多个数据源

如果需要同时监听多个数据源的变化,可以使用数组形式传入多个监听目标。

export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  watch: {
    // 监听 firstName 和 lastName 的变化
    '[firstName, lastName]'(newVals, oldVals) {
      console.log('firstName or lastName changed:', oldVals, '->', newVals)
    }
  }
}

结合 watchmethods

可以在 watch 中调用 methods 中的方法,实现更复杂的逻辑。

export default {
  data() {
    return {
      searchQuery: ''
    }
  },
  methods: {
    fetchData(query) {
      console.log('Fetching data for:', query)
    }
  },
  watch: {
    searchQuery(newVal) {
      this.fetchData(newVal)
    }
  }
}

使用 watchEffect(Vue 3)

在 Vue 3 中,可以使用 watchEffect 自动追踪依赖并执行回调。

import { watchEffect, ref } from 'vue'

export default {
  setup() {
    const count = ref(0)

    watchEffect(() => {
      console.log('count changed:', count.value)
    })

    return { count }
  }
}

以上方法涵盖了 Vue 中 watch 的基本和高级用法,适用于不同场景下的数据监听需求。

标签: vuewatch
分享给朋友:

相关文章

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return {…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现画圆弧并着色

vue实现画圆弧并着色

在 Vue 中实现画圆弧并着色 使用 Canvas API 绘制圆弧 在 Vue 组件的 mounted 钩子中,通过 Canvas API 绘制圆弧。创建一个 canvas 元素并获取其上下文:…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue实现倒计时抢券

vue实现倒计时抢券

Vue 实现倒计时抢券功能 核心逻辑 倒计时抢券功能需要结合时间计算、状态管理和界面交互。通过 Vue 的响应式特性和生命周期钩子,可以高效实现这一需求。 实现步骤 1. 数据准备 在 Vue 组…

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件…