当前位置: 首页 > news >正文

Vue2和Vue3响应式的基本实现

目录

  • 简介
  • Vue2 响应式
    • Vue2 响应式的局限性
  • Vue3 响应式
    • Vue3 响应式的优点
  • Vue2 和 Vue3 响应式对比

简介

在 Vue 框架中,数据的响应式是其核心特性之一。当页面数据发生变化时,我们希望界面能自动更新,而不是手动操作 DOM。这就需要对数据进行监听,并在数据变更时触发 UI 重新渲染。
Vue2 和 Vue3 在实现响应式的方式上有所不同,Vue2 主要依赖 Object.defineProperty,而 Vue3 则引入了 Proxy,大大优化了响应式系统的性能和灵活性。它们都是通过函数来封装响应式对象,方便读取或更新数据时能够进行其他的操作。

Vue2 响应式

Vue2 使用 Object.defineProperty 来拦截对象属性的访问和修改,从而实现响应式。

const obj = {
  a: 1,
  b: 2,
  c: {
    x: 66,
    y: 2,
  }
}

function isObject(v) {
  return typeof v === 'object' && v !== null;
}

function observe(obj) {
  for (const k in obj) {
    let v = obj[k];
    if (isObject(v)) observe(v); // 递归遍历
    Object.defineProperty(obj, k, {
      get() {
        console.log(`读取${k}, 值${v}`);
        return v;
      },
      set(newVal) {
        v = newVal;
        console.log(`更新${k}, 值${v}`);
      }
    });
  }
}

observe(obj);

obj.a;
obj.a = 101;
obj.c.x;
obj.c.x = 166;

在这里插入图片描述

Vue2 响应式的局限性

  • 需要遍历对象的每个属性,性能较低。
  • 不能检测到新增或删除的属性。
  • 需要手动调用 Vue.set() 以确保新属性的响应式。

Vue3 响应式

Vue3 使用 Proxy 实现响应式,可以直接监听整个对象,而不是逐个属性。

const obj = {
    a: 1,
    b: 2,
    c: {
        x: 1,
        y: 2,
    }
};

function isObject(v) {
    return typeof v === 'object' && v !== null;
}

function reactive(target) {
    return new Proxy(target, {
        get(target, k) {
            console.log(`读取: ${k}, 值: ${target[k]}`);
            // 读取时才递归生成代理
            if (isObject(target[k])) return reactive(target[k]);
            return target[k];
        },
        set(target, k, newVal) {
            if (newVal === target[k]) return;
            console.log(`更新: ${k}, 值${newVal}`);
            target[k] = newVal;
            return true;
        }
    });
}

const proxy = reactive(obj);

proxy.a;
proxy.a = 100;
proxy.c.x;

在这里插入图片描述

Vue3 响应式的优点

  • 直接监听整个对象,无需遍历所有属性。
  • 可以检测到属性的新增和删除。
  • 具有更好的性能和更简洁的代码结构。

Vue2 和 Vue3 响应式对比

对比项Vue2 (Object.defineProperty)Vue3 (Proxy)
监听方式逐个属性拦截整个对象拦截
深度监听需要递归处理访问时自动代理
属性新增删除需要 Vue.set() 处理可直接监听
数组监听需要重写数组方法原生支持
性能需要遍历所有属性,较低直接代理整个对象,更高
兼容性兼容性好,支持 ES5 及以上需要 ES6 Proxy 支持

Vue3 通过 Proxy 解决了 Vue2 的许多缺陷,使得响应式系统更加高效、灵活和简洁。因此,Vue3 的响应式能力远超 Vue2。


相关文章:

  • vue:突然发现onok无法使用
  • 庙算兵棋推演AI开发初探(空想篇-RLHF尝试)
  • leetcode148.排序链表
  • NestJS——创建项目、编写User模块
  • 谷歌浏览器安装Vue开发者工具指南
  • 网络安全中的“后门”:概念、类型、作用与攻防技术
  • 横扫SQL面试——用户留存率问题
  • 【信奥一本通提高篇】基础算法之贪心算法
  • 程序自动化填写网页表单数据
  • 文件分片上传
  • 【Linux】ELF、BIN、PBP、MAP文件查看
  • 基于SpringBoot的失物招领平台(源码+数据库)
  • 基于python大数据的商品数据可视化分析系统
  • 网红酒店|基于java+vue的网红酒店预定系统(源码+数据库+文档)
  • SpringCloud-Nacos
  • 【Sa-Token】学习笔记 01 - SaToken介绍快速上手
  • C语言水仙花续集2
  • 打车APP订单系统逻辑梳理与实现
  • Spring IOC实战:解密Bean的九种诞生方式
  • 消息队列篇--通信协议篇--理解HTTP、TLS和TCP如何协同工作
  • 漳州网站建设 林/能打开各种网站的浏览器下载
  • vps网站打开速度调节/淘宝seo是什么意思
  • 网站建设与开发/网页设计与制作教程
  • 北京网站建设方案案例/无锡百度竞价公司
  • 郴州市住房建设局门户网站/网站排名软件有哪些
  • 大连哪个公司做网站开发的/ui培训