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

【JS Utils】Vue2 自定义计算属性 (兼容 uniapp 和 Vue 2.7 以前版本)

Vue2 自定义计算属性简述类似 Vue 2.7 / Vue 3.x 的computed组合式API可自由创建计算属性对象灵活设置计算属性到Vue实例中。兼容 uniapp 环境和 Vue 2.7 以前版本下使用。源码/** * 创建Vue计算属性对象 * param {Vue} vm Vue实例 * param {Function|Object} getterOrOptions 取值方法或配置项 * param {Function} getterOrOptions.get 取值方法 * param {Function} getterOrOptions.set 设值方法 * param {Boolean} getterOrOptions.cache 是否使用缓存 (默认是) * return {Object} */functioncreateVueComputed(vm,getterOrOptions){letDepcreateVueComputed.Dep||(vm._data||vm.$parent?._data)?.__ob__.dep.constructorletWatchercreateVueComputed.Watcher||(vm._watcher||vm.$parent?._watcher)?.constructorif(!Dep||!Watcher)thrownewError(Cannot find necessary dependency methods.)letnoopcreateVueComputed.noop||function(){}let{get,set,cache}typeofgetterOrOptionsfunction?{get:getterOrOptions}:getterOrOptions cacheget?cache??true:falseletwatchernewWatcher(vm,get||noop,noop,{lazy:true})returnObject.defineProperties(Object.create(null),{value:{configurable:true,enumerable:true,set:set?set.bind(null):noop,get:cache?function(){if(watcher.dirty)watcher.evaluate()if(Dep.target){Dep.target.onTrackDep.target.onTrack({effect:Dep.target,target:this,type:get,key:value})watcher.depend()}returnwatcher.value}:get||noop},effect:{configurable:true,enumerable:true,value:watcher},__v_isRef:{configurable:true,value:true},__v_isReadonly:{configurable:true,value:!set}})}/** * 设置Vue计算属性 * param {Vue} vm Vue实例 * param {Object} data 设置的对象 * param {Object} props 计算属性表 { [key]: Function | { get(rawGet), set(newVal, rawSet), cache, configurable, enumerable } } * return {Object} 处理后的对象源 */functionsetVueComputeProps(vm,data,props){data||{}letnoopcreateVueComputed.noop||function(){}letgetDescObject.getOwnPropertyDescriptorletprotoObject.getPrototypeOf(data)letwatchersvmdata?vm._computedWatchers||Object.create(null):nullfor(letkeyinprops){let{get,set,cache,configurable,enumerable}typeofprops[key]function?{get:props[key]}:props[key]letdescgetDesc(data,key)||protogetDesc(proto,key)||{}cacheget?cache??true:falseconfigurable??desc.configurable??trueenumerable??desc.enumerable??trueletrawGetdesc.get?.bind(data),rawSetdesc.set?.bind(data)letuseGetget?function(){returnget.call(this,rawGet)}:noopletuseSetset?function(val){set.call(this,val,rawSet)}:noopletrefcache?createVueComputed(vm,useGet):nullif(watchers)watchers[key]?.teardown(),cache?(watchers[key]ref.effect):deletewatchers[key]Object.defineProperty(data,key,{configurable,enumerable,set:useSet,get:cache?getDesc(ref,value).get:useGet})}returndata}// 可绑定到Vue原型链中使用Vue.prototype.$computedfunction(){returncreateVueComputed(this,...arguments)}Vue.prototype.$setComputedfunction(){returnsetVueComputeProps(this,...arguments)}使用示例templatedivdivDemo1: {{ demo1 }}buttonclickval1/button/divdivDemo2: {{ demo2 }}buttonclickdemo2/button/divdivDemo3:inputtypetextv-modelval3//divdivBind new computed ref: {{ val4 ? val4.value : }}divbuttonv-ifval4clickbindVal4bind/buttonbuttonv-elseclickunbindVal4unbind/button/div/div/div/templatescript// 绑定方法到Vue原型链中 (可选)Vue.prototype.$computedfunction(){returncreateVueComputed(this,...arguments)}Vue.prototype.$setComputedfunction(){returnsetVueComputeProps(this,...arguments)}exportdefault{data(){return{val1:100,val2:200,val3:test}},created(){// 在 created 周期内且当前为根实例时 (this this.$root)需嵌套在 this.$nextTick 下使用。// 在 created 周期内且当前不为根实例或 mounted 周期内可同步执行。constinitComputed()this.$setComputed(this,{// 基本设置方式demo1(){letresthis.val11console.log(val1 get:${res})returnres},// 带配置设置方式与 computed 配置一致demo2:{cache:false,get(){letresthis.val22console.log(val2 get:${res})returnres},set(newVal){this.val2newVal console.log(val2 set:${newVal})}},// 可以覆盖实例下原有的 data, props, computed, methods 内的属性val3:{// 第一参数为原来的取值方法get(rawGet){letresx_${rawGet()}console.log(val3 get:${res})returnres},// 第一参数为设置的新值第二参数为原来的设值方法set(newVal,rawSet){rawSet((newValnewVal.replace(/^x_/,)))console.log(val3 set:${newVal})}}})thisthis.$root?this.$nextTick(initComputed):initComputed()},methods:{bindVal4(){// 自由设置计算属性this.val4this.$computed((){letresthis.val1this.val2 console.log(val4 get:${res})returnres})},unbindVal4(){// 销毁设置的计算属性this.val4.effect.teardown()}}}/script

相关文章:

【JS Utils】Vue2 自定义计算属性 (兼容 uniapp 和 Vue 2.7 以前版本)

Vue2 自定义计算属性 简述:类似 Vue 2.7 / Vue 3.x 的 computed 组合式API,可自由创建计算属性对象,灵活设置计算属性到Vue实例中。兼容 uniapp 环境和 Vue 2.7 以前版本下使用。源码 /*** 创建Vue计算属性对象* param {Vue} …...

3ds Max老鸟的Unity上手指南:用FBX Exporter插件打通你的第一个实时交互项目

3ds Max老鸟的Unity上手指南:用FBX Exporter插件打通你的第一个实时交互项目 如果你是一位长期深耕于3ds Max的3D艺术家,习惯了用多边形建模和V-Ray渲染打造静态视觉盛宴,那么第一次接触Unity时可能会感到既兴奋又迷茫。兴奋的是,…...

Driver Store Explorer终极指南:5步彻底清理Windows驱动,释放10GB+系统空间

Driver Store Explorer终极指南:5步彻底清理Windows驱动,释放10GB系统空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否发现Windows系统盘空间莫名减少…...

抖音批量下载终极指南:免费无水印工具快速上手

抖音批量下载终极指南:免费无水印工具快速上手 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

深入eMios时钟树:从160MHz CORE_CLK到通道定时,搞懂S32K3xx系列性能调优基础

深入eMios时钟树:从160MHz CORE_CLK到通道定时,搞懂S32K3xx系列性能调优基础 在汽车电子和工业控制领域,定时精度往往直接决定系统性能的上限。当工程师面对S32K3xx系列MCU时,eMios模块的时钟配置就像一把双刃剑——用得好可以精准…...

别再混淆了!一文讲透机器学习里的‘在线学习’、‘增量学习’和‘终身学习’到底有啥区别

机器学习进阶指南:在线学习、增量学习与终身学习的本质差异 引言:为什么我们需要区分这些概念? 在机器学习领域,术语的混淆常常导致实践中的误用。想象一下,你正在构建一个推荐系统,团队讨论时有人说"…...

linux学习进展 mysql数据库

前面我们已经掌握了Linux网络编程的核心:TCP/UDP协议、Socket编程、线程池(半同步半异步模型),也实现了极简HTTP服务器。但实际的网络程序中,我们需要持久化存储数据——比如用户信息、接口请求记录、业务数据等&#…...

FreeRTOS通信机制避坑指南:在STM32 CubeMX中选队列、信号量还是任务通知?

FreeRTOS通信机制实战决策指南:从队列到任务通知的精准选择 在嵌入式实时系统开发中,任务间通信机制的选择往往决定了系统的可靠性、响应速度和资源利用率。对于使用STM32 CubeMX和FreeRTOS的中级开发者而言,面对队列、信号量、互斥量、事件组…...

Claude Code用户如何配置Taotoken解决访问限制与Token不足

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code用户如何配置Taotoken解决访问限制与Token不足 1. 场景:当编程助手遇到访问瓶颈 许多开发者习惯使用Claud…...

你的WS2812灯效卡顿吗?聊聊STM32驱动中的阻塞延时与非阻塞延时选择

WS2812灯效卡顿难题:STM32延时策略的深度优化指南 当你在STM32上实现WS2812灯带效果时,是否遇到过灯效卡顿、系统响应迟缓的问题?这背后往往隐藏着延时策略选择的学问。本文将带你深入探讨阻塞延时与非阻塞延时的本质区别,并提供一…...

计算机教材策划与编程教学实践指南

1. 计算机教材策划的核心逻辑计算机教材不同于普通技术文档,它需要构建从认知到实践的完整学习路径。我在参与多本国家级规划教材编写时,总结出"3D"策划原则:Depth(深度)——每个知识点必须穿透表象&#xf…...

告别v4l2!用树莓派Picamera2库驱动IMX708摄像头,打造一个30秒自动扫码器

树莓派Picamera2实战:基于IMX708的智能扫码系统开发指南 在嵌入式视觉应用领域,树莓派凭借其出色的性价比和丰富的生态成为首选平台。而随着Raspberry Pi Camera Module 3(搭载IMX708传感器)的发布,配合官方推出的Pica…...

zfoo入门指南:10分钟快速搭建高性能Java服务器

zfoo入门指南:10分钟快速搭建高性能Java服务器 【免费下载链接】zfoo 💡Extremely fast enterprise server framework, can be used in RPC, game server, web server. 项目地址: https://gitcode.com/gh_mirrors/zf/zfoo zfoo是一个极其快速的企…...

Beyond Compare 5密钥生成技术解析:从二进制逆向到RSA加密的完整解决方案

Beyond Compare 5密钥生成技术解析:从二进制逆向到RSA加密的完整解决方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 在文件比对和同步领域,Beyond Compare 5以其卓越…...

3步解决VMware虚拟化难题:从零激活到专业环境搭建全攻略

3步解决VMware虚拟化难题:从零激活到专业环境搭建全攻略 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major versions of VMware…...

Newton入门到精通:10个项目实战案例带你掌握核心技能

Newton入门到精通:10个项目实战案例带你掌握核心技能 【免费下载链接】newton An open-source, GPU-accelerated physics simulation engine built upon NVIDIA Warp, specifically targeting roboticists and simulation researchers. 项目地址: https://gitcode…...

BabelDOC:如何实现PDF文档的无损双语翻译?5大核心技术解析

BabelDOC:如何实现PDF文档的无损双语翻译?5大核心技术解析 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC PDF文档翻译面临的最大挑战是什么?传统翻译工具往…...

macOS版WPS Office优化指南:社区工具实现功能增强与界面定制

1. 项目概述:一个为macOS版WPS Office“松绑”的辅助工具如果你是一名长期在macOS上使用WPS Office的用户,那么对“lethehades/wps-macos-helper”这个项目标题可能瞬间就会心领神会。这不仅仅是一个简单的脚本或工具,它背后反映的是一个非常…...

为AI Agent集成链上微支付:基于x402协议与Base网络的实践指南

1. 项目概述:为AI Agent引入链上支付能力如果你正在开发一个AI Agent,或者在使用Claude Code这类智能编码助手时,希望它能帮你查询链上数据、执行交易,甚至为调用外部付费API买单,那么你很可能面临一个核心难题&#x…...

ydotool键盘输入完全指南:支持任意键盘布局的终极解决方案

ydotool键盘输入完全指南:支持任意键盘布局的终极解决方案 【免费下载链接】ydotool Generic command-line automation tool 项目地址: https://gitcode.com/gh_mirrors/yd/ydotool ydotool是一款通用的命令行自动化工具,能够模拟键盘输入和鼠标操…...

终极FakeLocation指南:10分钟掌握Android应用级位置模拟与隐私保护

终极FakeLocation指南:10分钟掌握Android应用级位置模拟与隐私保护 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的开源Android位…...

OpenClaw技能实战:构建自动化YouTube视频摘要工作流

1. 项目概述与核心价值如果你和我一样,每天被淹没在YouTube海量的视频信息里,想快速抓住几个关注频道的最新干货,却苦于没时间一个个点开看,那这个项目可能就是你的“数字信息管家”。OpenClaw Skill - YouTube Transcript Summa…...

告别ST-Link!用DAPLink玩转STM32调试与拖拽烧录(附固件升级指南)

从ST-Link到DAPLink:嵌入式开发者的效率革命 当你在深夜调试STM32时,是否曾因ST-Link的驱动问题而抓狂?或是为频繁插拔烧录器感到厌倦?DAPLink的出现,正在悄然改变嵌入式开发的游戏规则。这个由ARM主导的开源项目&…...

Scroll Reverser终极指南:5分钟解决macOS多设备滚动混乱难题

Scroll Reverser终极指南:5分钟解决macOS多设备滚动混乱难题 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾在MacBook上同时使用触控板和外接鼠标时&#x…...

告别静态交互:用鼠标钩子为你的NX插件添加‘实时预览’魔法

告别静态交互:用鼠标钩子为你的NX插件添加‘实时预览’魔法 在工业设计领域,NX软件以其强大的建模能力著称,但许多第三方插件仍停留在"点击-等待-查看结果"的传统交互模式。这种静态操作流程不仅效率低下,更让用户体验大…...

深度解析:3大技术挑战与VRM-Addon-for-Blender的实战解决方案

深度解析:3大技术挑战与VRM-Addon-for-Blender的实战解决方案 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.1 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender VRM-Addon-for-B…...

别再死记硬背了!用这3个真实案例,帮你彻底搞懂ISO 19011里的‘审核发现’与‘审核结论’

3个真实案例解析:如何区分ISO 19011中的"审核发现"与"审核结论" 第一次接触管理体系审核时,最让人头疼的莫过于那些看似相似却又截然不同的专业术语。记得我刚开始学习ISO 19011标准时,曾把"审核发现"和"…...

UnrealPakViewer:企业级虚幻引擎Pak文件深度解析与资源优化终极解决方案

UnrealPakViewer:企业级虚幻引擎Pak文件深度解析与资源优化终极解决方案 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具,支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 在虚幻引擎游戏…...

WarcraftHelper 一站式优化方案:高效解决魔兽争霸III现代化兼容性问题

WarcraftHelper 一站式优化方案:高效解决魔兽争霸III现代化兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸III作为经典…...

反向面试终极指南:从公司对技术社区态度看职场选择

反向面试终极指南:从公司对技术社区态度看职场选择 【免费下载链接】reverse-interview-zh 技术面试最后反问面试官的话 项目地址: https://gitcode.com/gh_mirrors/re/reverse-interview-zh 反向面试是技术求职者在面试最后环节向面试官提问的关键过程&…...