vue 用key拿对象value_利用 WeakMap 对 Vue 新建数组中的对象赋予 :key

需求

在 Vue 中,对组件进行循环都需要加入key以便“就地复用”,可是在某些情况下,我们需要新建多个对象,而这些对象不是从后端获取到的,而是前端生成的,没有唯一值,且 Vue 目前版本只允许字符串,数字作为组件的 key。

方案

简单的组件

例如

export default{

methods: {

addSometing () {                this.items.push({                    // 一些属性

someProp

})

}

}

}

简单的组件,对 items 进行 CRUD 都是可以识别出来。不会影响界面的显示。

复杂的组件

但是对于一些复杂的组件 Vue 是识别不出来的,而且在删除时候会发生错乱。

所以需要这样写

export default{

methods: {

addSometing () {                this.items.push({

id: getUidFunction(),                    // 一些属性

someProp

})

}

}

}

在创建时候添加唯一的 key —— id ,并且在上传的时候删除数组的 id

缺点

很难判断你所写的组件究竟是复杂还是简单,但在数组对象中添加唯一的 id 且必须在上传之前去除它,这终究不是一个好的解决方案。

更好的方法 WeakMap

思考

在ruby语言中,我们可以唯一确定这个对象,因为每个对象新建后都有一个唯一值确定该对象。但是 js 却没有这种语言特性。所以我们要从这方面入手考虑。

WeakMap的作用

WeakMap针对于普通的 Map 有两点特殊之处

1、WeakMap只接受对象作为键名( null 除外),不接受其他类型的值作为键名。

2、WeakMap的键名所指向的对象是弱引用,不计入垃圾回收机制。

重点在于 如果删除了WeakMap的键名所指向的对象,无需手动删除应用。

那么 思考后代码如下// 唯一keylet uKey = 1// 弱引用Mapconst uidMap = new WeakMap()function getUniqueKey (obj) {    if (!uidMap.has(obj)) {

uidMap.set(obj, uKey++)

}    return uidMap.get(obj)

}// 为了简单直接使用插件const uidPlugin = {

install (Vue) {

Vue.prototype.$uid = getUniqueKey

}

}if (typeof window !== 'undefined' && window.Vue) {    window.Vue.use(uidPlugin)

}export { uidPlugin }

在复杂的组件可以这样使用

无需添加唯一的 id 以及删除 id ,即插即用且不影响垃圾回收。完美!

WeakMap  其他使用场景

1、标识 对象

2、缓存与对象相关的 属性

3、为对象添加监听器

总结

新的特性对应新的解决方案,虽然js不是一门优秀的编程语言,但是js却拥有着及其优秀的社区,社区使得js可以不断进步。

作者:jump--jump

来源:https://my.oschina.net/wsafight/blog/1803004

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无限轮播图片的实现原理

无限轮播图相信是很多开发人员常用的一个功能,这里总结一下常用的两种方式的实现原理 一、使用UIScrollview实现无限轮播用UIScrollView实现,在scrollView上添加3个UIImageView,分别用来显示上一张图片,当前显示的图片&#xff0c…

开启 JM 的 trace 功能

[JM代码] 开启 JM 的 trace 功能本帖最后由 firstime 于 2009-6-15 11:16 AM 编辑 城里汉子说过: trace文件对分析码流结构很有效。我说的是trace文件,不是一步一步跟踪,就是编解码同时生成的 trace_enc.txt 这个文件,里面对每个比…

kafka入门介绍(转载)

Kafka作为一个分布式的流平台,这到底意味着什么? 我们认为,一个流处理平台具有三个关键能力: 发布和订阅消息(流),在这方面,它类似于一个消息队列或企业消息系统。 以容错的方式存储…

Cmd Markdown 编辑阅读器

欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记、知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown&…

关于在smarty中实现省市区三级联动

刚开始接触php&#xff0c;&#xff0c;其实对于一些比较深入的东西还不是很了解&#xff0c;就像是这次的省市区联动&#xff0c;都是用三张表为基础编码的&#xff0c;原谅我的无知&#xff0c;谢谢。 接下来就是编码部分了&#xff1a; <?php require(./smarty/Smarty.c…

Ubuntu GitLab CI Docker ASP.NET Core 2.0 自动化发布和部署(1)

相关博文&#xff1a; Ubuntu 简单安装和配置 GitLabUbuntu 简单安装 DockerUbuntu Docker 简单安装 GitLabUbuntu Docker 安装和配置 GitLab CI 持续集成服务器版本 Ubuntu 16.04 LTS。 经过上面四篇博文中的相关安装和配置&#xff0c;我们主要完成了两个容器的创建和运行&am…

X264学习笔记(1)

X264学习笔记&#xff08;1&#xff09; X264编码流程 参数的初始化 1.opt&#xff0c;param根据输入的参数和标准的规定&#xff0c;进行初始化设置。 Opt的说明如下&#xff1a; Opt->hin用于给出读入的yuv文件的指针地址 Opt->hout给出了输出的文件的指针地址 Opt->…

python 数字转化excel行列_Python实现excel的列名称转数字、26进制(A-Z)与10进制互相转换...

Python实现excel的列名称转数字、26进制(A-Z)与10进制互相转换sequence list( map( lambda x: chr( x ), range( ord( A ), ord( Z ) 1 ) ) )##-----字母转数字(python实现 1-26A-Z, then AA-AZ)def ten2TwentySix(num):L []numnum-1; #实现从1对应Aif num > 25:while Tr…

错误提示:'……' is not assignable to Android.app.Activity Manifest XML

1 问题描述&#xff1a; 针对这段代码&#xff1a; <activity android:name".fragament.fragment_bulter" /> <activity android:name".fragament.fragment_girl" /> <activity android:name".fragament.fragment_user" />…

关于Lambda和匿名内部类

先上代码&#xff1a; //gcache(f)public <T,R> Function<T,R> cache(Function<T,R> f){final Map<T,R> cachenew HashMap<>();Function<T,R> gt->{if(cache.containsKey(t)){System.out.println("cached t:"t);return cache…

H26L encoder.cfg参数分析

H264 encoder.cfg参数分析 收藏 (1) 文件操作参数:#Files InputFile "silent.yuv" #输入序列,YUV 4:2:0 StartFrame 0 # 从视频流的第几帧开始编码 FramesToBeEncoded 30 #编码图象帧数,指明了除去 B帧后将要被编码的帧数(应该再实验一下&#x…

django-ckeditor表情包修改

一、版本 Django1.11django-ckeditor5.2.2 二、关键步骤 1.删除旧的ckeditor静态文件 所在目录&#xff1a;项目目录下的static文件夹下的ckditor文件夹 rm ckeditor -rf 原因&#xff1a;在安装ckeditor后需要执行collectstatic命令&#xff0c;这个过程中的查找静态文件会去…

python中最难的是什么_python什么的最难了

学的人很少的,如果你没有学过编程,建议学c语言.因为python中文资料很少的.你可以先了解一下phthonpython的历史python的创始人为guido van rossum。1989年圣诞节期间&#xff0c;在阿姆斯特丹&#xff0c;guido为了打发圣诞节的无趣&#xff0c;决心开发一个新的脚本解释程序&a…

Python3生成脚本实现重置键盘键位

个人博客点这里 #!/usr/bin/env python # -*- coding:utf-8 -*- # Created by 秋叶夏风# 本模块的功能:<重置键盘键位>import sys import ossave_format "bat" # 这个值可以修改&#xff0c;有两个选项(bat和reg)&#xff0c;可选择生成bat批处理文件或者re…

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.2.2 如何读入文本输入

2.2.2 如何读入文本输入 最简单的处理任意文本的方式就是使用在卷Ⅰ中我们广泛使用的Scanner类。我们可以从任何输入流中构建Scanner对象。或者&#xff0c;我们也可以将短小的文本文件像下面这样读入到一个字符串中&#xff1a; 在早期的Java版本中&#xff0c;处理文本输入的…

leetcode add Two Numbers

部分 conditional operators ?:写的statements 在有的编译器下能通过&#xff0c;有的可能通不过 base operand of -> has non-pointer type ListNode转载于:https://www.cnblogs.com/liyongguo/p/7152365.html

amap不同样式marker点_想出一手漂亮的图,CAD打印样式表你必须会!

好课推荐&#xff1a;1.CAD2014&#xff1a;点击查看2.室内CAD&#xff1a;点击查看3.CAD2019&#xff1a;点击查看4.CAD2018&#xff1a;点击查看5.【bim】revit&#xff1a;点击查看6.室内手绘&#xff1a;点击查看7.CAD三维&#xff1a;点击查看8.全屋定制&#xff1a;点击查…

JM8.5中的7种宏块模式问题

JM8.5中的7种宏块模式问题 收藏 Outline: 1、 CFG文件中有关可变尺寸宏块模式的相关选项2、 7种宏块模式对应的数值常量3、 7种宏块模式被分成宏块和亚宏块4、 如何对宏块和亚宏块的运动估计&#xff0c;采用一个共同的函数来处理5、 遗留问题1、CFG文件中有关可变尺寸宏块…

python高级编程技巧

个人博客点这里 如何在列表,字典,集合中根据条件筛选数据 方法1:通过迭代来进行判断筛选 解决方案 函数式编程: 如何统计序列中元素的出现频度 解决方案:使用collections.Counter对象 将序列传入Counter的构造器,得到Counter对象是元素频度的字典 Counter.most_common(n)…

2016年安全身份识别主流趋势

安全身份识别解决方案商HID Global通过从不同行业市场的重要客户那里所获得的深刻洞察&#xff0c;以及公司最新解决方案在前瞻性合作伙伴和全球各地的终端用户中进行的试点项目与正式部署情况&#xff0c;确定了2016年最值得业界关注的安全趋势。HID Global 广阔的行业视角&am…