摘要:一个系统中可能会有很多很多页面,但经过比较可能会发现有部分模块非常相似,有的模块差别非常大,无论是手动引入组件还是其他方式,都会带来不小开发以及测试量,为此我们想能不能通过碎片的形式将页面组合起来呢?
所谓的碎片主要分为两种
(资料图片)
(1)那种很细很基础的组件,比如我们经常用的一个输入框, 一个表格,一个echat图。
(2)带一定业务逻辑的复杂模块,比如日志展示组件,智能分析模块等。
试想下有了这两种页面是不是很多页面都能通过拖拽的形式就行拼装出来呢?
碎片千奇百怪,我们不可能一次引入所有组件,这样下次新增的时候又得修改代码。
这里我们使用动态注册的方式,如下所示:
toggle(info) { this.registerComponent(info.componentPath).then((Component) => { new Component({ el: `#${info.componentName}`, store: this.$store, router: this.$router, data: { customData: info.customData, }, }); }); }, registerComponent(path) { // eslint-disable-line const _import = require("../../utils/_importRegist"); return _import(path).then(component => Vue.extend(component.default)); },
动态引入之后呢,就是动态展示的问题,这里使用的是is关键字,这样的话任何组件,包括输入框等表单类的组件也能展示。
我们经常遇到的一些交互,大部分是由数据改变驱动的,比如联动、下钻。常见的是由于某个数据变化,触发回调,然后有了相应的操作,这边呢,因为组件的独立性,没有这种回调关系。那么是不是可以反过来想,每个组件都有自己的独立数据仓库,然后数据改变传递到仓库,然后每个独立组件都可以监听很多个仓库,任何一个改变可以触发相应的操作。
watch: { queryFormData(newVal, oldVal) { const newValOfJSON = JSON.parse(newVal); this.wathcFrom.forEach((item) => { if (JSON.stringify(newValOfJSON[item]) !== JSON.stringify(JSON.parse(oldVal)[item])) { this.doSomething({ ...newValOfJSON[item] }); } }); }, },
还有一些特殊事件我们可以用模版化的方式实现,也就是选择具体功能的函数模版,然后配置上去。当然这里还可以动态输入函数,然后用new Function去实现,但考虑到用户可能不会写这个函数,就暂时没这么去实现。
目前主要通过固定解析JSONSchema的模版函数去实现,当数据源接入的越来越多,这种函数模版就需要逐渐扩充。还有就是调取数据源需要的一些参数,参数无非分为两部分,固定参数(常量),和逻辑分析参数,
这块也是参考了非常多的系统后得出的适合当前项目业务的方案,类似的方案有操作数据库表的方式等。
出于安全原因,代码就不透露了。
碎片有了之后就需要一个容器来盛放,这里定义了一个统一入口组件来盛放。
这样会带来一些细节问题,如嵌套关系父组件套子组件,子组件套父组件的情况,这里采用类似路由懒加载,通过采用回调函数函数的形式引入组件可以解决这个问题。
const ContainBox = () => import("./ContainBox.vue");
还有就是当配置了多个页面,页面跳转势必带来组件被复用的问题,这里通过判断路由跳转,给组件绑定不同key的形式来解决。
比如我们配置给组建的文案肯定不是一层不变的,有时候随着联动事件触发,会发生一些相应的变化或者说一些逻辑关系的处理。这里我们可以采用类似于vue的模版去解析变量,比如解析:{{clientArea}}的数据。
templateMatch(str, queryArg) { // 模版匹配 let lineName = str; const reg = /\{\{(.+?)\}\}/g; if (reg.test(lineName)) { lineName = lineName.replace(reg, (...args) => this.getValue(args[1], queryArg)); } return lineName; },
getValue(val, data) { return val.split(".").reduce((data, currentVal) => { if (!data[currentVal]) { return ""; } return data[currentVal]; }, data); },
然后还有一些技术细节就不再赘述,比如使用mix合并公用代码、new Function等。
目前定制化需求,主要是通过手动输入一些定制化函数,然后页面动态进行解析。
八、用户配置界面
用户配置界面是通过用户拖拽生成的,大小等是通过grid网格布局的形式,让用户随意拖动摆放
通过配置界面生成JSONSchema 用户所有的配置数据都写入其中,然后通过前面的步骤进行解析。
标签: JavaScript
仓储物流“成渝圈”如何乘势而上? 12月3日,连接昆明和万象的中老铁路全线开通运营,被惠及的显...
两件西周青铜簋时隔三千年成功配对 考古工作者介绍,这个铜簋的盖、身分别时隔40余年出土,纹饰...
“医保砍价”不是一个人在战斗 晁星 “我眼泪都快掉下来了”“每一个小群体都不该被放弃”…...
“购物成瘾”真的是一种病 刘艳 牛雅娟 本周日即将迎来“双十二”促销季,很多人又开始摩拳...
因迷恋山间风景,一男子在甘孜州稻城县海拔4000多米的无人区迷失方向,随后与同伴失联。12月的稻城...
嫌疑人DNA信息比中后,成都市公安局刑侦支队技术处DNA实验室民警白小刚一下坐在凳子上,恍惚迟疑间...
一批反映南京大屠杀历史的新书发布 新华社南京12月7日电(记者邱冰清、蒋芳)“以史为鉴,开创未来...
我在现场·照片背后的故事|电影《亲爱的》里面没有的结局,在我眼前“上映” 12月6日,在深圳市...
冥想?泡脚?不如听听助眠音乐 晚上睡不着,白天睡不醒,成为最贴合都市人群的“睡眠画像”。随...
养老话题 老年教育面临缺口 “终身教育”潜力无限 【现实挑战】“新老年”群体愿意在培养兴...
孙海洋被拐14年儿子如何找到的? 警方侦办另一宗拐骗儿童案时发现线索,通过人像比对、DNA确认找...
北京天文馆、圆明园将对未成年人免费开放 12月6日,北京天文馆发布通知称,12月8日起试行对未成...
今年全国粮食总产量再创新高 连续7年保持在1 3万亿斤以上 根据对全国31个省(区、市)的抽样调...
斑块软的很危险 硬的就无碍? 血管里的“垃圾”分类 赶快学起来! 一项最新研究显示:中国...
诺西那生钠注射液大幅降价 聚焦医保谈判背后脊髓性肌萎缩症家庭 医保目录公布那天 好多家长都...
抖音“窗花剪剪”遭抄袭 被判获赔20万元 法院认为“窗花剪剪”的这种表达方式理应受到《著作权...
公安机关近日侦破3起拐卖儿童案件 失散十几年 3组家庭终于团圆了 北京青年报记者12月6日从公...
2021年度十大网络用语发布 本报讯(记者 路艳霞)作为年度“汉语盘点”活动最具网络特色的组成部...
北京天文馆向未成年人免费开放 本报讯(记者 牛伟坤)北京天文馆对票价免费及优惠政策作出调整:1...
2021北京百个网红打卡地发布 本报讯(记者 李洋)2021北京网红打卡地推荐榜单昨晚正式发布。自然...