热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue3简易实现proxy代理实例详解

这篇文章主要为大家详细介绍了Python实现学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,

vue3 简易实现proxy代理

1.基础数据

const state = reactive({ name: "cld", age: 26, like: "paint" });
console.log("获取更改age前的值", state.age);
state.age = 28;
console.log("获取更改age后的值", state.age);

核心逻辑 reactive

export function reactive (target) {
  // 创建一个响应式对象 对象 set map array object ...
  return createReactiveObject(target, {
    // proxy + reflect
    get (target, key, receiver) {
      // 可能无法访问key target[key]是否成功不会报错 所以使用reflect
      const res = Reflect.get(target, key, receiver); // == target[key];
      console.log("用户取值", target, key);
      return res;
    },
    set (target, key, value, receiver) {
      const res = Reflect.set(target, key, value, receiver);
      console.log("用户设置值", target, key);// == target[key]=value;
      return res;
    }
  });
}
const isObject = (obj) => { return typeof obj == "object" && obj != null; };
function createReactiveObject (target, baseHandler) {
// 如果不是对象 不需要代理
  if (!isObject(target)) {
    return target;
  }
  // target目标对象 baseHandler get/set 值处理方法,
  const observed = new Proxy(target, baseHandler);
  return observed;
}
/** Reflect 作用
 * 可能无法访问key target[key]是否成功不会报错 
 * 所以使用reflect
 * Reflect.get 返回值   Reflect.set 返回值boolean
 **/
const res = Reflect.get(target, key, receiver);  
// Reflect.get(target, key, receiver);  等价于 target[key] 并返回值
const res = Reflect.set(target, key, value, receiver);  
// res  值为true/false 表示是否成功设置值

代理实现效果

运行结果

vue3取值的时候才走代理操作,不取值的时候,不需要深度遍历代理,
vue2一开始就深度递归

当数据里为数组或对象的情况下,需要递归代理

get (target, key, receiver) {// proxy+reflect
    const res = Reflect.get(target, key, receiver);// == target[key];
    if (isObject(res)) {
      return reactive(res);
    }
    return res;
  };

修改值的时候,具体是新增操作还是修改操作 可以定位

set (target, key, value, receiver) {
    const hasKey = hasOwn(target, key);
    const oldValue = target[key]; // Reflect.set 操作前还是历史数据
    const res = Reflect.set(target, key, value, receiver); 
    if (!hasKey) {
      // 新增属性
      console.log("用户新增值", target, key);
    } else if (value !== oldValue) {
      //修改操作
      console.log("用户修改值", target, key);
    }
    return res;
  };

push数据的时候,会先取arr的push属性,然后取array的length属性

在这里插入图片描述

设置值的时候 key是index索引,在该索引上增加值

在这里插入图片描述

其实在该索引上增加值之后,还会再次触发set 应该数组的长度改变了

为了减少多余的无必要的操作,可以通过判断不执行任何操作

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程笔记的更多内容!    


推荐阅读
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Python编程中条件控制下的循环终止机制详解 ... [详细]
  • 利用PHP循环高效处理多条帖子表单数据 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • Python 开发指南:深入理解高级变量类型与函数进阶应用
    Python 开发指南:深入理解高级变量类型与函数进阶应用 ... [详细]
  • 本文详细探讨了JavaScript中数组去重的各种方法,并通过实际代码示例进行了深入解析。文章首先介绍了几种常见的去重技术,包括使用Set对象、过滤方法和双重循环等。每种方法都附有具体的实现代码,帮助读者更好地理解和应用这些技术。此外,文中还讨论了不同方法在性能上的优劣,为开发者提供了实用的参考。 ... [详细]
  • 如何在JavaScript中实现字符到ASCII码的转换 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • Python 开发笔记:深入探讨字符串及其常用方法与技巧 ... [详细]
  • 在多年使用Java 8进行新应用开发和现有应用迁移的过程中,我总结了一些非常实用的技术技巧。虽然我不赞同“最佳实践”这一术语,因为它可能暗示了通用的解决方案,但这些技巧在实际项目中确实能够显著提升开发效率和代码质量。本文将深入解析并探讨这四大高级技巧的具体应用,帮助开发者更好地利用Java 8的强大功能。 ... [详细]
author-avatar
Me丶i丶晓莹丬_690
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有