#用于跟踪和反映数据源对象的变化--useMagical
import { cloneDeep } from 'lodash-es'
import { reactive, ref, watchEffect } from 'vue'
/*** 神奇函数* @param source 数据源,* @param initKey 固定需要返回的属性* @description 收集数据源中修改的属性,并返回* @version 1.0 仅支持对象* @author sufei* @return { source, result }*/
export function useMagical(source: any, initKey?: string[]) {const result = reactive<any>({})// 神奇函数启动状态const starting = ref(false)// 对数据源进行深度copylet sourceCache: any = {}watchEffect(() => {if (!starting.value) returnObject.keys(sourceCache).forEach((key) => {if (JSON.stringify(source[key]) !== JSON.stringify(sourceCache[key])) {result[key] = source[key]} else if (initKey?.includes(key)) {result[key] = source[key]}})})/* 启动神奇函数*/function startMagical(val?: Record<string, any>) {if (val) {setSourceCache(val)} else {sourceCache = cloneDeep(source)}if (initKey && initKey.length > 0) {initKey.forEach((key) => {result[key] = source[key] || null})}starting.value = true}function setSourceCache(val: any) {sourceCache = {}Object.keys(val).forEach((key) => {sourceCache[key] = undefined})}return {source,result,startMagical,}
}
这个
useMagical
函数是一个自定义的 Vue Hooks,用于跟踪和反映数据源对象的变化。它通过watchEffect
监听source
的变化,并将变化的属性反映到result
中。
问题分析:
类型安全问题:source
参数的类型被声明为 any
,这可能导致类型检查失效。应该使用更具体的类型来确保类型安全。
**副作用控制问题:**在 watchEffec
t 中直接修改 result
,这可能导致不必要的副作用。应该使用更可控的方式来更新 result
。
性能问题:在每次 source
变化时,都会遍历 sourceCache
的所有键,这可能在数据源较大时影响性能。可以考虑使用更高效的算法来减少不必要的遍历。
修复建议:
**类型安全: **使用 TypeScript
的类型系统来确保 source
和 result
的类型安全。可以使用 Record<string, any>
或更具体的类型来定义 source
和 result
。
副作用控制: 使用 reactive
或 ref
来创建响应式对象,并使用 Vue
的 set
方法来更新 result
,以避免直接修改响应式对象。
性能优化: 使用 Map
来存储 sourceCache
,这样可以更高效地查找和更新键值对。同时,可以使用 watch
来监听特定的属性,而不是整个 source
对象。
import { cloneDeep, isEqual } from 'lodash-es';
import { reactive, ref, watchEffect } from 'vue';/*** 神奇函数* @param source 数据源,* @param initKey 固定需要返回的属性* @description 收集数据源中修改的属性,并返回* @version 1.0 仅支持对象* @author sufei* @return { source, result }*/
export function useMagical<T extends Record<string, any>>(source: T, initKey?: string[]) {const result = reactive<T>({} as T);// 神奇函数启动状态const starting = ref(false);// 对数据源进行深度copyconst sourceCache = ref<T>({} as T);watchEffect(() => {if (!starting.value) return;Object.keys(source).forEach((key) => {if (!isEqual(source[key], sourceCache.value[key])) {result[key] = source[key];} else if (initKey?.includes(key)) {result[key] = source[key];}});});/* 启动神奇函数*/function startMagical(val?: T) {if (val) {setSourceCache(val);} else {sourceCache.value = cloneDeep(source);}if (initKey && initKey.length > 0) {initKey.forEach((key) => {result[key] = source[key] || null;});}starting.value = true;}function setSourceCache(val: T) {sourceCache.value = {} as T;Object.keys(val).forEach((key) => {sourceCache.value[key] = undefined;});}return {source,result,startMagical,};
}
修复说明:
类型安全:
使用 T extends Record<string, any>
来确保 source
和 result
是对象类型。
使用 reactive<T>({} as T)
和 ref<T>({} as T)
来确保类型安全。
副作用控制:
使用 reactive
和 ref
来创建响应式对象。
使用 watchEffect
来监听 source
的变化,并使用 isEqual
来比较值是否相等。
性能优化:
使用 ref
来存储 sourceCache
,并在 startMagical
函数中使用 cloneDeep
来深度复制 source
。
相关文章:
#用于跟踪和反映数据源对象的变化--useMagical
import { cloneDeep } from lodash-es import { reactive, ref, watchEffect } from vue /*** 神奇函数* param source 数据源,* param initKey 固定需要返回的属性* description 收集数据源中修改的属性,并返回* version 1.0 仅支持对象* author sufei* return { source, resu…...
基于微信小程序的场地预约设计与实现
第3章 系统设计 3.1系统设计目标 本系统的实现可以帮助体育馆场地信息的管理。帮助管理员对注册用户管理以及用户预约管理。同时可以帮助用户进行场地预约。本系统可以实现用户足不出户预约到需要的场地,为用户提供场地信息了解的平台。 3.2系统功能结构图 本系统的…...
1446. 连续字符 简单
1446. 连续字符https://leetcode.cn/problems/consecutive-characters/ 给你一个字符串 s ,字符串的「能量」定义为:只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1: 输入:s "leetcode"…...
多张图片合成PDF
昨天接了一个家教,在网上搜集了一些图片格式的素材,但想要发给学生家长打印,都是图片格式可能不太方便,就想着合成pdf文件之后再发给家长。 试用了“samll*”一次,就需要充值vip了,所以就用python自己写了…...
【办公】钉钉修改默认存储位置,释放C盘空间
Step1: 右击钉钉图标选择设置 Step2: 通用里面找到文件保存位置,修改文件目录: 最新版本钉钉界面: 设置完成后按提示重启即可!...
VLLM历次会议(2024.7)
支持LLama3.1: 量化: vllm git下的子项目:llm-compressor CPU offloading 允许跑更大的模型;会变慢些;在CPU-GPU之间有NVLink的机器上,变慢的幅度小。 新增对Medusa(用1个Head并行推出好几个…...
进程等待与进程替换
目录 一、进程等待 1.1 为什么要等待子进程? 1.2 等待的两种方式 1.2.1 wait函数 1.2.2 waitpid函数 1.3 获取子进程的退出状态 1.4 示例代码 阻塞式等待(同步) 非阻塞等待(异步) 二、进程替换 2.1 什么是进…...
C# CultureInfo 地区影响字符串
问题 线上遇到有玩家资源加载异常,发现资源路径出现异常字符: 发现是土耳其语下字符串转小写不符合预期: "I".ToLower() -> ı 解决方案 String.ToLower 改成 String.ToLowerInvariant 全局修改禁用文化差异:ht…...
走进 Tcl 语言:历史、特性与应用
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测
代码地址:CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测 CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测 一、引言 1、研究背景和意义 光伏发电作为可再生能源的重要组成部分,近…...
使用MaxKB及deepseek搭建本地AI知识库
序 本文主要研究一下如何MaxKB及deepseek搭建本地AI知识库 步骤 拉取MaxKB镜像 docker pull cr2.fit2cloud.com/1panel/maxkb如果拉取不下来就用docker.1ms.run/1panel/maxkb 启动MaxKB docker run -d --namemaxkb --restartalways -p 8080:8080 \ -v ~/.maxkb:/var/lib/p…...
一文通俗理解为什么需要泛型以及泛型的使用
为什么需要泛型? public static void main(String[] args) {ArrayList list new ArrayList();// 由于集合没有做任何限定,任何类型都可以给其中存放list.add("abc");list.add("def");list.add(5);Iterator it list.iterator();wh…...
凸包算法—— cad c#二次开发
效果如下: 代码如下: using IfoxDemo; //[assembly: CommandClass(typeof(IFoxDemo.凸包class))]//只允许此类快捷键命令 namespace IFoxDemo {public class 凸包class{public static class 凸包助手{/// <summary>/// 计算点集的凸包并返回多段线…...
Eclipse JSP/Servlet 深入解析
Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…...
grep如何排除多个目录?
在使用 grep 进行文本搜索时,有时候需要排除多个目录,避免在这些目录下进行搜索。下面介绍几种不同的实现方式。 目录 1.使用 -r 和 --exclude-dir 选项(GNU grep) 2.使用扩展正则表达式和 -P 选项(GNU grep&#x…...
linux ollama deepseek等大语言模型的model文件的存储目录
linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的,模型数据存放在: /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录,则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...
React进阶之React核心源码解析(二)
React核心源码解析 diff单一节点比较diff多节点比较diff两轮遍历比较第一轮比较第二轮比较 Update 状态更新Concurrent Mode diff 一共两个阶段 render:内存中的更新,主要是通过递归的过程,来将react变化的部分,在内存中找到哪些…...
八、OSG学习笔记-
前一章节: 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码: OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…...
Python实现随机森林(Random Forest)算法
随机森林(Random Forest)是一种集成学习方法,通过构建多个决策树并结合它们的预测结果来提高模型的准确性和稳定性。下面是一个使用Python实现随机森林算法的示例。我们将使用scikit-learn库,它提供了方便的接口来实现随机森林。 …...
平方数列与立方数列求和的数学推导
先上结论: 平方数列求和公式为: S 2 ( n ) n ( n 1 ) ( 2 n 1 ) 6 S_2(n) \frac{n(n1)(2n1)}{6} S2(n)6n(n1)(2n1) 立方数列求和公式为: S 3 ( n ) ( n ( n 1 ) 2 ) 2 S_3(n) \left( \frac{n(n1)}{2} \right)^2 S3(n)(2n(n1)…...
new和malloc的区别
new malloc流程 new new流程 调用operator new 分配内存:在free store 生成对象 free store 可能在 堆 / 自定义的地方 可以认为虚拟内存到物理内存的映射关系早已完成 若分配内存失败(内存空间不够),抛出std::bad_alloc 异常…...
JVM——垃圾回收算法
目录 垃圾回收算法 评价标准: 标记-清除算法: 复制算法: 标记-整理算法: 分代GC: arthas查看分代之后的内存情况: 垃圾回收算法 java是如何实现垃圾回收的呢?简单来说,垃圾回…...
算法日记16:SC68 联通块问题(并查集)
一、题目: 二、题解: 1、看到求联通块问题,我们可以考虑使用DFS/并查集(在这里我们仅介绍并查集) 2、什么是并查集? 2.1:初始化:对于每一个点,我们都对其进行初始化操作pre[i]i pre[i]表示i的…...
Unity-Mirror网络框架-从入门到精通之Pong示例
文章目录 前言示例介绍NetworkManagerPongBallPlayer总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计…...
c++ 多线程知识汇总
一、std::thread std::thread 是 C11 引入的标准库中的线程类,用于创建和管理线程 1. 带参数的构造函数 template <class F, class... Args> std::thread::thread(F&& f, Args&&... args);F&& f:线程要执行的函数&…...
探索 Text-to-SQL 技术:从自然语言到数据库查询的桥梁
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...
Java NIO ByteBuffer 详解
什么是 ByteBuffer ByteBuffer 是 Buffer 的一个具体实现,专门用于存储和操作字节数据。它提供了高效的、基于内存的 I/O 数据处理方式。 Buffer 类是构建 Java NIO 的基础,其中 ByteBuffer 类是 Buffer 子类中最受欢迎的。这是因为字节类型是最通用的…...
【机器学习】简单线性回归算法及代码实现
线性回归算法 一、摘要二、线性回归算法概述三、损失函数的定义和衡量标准四、简单线性回归的求解和应用五、机器学习算法一般求解思路 一、摘要 本文讲解了线性回归算法的基础知识和应用,强调线性回归主要用于解决回归问题。通过分析房产价格与房屋面积的关系&…...
【前端开发】query参数和params参数的区别
在Web开发中,query参数(URL查询参数)和params参数(路由参数)是两种不同的URL传参方式,它们的核心区别如下: 一、 位置不同 query参数params参数位置URL中?之后,用&连接多个参数…...
人工智能数学基础学习PPT
学习视频:人工智能 -数学基础 文章目录 1.简介1.函数2.极限3.无穷小与无穷大4.连续性与导数5.偏导数6.方向导数7.梯度 2.微积分1.微积分基本想法2.微积分的解释3.定积分4.定积分性质5.牛顿-莱布尼茨公式 3.泰勒公式与拉格朗日1.泰勒公式2.一点一世界3.阶数的作用4.…...
企业文件防泄密软件哪个好?
在企业文件防泄密软件领域,天锐绿盾和中科数安都是备受认可的品牌,它们各自具有独特的特点和优势。 以下是对这两款软件的详细比较: 天锐绿盾 功能特点 集成性强:集成了文件加密、数据泄露防护DLP、终端安全管理、行为审计等数据安…...
美丽 百褶裙提示词 + MD
MD 参考教程:Marvelous Designer零基础教学,MD布料制作-百褶裙建模制作,次世代教学_哔哩哔哩_bilibili 【MD新手教程】30分钟教会你制作百褶裙,Marvelous Designer超简单入门案例教程_哔哩哔哩_bilibili 【c4d技术解析】MD百褶裙…...
解释和对比“application/octet-stream“与“application/x-protobuf“
介绍 在现代 Web 和分布式系统的开发中,数据的传输和交换格式扮演着关键角色。为了确保数据在不同系统之间的传输过程中保持一致性,MIME 类型(Multipurpose Internet Mail Extensions)被广泛应用于描述数据的格式和内容类型。在 …...
基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱,完成微电网的最优调…...
AI前端开发技能提升与ScriptEcho:拥抱AI时代的前端开发新范式
随着人工智能技术的飞速发展,AI前端开发岗位对技能的要求也水涨船高。越来越多的企业需要具备AI相关知识和高级前端开发能力的工程师,这使得传统的前端开发模式面临着巨大的挑战。如何提升开发效率,降低人力成本,成为了摆在所有前…...
LeetCode题解:2690. 无穷方法对象,Proxy
Problem: 2690. 无穷方法对象 思路 这个问题的核心在于创建一个对象,该对象能够响应对其任何方法的调用,并返回调用的方法名称。为了实现这一点,我们可以利用 JavaScript 中的 Proxy 对象。Proxy 对象允许我们自定义对象的基本操作ÿ…...
Python中的HTTP客户端库:httpx与request | python小知识
Python中的HTTP客户端库:httpx与request | python小知识 在Python中,发送HTTP请求和处理响应是网络编程的基础。requests和httpx是两个常用的HTTP库,它们都提供了简洁易用的API来发送HTTP请求。然而,httpx作为新一代的HTTP客户端…...
RabbitMQ使用guest登录提示:User can only log in via localhost
guest用户默认是无法使用远程访问的,生产环境建议直接在对应服务器登录使用。 1、通过创建新增用户并赋予权限实现远程登录 添加新用户 rabbitmqctl add_user zjp zjp 设置管理员 rabbitmqctl set_user_tags zjp administrator 设置新用户的权限 rabbitmqctl…...
#渗透测试#批量漏洞挖掘#Crocus系统—Download 文件读取
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
基于Matlab实现六自由度机械臂正逆运动仿真(源码)
在机器人技术领域,六自由度机械臂是一种广泛应用的设备,它可以实现空间中的位置和姿态控制。本项目聚焦于六自由度机械臂的正逆运动学仿真,利用MATLAB2016b作为开发工具,旨在深入理解并掌握机械臂的工作原理和运动控制。 正运动学…...
亚信安全正式接入DeepSeek
亚信安全致力于“数据驱动、AI原生”战略,早在2024年5月,推出了“信立方”安全大模型、安全MaaS平台和一系列安全智能体,为网络安全运营、网络安全检测提供AI技术能力。自2024年12月DeepSeek-V3发布以来,亚信安全人工智能实验室利…...
Django 创建第一个项目
Django 创建第一个项目 引言 Django 是一个高级的 Python Web 框架,它鼓励快速开发和干净、实用的设计。本指南将带您从头开始创建一个简单的 Django 项目,以便您能够熟悉 Django 的基本结构和概念。 准备工作 在开始之前,请确保您已经安装了 Python 和 Django。以下是安…...
RL基础概念
RL意味着模型从真实世界中获取反馈,根据策略调整参数,以达到最大化反馈的优化算法; 强化学习的核心在于:1.试错(因为仅凭reward无法得到明确的优化方向,所以需要不断多尝试);2.延迟奖…...
像取快递一样取文件?
看到一个很有意思的项目,像我们做软件分享的感觉会有用,就是现在服务器费用太贵了,如果自建的话感觉不是很值得。 FileCodeBox FileCodeBox 是一个轻量级的文件分享系统,它基于匿名口令分享文本和文件,无需注册登录&…...
Jenkins 新建配置Pipeline任务 三
Jenkins 新建配置Pipeline任务 三 一. 登录 Jenkins 网页输入 http://localhost:8080 输入账号、密码登录 一个没有创建任务的空 Jenkins 二. 创建 任务 图 NewItem 界面左上角 New Item 图NewItemSelect 1.Enter an item name:输入任务名 2.Select an ite…...
React 前端框架搭建与解析
React 前端框架搭建与解析 一、 概述 React 是 Facebook 开源的用于构建用户界面的 JavaScript 库,以其组件化、声明式编程范式以及高效的虚拟 DOM 渲染机制,成为当今最流行的前端框架之一。本文将带领你从零开始搭建一个 React 开发环境,并深入解析其核心概念。 二、 环…...
像指针操作、像函数操作的类
像指针一样的类。把一个类设计成像一个指针。什么操作符运用到指针上? 使用标准库的时候,里面有个很重要的东西叫容器。容器本身一定带着迭代器。迭代器作为另外一种智能指针。迭代器指向容器里的一个元素。迭代器用来遍历容器。 _list_iterator是链表迭…...
15.Python网络编程:进程池、进程间通信、多线程、进程和线程区别、网络通信、端口、IP地址、socket、UDP、TCP、http
1. 进程池(Process Pool) 进程池是通过将多个进程放入池中管理来避免频繁地创建和销毁进程,提高效率。Python 提供了 multiprocessing.Pool 类来实现进程池,它可以用于并行计算任务。 示例:使用进程池 from multipr…...
Ubuntu启动geteck/jetlinks实战:Docker启动
参考: JetLinks 物联网基础平台 安装Docker Ubuntu下载安装Docker-Desktop-CSDN博客 sudo apt install -y docker-compose 下载源码 git clone https://github.com/jetlinks/jetlinks-community.git cd jetlinks-community 启动 cd docker/…...
Newton 差商插值多项式
Newton 差商插值多项式 根据差商定义,把 x x x 看成[ a , b ] a,b] a,b]上一点,可得 f ( x ) f ( x 0 ) f [ x , x 0 ] ( x − x 0 ) f(x)f(x_0)f[x,x_0](x-x_0) f(x)f(x0)f[x,x0](x−x0) f [ x , x 0 ] f [ x 0 , x 1 ] f [ x , x 0 , x 1…...