当前位置:首页 > 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来优化性能。

import { debounce } from 'lodash'

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

vue实现监听

标签: vue
分享给朋友:

相关文章

vue实现网页切换

vue实现网页切换

Vue 实现网页切换的方法 在 Vue 中实现网页切换通常可以通过以下几种方式完成,具体取决于项目需求和路由管理方式。 使用 Vue Router Vue Router 是 Vue.js 官方提供的…

vue实现选择季度

vue实现选择季度

Vue 实现选择季度的几种方法 使用下拉选择框(Select) 在 Vue 中可以通过 v-model 绑定一个下拉选择框来实现季度选择。数据可以预先定义为一个包含季度选项的数组。 <…

课程表vue实现

课程表vue实现

实现课程表的Vue组件 创建课程表需要设计数据结构、布局和交互逻辑。以下是一个基于Vue 3的实现方案: 数据结构设计 const timetableData = ref([ { ti…

vue前端实现打印功能

vue前端实现打印功能

使用Vue实现前端打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 使用window.print()方法 这是最简单的打印方式,直接调用浏览器的打印功能。 me…

vue实现多选题

vue实现多选题

Vue实现多选题的方法 使用Vue实现多选题功能,可以通过v-model绑定数组、动态渲染选项、以及处理选中状态来实现。以下是一个完整的实现示例: 基础实现代码 <template>…

vue实现双折线图

vue实现双折线图

实现双折线图的步骤 安装必要的依赖库(如 ECharts 或 Chart.js),这里以 ECharts 为例: npm install echarts --save 在 Vue 组件中引入 ECh…