当前位置:首页 > VUE

vue实现监听

2026-01-13 01:03:16VUE

监听数据变化

在Vue中,可以使用watch选项或$watch方法来监听数据的变化。watch适用于监听单个数据属性,而$watch适用于动态监听或组件销毁时自动取消监听。

// 使用watch选项
export default {
  data() {
    return {
      message: 'Hello'
    }
  },
  watch: {
    message(newVal, oldVal) {
      console.log(`Message changed from ${oldVal} to ${newVal}`)
    }
  }
}
// 使用$watch方法
export default {
  data() {
    return {
      message: 'Hello'
    }
  },
  created() {
    this.$watch('message', (newVal, oldVal) => {
      console.log(`Message changed from ${oldVal} to ${newVal}`)
    })
  }
}

深度监听对象

默认情况下,watch只监听对象的引用变化。如果需要监听对象内部属性的变化,可以使用deep选项。

export default {
  data() {
    return {
      user: {
        name: 'John',
        age: 30
      }
    }
  },
  watch: {
    user: {
      handler(newVal, oldVal) {
        console.log('User changed')
      },
      deep: true
    }
  }
}

立即触发监听

有时需要在组件创建时立即执行监听函数,可以使用immediate选项。

export default {
  data() {
    return {
      count: 0
    }
  },
  watch: {
    count: {
      handler(newVal, oldVal) {
        console.log(`Count is ${newVal}`)
      },
      immediate: true
    }
  }
}

监听计算属性

计算属性本身是响应式的,可以直接在watch中监听。

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

监听路由变化

在Vue Router中,可以使用watch监听$route对象的变化。

export default {
  watch: {
    '$route'(to, from) {
      console.log(`Route changed from ${from.path} to ${to.path}`)
    }
  }
}

监听多个数据源

如果需要监听多个数据源,可以使用数组形式的watch键。

export default {
  data() {
    return {
      x: 0,
      y: 0
    }
  },
  watch: {
    ['x', 'y']([newX, newY], [oldX, oldY]) {
      console.log(`Position changed from (${oldX}, ${oldY}) to (${newX}, ${newY})`)
    }
  }
}

使用侦听器清理

在组件销毁时,手动创建的侦听器需要清理。使用$watch返回的函数可以取消侦听。

export default {
  data() {
    return {
      timer: null
    }
  },
  created() {
    const unwatch = this.$watch('timer', (newVal) => {
      console.log(`Timer updated: ${newVal}`)
    })
    // 在组件销毁时取消侦听
    this.$once('hook:beforeDestroy', unwatch)
  }
}

性能优化

对于频繁变化的数据,可以使用debouncethrottle来优化性能。

vue实现监听

import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: ''
    }
  },
  watch: {
    searchQuery: debounce(function(newVal) {
      console.log(`Searching for: ${newVal}`)
    }, 500)
  }
}

标签: vue
分享给朋友:

相关文章

vue实现ppt

vue实现ppt

Vue 实现 PPT 的功能 Vue 可以结合第三方库或自定义组件实现类似 PPT 的演示效果。以下是几种常见的方法: 使用第三方库 reveal.js reveal.js 是一个流行的演示框架,支…

vue 绑定实现

vue 绑定实现

Vue 绑定实现 Vue 提供了多种数据绑定的方式,包括文本插值、属性绑定、事件绑定、双向绑定等。以下是常见的绑定实现方法: 文本插值 使用双大括号 {{ }} 进行文本插值,将数据动态渲染到 DO…

vue实现增加

vue实现增加

实现 Vue 中的新增功能 在 Vue 中实现新增功能通常涉及数据绑定、表单处理和状态管理。以下是几种常见的实现方式: 数据绑定与列表渲染 通过 v-model 绑定表单输入,使用数组的 push…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…

vue实现 treegrid

vue实现 treegrid

Vue 实现 TreeGrid 的方法 使用现成组件库 Element UI、Ant Design Vue 等流行组件库提供了现成的 TreeTable/TreeGrid 组件,可直接使用。 Ele…

vue实现模糊

vue实现模糊

Vue实现模糊搜索的方法 在Vue中实现模糊搜索功能通常需要结合输入框和列表渲染,通过监听输入内容动态过滤数据。以下是几种常见实现方式: 使用计算属性实现 计算属性适合处理需要响应式更新的搜索逻辑:…