OpenDataV低代码平台新增组件流程
前天我们发布了OpenDataV低代码开源框架,有很多友友留言想要了解怎么增加组件,为了方便大家快速上手,马上趁热发布一篇。
OpenDataV计划采用子库的方式添加子组件,即每一个组件都当做一个子库,子库有自己的依赖,而项目本身的依赖只针对框架,因此每一个组件我们都当做一个子库来开发。下面我带着大家一步步详细地开发一个数字展示组件。 创建组件目录和文件进入组件库目录下
所有的可拖拽组件都存放在 src/resource/components 目录下cd src/resource/components 根据组件名称创建目录
默认组件目录是以组件的名称命名,当然也可以根据自己的要求命名,组件可以放在 components 目录下,也可以放在其子目录的目录下。mkdir DigitalText 创建组件所需的固定文件
每个组件必须的文件有vue文件 xxx.vue 、配置文件config.ts 、导出文件index.ts ,每个文件有自己的用处,vue文件不用说了是组件渲染的主体,导出文件名称固定为index.ts ,主要是导出组件的信息给外部引用,配置文件主要是在编辑页面右侧展示的配置项,这个我们后面再详述。所以这里我们需要创建三个文件:DigitalText.vue、config.ts、index.ts
以上我们就创建好了组件所需的文件,下面就需要做组件的初始化了 初始化组件文件
因为我们的组件都是以子库的方式引入,所以需要进行包的初始化,执行以下命令 cd src/resource/components/Text/DigitalText npm init
这里使用 npm 初始化包会让我们选择填写部分数据。
下面我们先初始化一下组件文件 DigitalText.vue ,先初始化最简单的组件数据 数字展示
然后我们要初始化组件的配置文件 config.ts import { ComponentGroup, FormType } from "@/enum" import type { PropsType } from "@/types/component" import { BaseComponent } from "@/resource/models" export const componentName = "Digital" class DigitalComponent extends BaseComponent { constructor(id?: string, name?: string, icon?: string) { super({ component: componentName, group: ComponentGroup.TEXT, name: name ? name : "数字文本", id, width: 100, height: 30, icon }) } } export default DigitalComponent
这里要说明的点: componentName 是组件在项目中的注册名称,因此必须保证唯一,group 是给组件分组,这里的分组主要是展示在组件拖拽页面,其类型的ComponentGroup 是固定好的,可以自己增加,展示位置如下:
name 是组件在拖拽页面上显示的名称,width 和height 是组件拖拽到画布上显示的初始大小
配置完组件后数据后,就可以配置导出文件 index.ts 了,主要是导出组件名、组件对象和配置项。import DigitalTextComponent, { componentName } from "./config" export default { componentName, component: () => import("./DigitalText.vue"), config: DigitalTextComponent }
初始化到这一步,我们的组件已经可以在编辑页面正常使用了,看一下效果:
在右边的编辑页面我们看到有 样式 和属性 ,所有的组件都包含基础样式位置大小 ,包括组件的上下边距和宽高,属性包含公共属性,其中组件 和组件ID 无法修改,主要是展示来看的,名称 可以修改,名称属性主要是展示在图层上,修改名称后图层上会响应的显示修改后的名称。
这是最基础的组件,只能展示固定数据,不能进行任何配置,下面我们要做组件的配置项。 组件配置项样式配置
作为文字显示组件,最基础的字体相关属性配置应该要有,比如 字体、字体颜色、字体大小、字体宽度 ,配置项依然是在配置文件中添加,继承自基础组件类的私有属性_style class DigitalTextComponent extends BaseComponent { constructor(id?: string, name?: string, icon?: string) {......} _style: PropsType[] = [ { label: "字体设置", prop: "font", children: [ { prop: "color", label: "颜色", type: FormType.COLOR, componentOptions: { defaultValue: "skyblue" } }, { prop: "fontSize", label: "字体大小", type: FormType.NUMBER, componentOptions: { defaultValue: 20 } }, { prop: "fontWeight", label: "字体宽度", type: FormType.FONT_WEIGHT, componentOptions: { defaultValue: 200 } }, { prop: "fontFamily", label: "字体", type: FormType.FONT_STYLE, componentOptions: { defaultValue: "Arial" } } ] } ] }
样式配置的格式已经定义好了,其中需要注意的是所有 children 下的子项中prop 必须是html 元素的css 属性,具体的css 属性名称并不是我们在style 文件中填写的,而是在js 中对应的名称,这个可以在网上搜索:css3 中文手册 ,类似如下:
我们再详述一下各配置项的意义: label:配置显示的分组名 prop:唯一的属性区分,此属性要与同级别中的其他配置不同 children:此属性组下面的配置项 label:每个属性的名称prop: css 属性值type:属性编辑时显示的组件类型,目前可显示的组件是固定的,类型都定义在 FormType 中componentOptions:属性对应的配置项,不同类型的组件有不同的配置项,具体可以在 src/types/component.d.ts 中查看定义,所有配置都有defaultValue 配置,作为属性初始化时的默认值
配置完样式后,我们在编辑页面看一下效果:
搞清楚了样式的配置,下面我们再说说属性的配置,属性配置与样式配置格式一致,有一些小细节需要注意。 属性配置
属性配置是继承私有变量 _prop ,配置格式与样式相同,我们这里配置一个示例属性:class DigitalTextComponent extends BaseComponent { constructor(id?: string, name?: string, icon?: string) {......} _prop: PropsType[] = [ { label: "数据配置", prop: "dataconfig", children: [ { prop: "data", label: "数据", type: FormType.NUMBER, componentOptions: { defaultValue: 100000, max: 99999999, min: 0 } } ] } ] }
格式这里就不解释了,这里我们用到了数值类型,因此可以配置最大最小值。
接下来就是要在 vue 文件中使用属性配置了,属性不像样式,样式是html 元素本身就支持的,因此只要我们配置好,就可以生效了,但是属性是组件专有的,什么属性要产生什么效果全凭我们自己书写逻辑,因此配置好属性我们只会在编辑页面看到属性展示和配置,但是实际配置后是没有任何效果的,具体效果我们在vue 中实现。属性使用
首先我们要添加一个类型定义文件,因为 ts 最基础的优势就是类型提示,而我们封装的组件基类是通用的,因此需要在每个组件中使用自己的属性类型定义,定义如下:// DigitalText/type.ts export interface DigitalType { dataconfig: { data: number } }
为了准确地进行提示,类型定义必须和属性配置一致,具体来讲就是 children 下面的prop 作为属性值,children 外面的prop 作为属性键,可以对比一下type.ts 中的配置和_prop 的配置。
组件的配置信息是通过外部传入的,所以所有组件都必须接收外部数据,我们已经定义好了固定的格式 const props = defineProps<{ component: DigitalTextComponent }>()
组件相关的所有信息都将通过 component 传入进来,为了监听属性变化和类型提示,我们封装了一个hook,减少每个组件中通用的处理,useProp 的使用如下:const propChange = (prop: string, key: string, value: number) => { console.log(prop, key, value) } const { propValue } = useProp(props.component, propChange)
useProp 接收三个参数,一个是component ,主要是为了添加类型提示,所以这里也传入了一个泛型定义,就是我们在type.ts 中定义的类型,另外两个参数是属性变化回调函数和样式变化回调函数。一般情况下我们只需要处理属性变化回调,样式变化是自动生效的,所以基本上不用处理,如果有特殊需求才需要。属性变化回调函数中有三个参数,prop 对应的是属性配置中外层的prop 值,key 对应的是属性配置中children 中的prop 值,而value 就是属性变化的值。
最终我们的属性处理结果如下: {{ data }}
看一下页面上的效果:
上面我们用了属性回调去处理值变化响应,实际上还有其他的方式可以处理,我们要明白属性回调的根本需求是什么?主要就是为了编辑了对应的属性后,我们在组件内能监测到变化反馈到显示上。相同这一点,可用的方法就多了。 直接使用 props 传递的属性值在template 中渲染数据 {{ propValue.dataconfig.data }} 属性变化回调的另一种用法 {{ data }}
属性变化回调接收任何参数,我们可以选择接收参数,也可以不接收参数,在一些配置项比较多的组件中,我们不想在属性回调中去一个一个判断变化的属性,那么就可以使用这种方式,在这种方式中我们只是把属性回调作为一个通知,即通知我们属性发生变化了,而我们不关心哪一个属性发生了变化,把所有的属性都修改一遍即可,虽然听起来比较麻烦,但是在一些复杂组件中确实很有作用。在这里我们要明白,只要属性发生了变化,那么 prop 中的数据也必定发生了变化,所以我们随时取prop 中的数据它都是最新的。总结
到这里,一个组件的整个添加过程就讲完了,根据目前的开发进度来看,基本上所有的部分都讲到了,如果有人在使用过程中发现了什么问题或者有哪些地方不够清楚的,可以在项目的issue中提,也可以通过其他方式反馈。
吃玉米浪费这2个地方,等于丢了整根玉米的精华玉米是餐桌上常见的一种粗粮,不管是直接蒸煮,还是炖汤炒菜都很美味。而且,玉米的营养价值和保健作用也很高,还被誉为长寿食品黄金主食。常吃玉米,收获5大好处1通便减肥玉米中含有大量的膳
40多岁女性,头顶多白发,说明老了?白发能不能转黑?导语人之所以会出现白头发,其实大多是和身体里激素的分泌有关。激素分泌正常,内分泌趋于稳定,身体就会产出足够多的黑色素,供给毛囊生长,所以正常人的头发会呈现出黑色。但如果反之,身体激
足坛五大统治力爆棚联赛冠军,个个一骑绝尘君临天下这个统治力应该是两方面的综合,一个方面是稳定性,一个方面跟第二名的积分差距,就比如一名马拉松冠军,全程孤独地领跑,孤独地冲线,第二集团的十几个对手们被甩地连冠军的影子都看不到,这叫
以二战日军的战斗力,出现在欧洲战场会是怎样?以二战日军的战斗力,出现在欧洲战场会是怎样的这个问题让我想到年轻时玩的游戏欧陆战争3,有个关卡日本打欧洲,非常难,每次走陆路,按顺序先打俄罗斯,要面对大量敌军,次次都干不过。后来请
扩军!两支NBA球队主场确定北京时间1月6号,NBA常规赛正在火热进行中,参赛各队都在为拿到更靠前的战绩努力中,希望能拿到总决赛舞台的入场券,比赛因此愈加精彩激烈,吸睛无数。今天联盟迎来12场对决,其中篮网对
C罗的面子都不给,曼联更衣室大乱,媒体揭露球队内部混乱曼联的问题已经非常严重了,这已经不是一个人就能够解决的了,在曼联还没有明确的阐述球队的现状,不过媒体已经有了自己的猜测,从一些在球场上的表现来看,曼联的问题已经掩盖不住了,朗尼克刚
虎年兽设定首曝!1。19魔域五虎神将勇猛来袭双旦齐齐来临,虎啸呼之欲出!2022虎年将至,魔域虎年兽也即将震撼登场。虎年全新冒险即将开启,亚特大陆的勇者们需要更强力的帮手。据官方爆料,这次的虎年兽可不一般,鼎鼎大名的五虎将将
酒店水床有何好处?为何深受情侣喜欢?主要有这三点原因酒店相信很多人都住过,你知道酒店有水床吗?为什么很多人,尤其是情侣如此喜爱入住水床房间呢?(此处已添加小程序,请到今日头条客户端查看)原因有如下三点。实际上,水床很早就应用在酒店行
酒店里的单人床为什么是两个枕头呢?嗨喽!大家好我是峰大叔。出差旅游总是难免住酒店,但奇怪的是,无论在哪家酒店,明明是单人房,还要放两个枕头。刚刚看到这的单身朋友是不是在心里窃窃私语,这是为什么呢?捂脸我们都知道枕头
凭什么不是夫妻关系,也可以住酒店一间房?前台谁规定的不能?相信很多人都会说不是夫妻关系,不能住在同一间客房,但是前台表示,只要遵守这几点是可以的。(此处已添加小程序,请到今日头条客户端查看)现如今,随着国民生活水平的提高,越来越多的国民开
中国股市氢能源行业最具爆发潜力的龙头股名单一览!收藏氢能源优势首先先给大家讲讲,什么是氢能源?氢能源是一种二次能源,通过一些特殊的方法将它制取的,同时氢能源也是一种可以再生的资源,在绿色环境这块占据了很大的优势,如果能回收利用工程废
说说我们教科书中的矛盾问题,把我整蒙圈了记得以前学习地理时学过大陆漂移说,说我们所在的大陆本来是连接在一起的,经过两亿年的漂移变成了现在这个样子。最近喜欢看科学探索这节目,科学家在帕米尔高原找到了许许多多远古海洋生物的化
苹果的虎年logo,太喜庆了每逢新年都少不了品牌们推出新年限定款这不,眼瞅着2022虎年春节就要到了苹果就推出了一个虎年限定logo虎年logo依旧是以被咬了一口的苹果为原型将外形与老虎元素相结合极简的线条绘
远程开机远程桌面一条龙,向日葵开机插座C1Pro开箱体验因为工作需要,我偶尔会远程访问公司里的办公电脑,通过向日葵远程控制软件,可以很方便地远程进行文件的调取和文稿发布,这样的工作模式一直沿用至今,工作效率也得到了公司认可。只是近期公司
华为Mate50Pro渲染图再次激活鲶鱼效应,也是iPhone13最大威胁虽然华为Mate50Pro迟迟没有发布,但是已经有媒体爆料,华为Mate50Pro会延期但是不会迟到,而且由于芯片紧张的原因,华为的两大旗舰型号,P系列和Mate系列将会变成年度发
王者荣耀S26好友列表优化升级,杜绝恶意出装,新皮肤原画官宣2022年王者峡谷迎来了千色云中赛年,通过官方发布的云中英雄团预告获知,今年一共有三位新英雄登场,这将为英雄数量不多的云中区域注入了新血液。而新赛季的首位开场英雄便是来自云中繁华之
1月6日正式服抢先服停机更新S26正式开启2022年1月6日000730正式服抢先服停机更新。(更新福利60钻石60铭文碎片)一新英雄暃上线正式服二英雄调整(一)英雄品质升级雅典娜(二)12位英雄调整1。云中君2。项羽3。
王者荣耀上分的毕生所学你现在玩王者荣耀是不是还是上不去分?是不是感觉上分困难?是不是遇到的队友都特别坑?别急,现在我来教你读完这篇笔记,我保证你对游戏的理解高一个层次玩游戏想赢就要靠自己带飞,如果你一直
中国唯一上榜2022十大最佳旅行地区的边陲小城本文来源几何民宿最近,旅行圣经LonelyPlanet公布了2022年最佳旅游目的地。分别包含了十大最佳旅行国度十大最佳旅行地区以及十大最佳旅行城市。中国西南的一座边陲小城不仅杀出
巨无霸中国移动今日上市!是否破发成焦点中新经纬1月5日电(付健青)2022年开市第二天(1月5日),巨无霸中国移动正式回归A股。募资额或创十余年新高,净利润可排A股前十2021年12月22日,中国移动开启进行网下网上申
新华全媒中国天眼取得系列重要科学成果1月5日,在中科院国家天文台举行的新闻发布会现场。新华社记者金立旺摄1月5日,中国科学院在中科院国家天文台举行新闻发布会,发布中国天眼(FAST)高质量开放运行取得的系列重要科学成
从马丘比丘了解中国的朋友秘鲁文明(Civilization)一词源于拉丁文Civis,意思是城市的居民,引申含义指一种先进的社会和文化发展状态。而文明是一款90年代诞生的回合制历史策略游戏。玩家只需一只手,就