最新要闻
- 我找到了阅读GitHub项目源码的最佳姿势,太舒服了!
- 世界短讯!玩游戏怎么选显示器?认准这几点准没错
- 男子发现捡回家两年的石头是文物 已无偿捐赠:网友惊叹
- 全球热推荐:国产GPU能否满足ChatGPT算力要求 景嘉微回应来了:还不行
- 环球观焦点:今年“蒸煮模式”咋提前了?专家解读
- 长城汽车给理想汽车起了个外号:“微博之王” 李想本人回应亮了 世界微动态
- 易宝支付总裁余晨出席《通用人工智能》新书发布会
- 世界今热点:对建造清代故宫影响最大的工匠,原来是这一家人!
- 合资品牌的无奈!奥迪之后丰田挂牌:我们也有纯电动请往里进
- 苹果Mac OS被指碰瓷WinXP经典壁纸:还真不是玩笑
- 世界快资讯:年轻人压力较大 乘联会崔东树:中国车市还得指望中老年人
- 又一新能源车企被申请破产!曾被称为“四小龙”之一
- 珠碱商品报价动态(2023-06-17)
- 看点:只需4年 PCIe 7.0硬盘有望追上DDR5内存:性能狂飙
- 人不在学校却被抬到校长面前拨穗 全场欢呼鼓掌:不想让舍友留下遗憾
- 嫌榴莲太臭?可它这3个好处“香”到不行!
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
记录--封装一个通过js调用的全局vue组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
前言
在使用vue项目编写的时候,不可避免的会碰到需要时js api来调用组件进行显示的情况
例如饿了么element ui 的 Notification 通知、Message 消息提示等组件
虽然已经提供了,但是由于api的限制,我们只能通过特定的参数来有限的改变组件的样式
(相关资料图)
之前的文章说过可以使用 new Vue()、Vue.extends等方法来进行改变这些api组件的样式
但是同时它们也有个缺点,无法自动实时更新数据,也就是没有双向绑定,只能静态布局,为了解决这个痛点
我们自己动手封装一个全局js api调用组件,然后再把需要的数据传过去进去更新,自己动手丰衣足食
就以饿了么element-ui的通知组件Notification为例,实现一个全局通知弹窗下载进度条组件
正文
使用Vue.extend构造器来创建是最为方便的,不过和之前不同的是,这样创建的实例组件只能创建单个,每一次调用都会重新创建一个新的实例,不会对原有的实例进行更新,所以我,我们要对实例进行缓存,以便后续的数据更新
这里我以自定义创建一个下载进度弹窗通知为例
首先我们创建一个组件文件夹下的js文件
/components/DownLoadNotification/index.js
实现思路是用Vue.extend构造组件后,把api接收的参数直接传入组件data使用,并为每个实例生成id,拿出dom插入到全局body中,当生成多个实例时动态计算定位的偏移量避免组件重叠
import Vue from "vue"import component from "./index.vue"const DownLoadNotification = Vue.extend(component)const instances = [] // 实例缓存列表export const notify = (options) => { let instance; // 单个实例 options.onClose = function() { // 把删除当前实例的方法传入组件内 removeNotify(instance.id) } options.onCloseAll = () => { // 把删除所有实例的方法传入组件内 removeNotifyAll() } // 直接控制实例的data,而不是通过propsData传入 instance = new DownLoadNotification({ data: options, }) instance.id = Date.now(); // 生成id instance.$mount(); // 挂载,生成dom节点 document.body.appendChild(instance.$el) // 把dom节点添加到body全局 instance.visible = true // 先挂载节点再显示节点里的内容,可以出现过渡动画,而不是一开始全部显示 // 计算多个实例时的偏移量 // 第一个不需要计算,把push放到循环下面,数组为空时不会循环,第二次开始则会进行计算 let verticalOffset = 0 instances.forEach((item) => { verticalOffset += item.$el.offsetHeight + 16 // 每个组件高度间隔16px }) verticalOffset += 16 // 首次最下面的组件底部距离最底部也有16px的间隙 instance.verticalOffset = verticalOffset // 计算出来的偏移量赋值到组件中data instances.push(instance) // 缓存实例 return instance}// 删除单个组件实例function removeNotify(id) { const index = instances.findIndex(item => item.id === id) index !== -1 && instances.splice(index, 1)}// 删除所有组件实例function removeNotifyAll() { for (let i = instances.length - 1; i >= 0; i--) { instances[i].close(); // 调用组件内的删除方法来同时删除实例和dom }}
删除时既要清空组件dom又要删除实例,所以把在js中定义的删除实例方法传入组件,组件需要删除时调用即可
需要注意的是,当有多个全局组件,删除其中一个时,位置应当发生改变
所以删除其中的一个组件实例时要重新计算偏移量位置
重新改造一下 删除单个组件实例的方法,大致做法就是,拿到被删除的当前实例的高度,然后从被删除实例的位置开始遍历,后面的实例逐一删除被删除的实例高度和边距
// 删除单个组件实例function removeNotify(id) { let index = -1; const len = instances.length; // 未删除前数组总长度 const instance = instances.filter((instance, i) => { // 获取保存当前删除的实例 if (instance.id === id) { index = i; // 保存索引 return true; } return false; })[0]; instances.splice(index, 1); // 删除实例 if (len <= 1) return // 只有一个实例时不需要重新计算位置 const position = instance.position; // 获取实例定位字段 const removedHeight = instance.$el.offsetHeight; // 获取实例高度 for (let i = index; i < len - 1 ; i++) { // 从被删除的位置开始遍历 if (instances[i].position === position) { // 修改的位置定位是否一致 // 将后续元素的定位位置 减去 上一个删除的元素宽度 + 16px 的首次底部边距 instances[i].$el.style[instance.verticalProperty] = parseInt(instances[i].$el.style[instance.verticalProperty], 10) - removedHeight - 16 + "px"; } }}接下来在编写组件/components/DownLoadNotification/index.vue
<script>export default { data() { return { /* 自定义数据 */ fileName: "", fileSize: "", downLoadProgress: 0, downStatus: "", /* 组件基础数据 */ id: null, // 实例id visible: false, // 显示控制按钮 position: "bottom-left", // 显示方位 verticalOffset: 0, // 位置偏移量 onClose: null, // js中传入的删除当前组件方法 onCloseAll: null, // js中传入的删除所有组件方法 }; }, computed: { // 默认纵向布局,定位为 左 或者 右 时边距为10px horizontalClass() { // 实例左偏移还是右偏移 return this.position.indexOf("right") > -1 ? "right" : "left"; }, verticalProperty() { // 实例上还是下 return /^top-/.test(this.position) ? "top" : "bottom"; }, positionStyle() { // 多个实例时的偏移量 return { [this.verticalProperty]: `${this.verticalOffset}px`, }; }, }, methods: { // 销毁当前组件 close() { this.visible = false; this.$el.addEventListener("transitionend", this.destroyElement); // 添加事件,在过渡效果结束后再销毁组件 this.onClose(); // 调用外面js传入组件的方法 }, // 销毁所有组件 closeAll() { this.onCloseAll(); }, // 销毁组件方法 destroyElement() { this.$el.removeEventListener("transitionend", this.destroyElement); this.$destroy(true); }, },};</script> {{ fileName }} {{ fileSize }}关 闭
data中的自定数据的就相当于使用api传入的参数,当我们保存实例后,可以修改这个实例内的data,来达成实时更新的效果
多个实例使用案例参考
<script>import { notify } from "./components/DownLoadNotification/index.js";export default { name: "App", data() { return { instance1: null, instance2: null, instance3: null, }; }, methods: { show(index) { this[`instance${index}`] = notify({ fileName: `测试文件${index}.zip`, fileSize: "100mb", downLoadProgress: 0, downStatus: "success", }) }, addBtn(index) { this[`instance${index}`].downLoadProgress += 10 }, },}</script>显示实例1 增加进度 显示实例1 增加进度 显示实例1 增加进度
本文转载于:
https://juejin.cn/post/7243725204002209852
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
关键词:
记录--封装一个通过js调用的全局vue组件
世界讯息:Linux下常用命令
vim敲字如弹琴
我找到了阅读GitHub项目源码的最佳姿势,太舒服了!
世界短讯!玩游戏怎么选显示器?认准这几点准没错
男子发现捡回家两年的石头是文物 已无偿捐赠:网友惊叹
全球热推荐:国产GPU能否满足ChatGPT算力要求 景嘉微回应来了:还不行
环球观焦点:今年“蒸煮模式”咋提前了?专家解读
长城汽车给理想汽车起了个外号:“微博之王” 李想本人回应亮了 世界微动态
易宝支付总裁余晨出席《通用人工智能》新书发布会
腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?
天天热点评!ASP.NET Core MVC 从入门到精通之Identity入门
世界今热点:对建造清代故宫影响最大的工匠,原来是这一家人!
合资品牌的无奈!奥迪之后丰田挂牌:我们也有纯电动请往里进
苹果Mac OS被指碰瓷WinXP经典壁纸:还真不是玩笑
世界快资讯:年轻人压力较大 乘联会崔东树:中国车市还得指望中老年人
又一新能源车企被申请破产!曾被称为“四小龙”之一
珠碱商品报价动态(2023-06-17)
看点:只需4年 PCIe 7.0硬盘有望追上DDR5内存:性能狂飙
人不在学校却被抬到校长面前拨穗 全场欢呼鼓掌:不想让舍友留下遗憾
嫌榴莲太臭?可它这3个好处“香”到不行!
《闪电侠》豆瓣8分:超七成观众给出4星以上好评
生来上等命,前有贵人,后有靠山,注定好运不断的星座,日后必成大器
3999元起 蔚来天穹车尾帐发布:10分钟快速搭建“一室一厅”
腾讯、网易游戏公布端午未成年人限玩时间:高考后准大学生仍被限
天天快看:中国车第一次!领克03高性能特别版首发:原厂防滚架可上路
酷睿i9-13700H VS.锐龙9 7940H全面对比:AMD仍有很长的路要走
天天热推荐:布林肯冀访华改善中美沟通避免引发冲突 中方促美尊重核心关切
今日热门!分心驾驶致5人身亡 家属质疑10个气囊全未弹开 丰田销售:后方撞击不能触发
深圳邮局海关查获23只外来毒虫!内含秘鲁巨人蜈蚣 天天通讯
宣布对西安工厂投资43亿元:消息称美光也要向印度投资10亿美元
韩方曝出:福岛核污水超标2万倍
比小米便宜一半!TCL雷鸟Mini LED电视85英寸只要7599元 焦点简讯
理想L7/8/9魔毯空气悬挂2.0实测:防刹车点头来了 _环球滚动
GPT-4满分通过MIT本科数学考试!这套提示词火了
看热讯:10万出头续航505km 江淮钇为3上市:打的就是比亚迪海豚
不靠高精地图!小鹏汽车演示北京无图区智能辅助驾驶:稳如老司机_全球今亮点
Android-JNI开发概论-动态
鲍威尔_1937~_关于鲍威尔_1937~简述_消息
全球今日讯!华为NCA智能驾驶来了!余承东:超越特斯拉FSD 这15个城市率先体验
vivo X90s跑分出炉:165万安卓性能天花板!领先20万-全球实时
从泰山弃将到亚泰宠儿,莱昂纳多逆袭霸榜,机会总留给有准备的人-每日速递
软件开发人员必须阅读的20本书_每日速看
快资讯丨语音社交源码知识语音房间功能的实现
《安富莱嵌入式周报》第315期:开源USB高速分析仪,8GHz示波器开发, 600行C编写RISC-V内核,英特尔推出用于开发人员等宽字体,便携物联网监测器_
韩国出现地产危机房价暴跌近20%?可以“免费住”的全租房模式暗藏风险
网友吐槽“高考后还要被防沉迷” :腾讯游戏官方高情商回应
8粽+4咸蛋21元:五芳斋旗下端午礼盒大促
美司法部申请保护令动议,要求阻止特朗普公开机密文件
上周纯碱期价有所下跌
从《闪电侠》到《蝙蝠侠》
货车撞上奔驰反被奔驰车主请吃饭 对方生活不易:网友点赞
比亚迪杀进法拉利、兰博基尼老家:BYD ATTO 3、汉、海豚、海豹正式进军意大利|头条
村民深夜失足坠崖 酉阳民警紧急救援 环球头条
俄方称将重提“北溪”管道遭破坏事件调查话题
iOS 17淘汰iPhone 8、X等:苹果老机型贬值率激增-滚动
环球动态:张雪峰回应质疑:大学专业要选能吃上饭的 要为自己负责
【报资讯】6月16日基金净值:鹏华环保产业股票最新净值3.987,涨1.71%
每日聚焦:马云近况曝光:在东京教书 与大学生合影 与汪涵聚餐发福变胖
开始担心被“抢饭碗”了:越南打工人不加班逼急中国老板 不为钱放弃生活
焦点信息:1314玫瑰小镇魔法花园 1314玫瑰小镇登录
读数据压缩入门笔记06_上下文转换_速看
【环球新要闻】泡泡玛特4r出透卡什么意思 泡泡玛特几r出透什么意思
天天观热点:Polly简单使用
go语言list表
北京警方依法行政拘留冲入球场拥抱梅西的球迷
女子拆145个盲盒拒付款!父亲称其有精神病闹上法庭:结果出来了
每日观察!电影《消失的她》预售票房破千万:陈思诚监制 倪妮主演
广东暴雨积水成河:有人屋内钓鱼 有人"水上摩托"
每日播报!不再依赖进口 国产磁共振医疗装备重大突破:绰号“白胖子”
天天观点:未通过网络安全审查 禁止采购!美光宣布在中国投资超43亿元
6月16日基金净值:景顺长城远见成长混合A最新净值1.1679,涨2.43% 要闻速递
2023高考英语作文预测热门话题_2018热门话题新闻作文100字
每日看点!iso怎么转换为gho_怎样才能把ISO文件转换成GHO文件 1111
Kotlin协程-从理论到实战
常见WebShell的流量特征
今日报丨01. 组建知识星球服务体系
嵩山少林塔沟武校学费_嵩山少林塔沟武校
《云顶之弈》网页版云游戏上线:PC互通 手机点开就能玩
环球快资讯丨最美“小丑女”演女主!《芭比》真人电影国内定档:7月21日上映
环球今头条!玩家哭了!女子带100张《塞尔达传说:王国之泪》卡带入境被海关查获
一之濑拓实和小松奈奈第一次见面(一之濑拓实)_天天快消息
今日视点:美股盘初:Adobe涨约5%,维珍银河涨超45%
普通人也能太空旅行 我国将推出商业航天项目:最快5年后|全球要闻
世界时讯:阿里总裁谈马云近况:他在东京教书 很开心
资讯:奥运冠军苏翊鸣获得清华大学保送资格 发文感谢:18岁三个愿望都实现了
法官曼司亚:一起离婚案件她跟踪回访了12年
当前关注:聊聊Flink必知必会(四)
【世界快播报】Kotlin协程-从一到多
金科地产8.8亿元债券本息未按期偿付 持有人会议仍在表决中 新动态
向佐晒儿子周岁宴,现场紧搂郭碧婷秀恩爱,儿女露正脸都是高颜值_快资讯
江淮钇为3上市:最长续航600公里、8.99万元起_天天资讯
酷睿Ultra来了!Intel史上最混乱一代 还有马甲
谨慎下载 Win10 ISO镜像被黑客下马:攻击手法罕见_环球热消息
报道:博尔特4x100
LGV引理
【世界新要闻】Docsify on VPS,搭建最简个人博客
先正达集团IPO过会 沪市主板即将迎来全球农业龙头企业
今日热文:手握手的承诺 心贴心的服务_手握手
男孩玩氢气球砸到吹风机爆燃 妈妈被严重烧伤:画面触目惊心