首页 > 其他分享 >[Vue] Object.defineProperty 什么情况监听不到?和 Proxy 响应式原理又何区别?

[Vue] Object.defineProperty 什么情况监听不到?和 Proxy 响应式原理又何区别?

时间:2024-09-13 16:36:17浏览次数:1  
标签:Vue name Object value 又何 key target property 属性

前言

Vue 2.x 采用的是 Object.defineProperty 来实现响应式系统,它只能监听已经存在的属性,无法监听对象属性的新增或删除。

Vue 3 使用 Proxy 拦截对对象和数组的访问和修改,实现了响应式系统。它通过拦截这些操作,追踪哪些数据被访问、修改,从而在数据变化时通知相关的依赖。

Object.defineProperty

<template>
  <div class="hello">
    {{ user }}
    <button @click="changeVal">Change name</button>
    <button @click="addVal">Add new Val</button>
  </div>
</template>

<script>
export default {
  name: "HelloWorld",
  data() {
    return {
      user: {
        name: "Alice"
      }
    };
  },
  methods: {
    changeVal() {
      this.user.name = "Bob";
    },
    addVal() {
      this.user.age = 25; // 视图不会更新
    }
  }
};
</script>

<style scoped></style>

通过 this.$set 新增属性:

this.$set(this.user, "age", 25);

Object.defineProperty 对数组的监听能力有限,push、pop、shift、unshift、splice、sort 和 reverse 数组操作 Vue 可以监听到,而其他的则不行,比如直接修改数组的某个索引值:

this.arrNums[1] = 10;  // 不能监听,视图不会更新

Proxy

reactive 是通过 Proxy 实现的。通过 Proxy 来拦截对象的访问和修改操作,实现对数据的追踪和更新。

const handler = {
  // 拦截属性的读取操作
  get(target, key) {
    console.log(`Getting property ${key}: ${target[key]}`);
    return target[key];
  },

  // 拦截属性的设置操作(包括新增属性)
  set(target, key, value) {
    if (!target.hasOwnProperty(key)) {
      console.log(`Adding new property ${key} with value ${value}`);
    } else {
      console.log(`Updating property ${key} to ${value}`);
    }
    target[key] = value;
    return true;  // 必须返回 true,表示成功
  },

  // 拦截属性的删除操作
  deleteProperty(target, key) {
    console.log(`Deleting property ${key}`);
    delete target[key];
    return true;  // 必须返回 true,表示成功
  }
};

// 创建一个代理对象
const person = new Proxy({}, handler);

// 新增属性
person.name = 'Alice';  // 控制台输出: Adding new property name with value Alice
person.age = 25;        // 控制台输出: Adding new property age with value 25

// 修改现有属性
person.name = 'Bob';    // 控制台输出: Updating property name to Bob

// 读取属性
console.log(person.name);  // 控制台输出: Getting property name: Bob
                           // 输出: Bob

// 删除属性
delete person.age;         // 控制台输出: Deleting property age

当属性在对象中不存在时,通过 set 方法新增该属性。

当属性已经存在,再次通过 set 修改时,拦截器会识别为更新操作。

标签:Vue,name,Object,value,又何,key,target,property,属性
From: https://www.cnblogs.com/Himmelbleu/p/18412424

相关文章

  • vue3 el-message组件封装
    背景在封装请求拦截器时,使用ElMessage进行弹窗提示成功或失败,但是如果页面用到多个接口,这时就会导致页面出现很多弹窗,导致用户体验不好,有可能出现卡顿现象。这时就需要进行一些判断,如果前面的ElMessage还没关闭并且类型是一致的就return,不再弹窗提示,类型不一致时就要弹窗提示......
  • 基于Node.js+vue职位智能匹配系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网应用的普及,人才招聘市场迎来了前所未有的变革。传统的人才招聘方式往往效率低下,信息不对称,导致求职者难以快速找到合适的工......
  • 基于Node.js+vue基于Springbootvue的教学辅助系统设计与实现(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在教育领域,随着信息技术的飞速发展,传统教学模式正逐步向数字化、智能化转型。传统的教学辅助工具已难以满足现代教育的需求,尤其是在提升教学效率、增强师生......
  • 基于Node.js+vue在线拍卖系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和电子商务的普及,在线拍卖作为一种高效、便捷的交易方式,逐渐成为消费者和商家青睐的交易平台。传统拍卖受限于地域、时间等因素,难......
  • 基于Node.js+vue基于JS的租房网站(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人口流动的日益频繁,租房需求持续增长,成为现代都市生活中不可或缺的一部分。然而,传统的租房方式往往依赖于中介或线下看房,不仅效率低......
  • 标准的vue3 elementplus格式,不用export default
    <template><div><!--查询表单--><el-form:inline="true":model="filters"class="demo-form-inline"><el-form-itemlabel="产品料号"><el-inputv-model="filters.......
  • vue2 webpack打包配置
    序言最近在优化之前做的项目,看到打包后的文件夹,出现很多不需要的文件,想着应该是打包出现了问题,之前没时间优化,现在来看看优化项吧。RemovedPluginError:webpack.optimize.CommonsChunkPluginhasbeenremoved,pleaseuseconfig.optimization.splitChunksinstead以......
  • java+vue计算机毕设城市共享汽车资源管理App【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和居民出行需求的日益增长,城市交通拥堵、环境污染等问题日益凸显。共享经济的兴起为解决这些问题提供了新思路,其中城市共享汽车......
  • java+vue计算机毕设出租车管理系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,出租车作为城市公共交通体系的重要组成部分,其运营效率与服务质量直接关系到市民的日常出行体验及城市形象。然而,传统出租车管理......
  • java+vue计算机毕设大学生互联网项目管理信息系统【源码+开题+论文+程序】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,大学生参与科研项目与创新创业活动的热情日益高涨。然而,传统的项目管理方式往往依赖于纸质文档和人工协调,不仅效率低下,还容......