当前位置:首页 > VUE

vue如何实现数据监听

2026-02-21 08:15:24VUE

Vue 数据监听的实现方式

Vue 主要通过数据劫持和发布-订阅模式实现数据监听,核心是 Object.defineProperty(Vue 2)或 Proxy(Vue 3)。以下是具体实现方法:

使用 Object.defineProperty(Vue 2)

通过劫持对象的属性访问和修改,触发依赖收集和更新通知。

// 简易实现
function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖收集器

  Object.defineProperty(obj, key, {
    get() {
      dep.depend(); // 收集依赖
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 通知更新
    }
  });
}
  • 依赖收集:在 getter 中通过 Dep 类收集当前属性的依赖(如 Watcher)。
  • 触发更新:在 setter 中通过 Dep.notify() 通知所有依赖执行更新。

使用 Proxy(Vue 3)

Proxy 可以监听整个对象,无需递归遍历属性,性能更好。

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      track(target, key); // 收集依赖
      return Reflect.get(target, key, receiver);
    },
    set(target, key, value, receiver) {
      Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return true;
    }
  });
}
  • 优势:支持监听动态新增属性、数组索引修改等场景。

监听数组变化

Vue 2 通过重写数组方法(如 pushpop)实现监听:

const arrayProto = Array.prototype;
const arrayMethods = Object.create(arrayProto);

['push', 'pop', 'shift'].forEach(method => {
  const original = arrayProto[method];
  arrayMethods[method] = function(...args) {
    const result = original.apply(this, args);
    dep.notify(); // 触发更新
    return result;
  };
});

手动监听:$watch API

Vue 提供 $watch 方法手动监听数据变化:

vue如何实现数据监听

export default {
  data() {
    return { count: 0 };
  },
  created() {
    this.$watch('count', (newVal, oldVal) => {
      console.log(`count变化:${oldVal} -> ${newVal}`);
    });
  }
};
  • 深度监听:通过 { deep: true } 监听嵌套对象。

注意事项

  1. 性能开销:频繁监听大型对象可能影响性能,建议拆分数据。
  2. 异步更新:Vue 的更新是异步的,多次修改会合并为一次渲染。
  3. 避免循环引用:监听循环引用对象可能导致栈溢出。

分享给朋友:

相关文章

vue如何实现原理

vue如何实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现原理基于响应式系统、虚拟 DOM 和组件化设计。以下是关键机制的详细解析: 响应式系统 Vue 通过 Object.defineProperty(…

react如何设置数据

react如何设置数据

设置数据的常见方法 在React中设置数据通常涉及组件的状态管理,可以通过以下几种方式实现: 使用useState Hook(函数组件) import React, { useState…

vue 实现数据分页

vue 实现数据分页

实现数据分页的基本思路 在Vue中实现数据分页通常需要结合前端分页逻辑和后端API支持。前端分页适合数据量较小的情况,后端分页适合大数据量场景。 前端分页实现 创建一个计算属性来分割当前页数据:…

vue实现数据绑定

vue实现数据绑定

Vue 数据绑定的实现方式 Vue.js 提供了多种数据绑定方式,主要包括双向绑定 (v-model)、单向绑定 ({{ }} 插值或 v-bind)、以及响应式数据管理。以下是具体实现方法: 双向…

如何实现vue验证

如何实现vue验证

Vue 表单验证的实现方法 Vue 表单验证可以通过多种方式实现,包括内置指令、第三方库和自定义验证逻辑。以下是几种常见的方法: 使用 Vue 内置指令进行基础验证 Vue 提供了 v-model…

react如何实现菜单

react如何实现菜单

使用 React 实现菜单的方法 使用状态管理控制菜单显示/隐藏 通过 useState 管理菜单的展开和收起状态,结合点击事件切换状态。 import { useState } from 'rea…