当前位置:首页 > 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 中数组和对象的部分限制。

vue实现响应式

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 无此限制。

    vue实现响应式

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

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

响应式工具函数

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

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

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

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

标签: vue
分享给朋友:

相关文章

vue实现slider

vue实现slider

Vue 实现 Slider 组件 使用 Vue 实现 Slider 组件可以通过原生开发或借助第三方库。以下是两种常见方法: 原生实现 Slider 创建一个基础的 Slider 组件,通过 v-m…

vue el 实现

vue el 实现

Vue 中使用 Element UI (el) 的实现方法 Element UI 是一个基于 Vue 的组件库,提供丰富的 UI 组件,常用于快速构建企业级中后台产品。以下介绍 Vue 项目中集成和使…

vue实现波形

vue实现波形

实现波形效果的方法 在Vue中实现波形效果可以通过多种方式完成,常见的方法包括使用Canvas绘制、CSS动画或第三方库。以下是几种实现方案: 使用Canvas绘制波形 通过Canvas API动态…

vue实现上传

vue实现上传

Vue 文件上传实现方法 使用 Vue 实现文件上传可以通过原生 HTML5 的 <input type="file"> 元素结合 Vue 的事件处理和数据绑定来实现。 基础实现步骤…

vue 实现流程

vue 实现流程

Vue 实现流程 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 实现的基本流程: 安装 Vue.js 通过 CDN 引入或使用 npm/yarn 安装:…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…