当前位置:首页 > 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实现前端分离

vue实现前端分离

Vue 实现前后端分离 前后端分离是一种架构模式,前端负责页面渲染和交互逻辑,后端提供数据接口。Vue.js 作为前端框架,非常适合实现前后端分离的开发模式。 核心实现步骤 创建 Vue 项目 使用…

vue卖座网实现

vue卖座网实现

Vue 卖座网实现 项目结构搭建 使用 Vue CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

拖拽式编程vue实现

拖拽式编程vue实现

拖拽式编程在 Vue 中的实现方法 使用 HTML5 原生拖放 API Vue 可以结合 HTML5 的拖放 API 实现基础拖拽功能。通过 draggable 属性标记可拖拽元素,监听 dragst…

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现微博发布动态

vue实现微博发布动态

使用Vue实现微博发布动态功能 创建Vue组件结构 新建一个WeiboPost.vue组件,包含文本框、图片上传和发布按钮: <template> <div class="we…

vue实现一个tab栏

vue实现一个tab栏

Vue 实现 Tab 栏 基础实现(选项式 API) <template> <div class="tab-container"> <div class="t…