当前位置:首页 > VUE

vue实现响应式

2026-01-18 14:55:13VUE

Vue 响应式原理

Vue 的响应式系统基于 JavaScript 的 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现,通过数据劫持和依赖追踪实现数据变化时的自动更新。

Vue 2 实现方式

Vue 2 使用 Object.defineProperty 对对象的属性进行劫持。当访问属性时收集依赖,修改属性时触发更新。

function defineReactive(obj, key, val) {
  const dep = new Dep(); // 依赖管理

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) {
        dep.addSub(Dep.target); // 收集依赖
      }
      return val;
    },
    set(newVal) {
      if (newVal === val) return;
      val = newVal;
      dep.notify(); // 触发更新
    }
  });
}

Vue 3 实现方式

Vue 3 使用 Proxy 代理整个对象,可以监听动态添加的属性,并解决 Vue 2 中数组和对象的部分限制。

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) {
      const result = Reflect.set(target, key, value, receiver);
      trigger(target, key); // 触发更新
      return result;
    }
  });
}

响应式数据声明

在 Vue 组件中,可以通过以下方式声明响应式数据:

选项式 API

export default {
  data() {
    return {
      message: 'Hello Vue!'
    };
  }
};

组合式 API

import { ref, reactive } from 'vue';

export default {
  setup() {
    const count = ref(0); // 基本类型
    const state = reactive({ // 对象类型
      name: 'Vue 3'
    });

    return { count, state };
  }
};

响应式注意事项

  1. 对象属性添加:Vue 2 中直接添加新属性不会触发响应,需使用 Vue.set()this.$set()。Vue 3 的 Proxy 无此限制。

  2. 数组变更检测:Vue 2 中直接通过索引修改数组或修改长度不会触发响应,需使用变异方法(如 push, pop)或 Vue.set()

  3. 性能优化:大型响应式对象可能影响性能,可通过 Object.freeze() 冻结不需要响应式的数据。

响应式工具函数

Vue 提供了一些响应式相关的工具函数:

vue实现响应式

import { 
  isRef,
  unref,
  toRef,
  toRefs,
  markRaw,
  shallowRef,
  shallowReactive
} from 'vue';

// 创建非响应式引用
const nonReactive = markRaw({ key: 'value' });

// 浅层响应式
const shallow = shallowReactive({ nested: { data: 'value' } });

标签: vue
分享给朋友:

相关文章

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现计算

vue实现计算

Vue 实现计算的方法 在 Vue 中实现计算功能可以通过多种方式完成,主要包括计算属性(computed)、方法(methods)和侦听器(watch)。以下是具体的实现方法: 计算属性(Comp…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ dat…