当前位置: 首页 > 科技观察

可视化构建平台地图组件和日历组件方案选择

时间:2023-03-16 16:45:33 科技观察

可视化构建平台除了为用户提供简单便捷的操作方式外,还需要提供丰富的组件支持和组件扩展,以满足更多用户的业务需求。H5-dooring初期主要考虑的是用户使用的方便性,也就是尽量减少用户的操作成本,所以采用了智能布局,即库react-grid-layout。之前考虑过完全自由布局,也实现了一套自由布局方案(使用react-draggable和React-Resizable),但是提倡lessismore的设计理念,还是坚定走智能布局的道路。接下来笔者将介绍如何在H5页面编辑器中自定义开发自己的组件,以及如何开发让H5表现力更强的组件:地图和日历组件。如果对可视化拖拽平台的实现感兴趣,可以参考我之前的文章和github。更多lowcode和nocode技术实现和国内更新,稍后更新外部解决方案分析。演示效果实现自定义组件开发的流程作为一名前端工程师,我们肯定熟悉vue组件或者react组件的开发。对于一个可伸缩、可复用的组件,我们只需要做到以下几点就好了:语义化:组件命名可读性强,比如antd、element的组件风格复用-发布等价原则(REP):组件中的类要么可复用,要么不可复用公共重用原则(CRP):组件中的所有类都应该一起重用。如果组件中的一个类被重用,则组件中的所有类都应该被重用。通用封闭原则(CCP):组件中的所有类都对相同性质的更改封闭。同时不影响外部,即对修改关闭,但对扩展开放稳定抽象原则(SAP):组件的抽象层次应与其稳定性保持一致。基本上,任何组件的设计都会或多或少遵循以上原则,我们在实现自定义组件时,往往需要考虑内部和外部的抽象。我们在为Dooring定义自定义组件时,会分为以下几个步骤:组件的形状主要是组件暴露的属性和方法,可以实现用户级的配置,即vue/react组件的props.由于项目是用typescript写的,所以我们需要定义对应的ts类型来实现组件的健壮性和可追溯性。最后,我们将定义组件初始化样子(initshape),然后它是实现组件。这一步的好处是我们可以明确组件的边界,自然符合上面提到的组件设计原则。在上述过程中我们会生成如下三个文件:componet组件的实现代码,schema组件的shape和type模板组件,typemappingtemplate,开发一个日历组件。接下来,我们将实现拖放平台的日历组件。对于日历组件,我们直接使用Zarm的Calendar组件,封装成dooring的受控组件。我们可以将以下属性暴露给日历组件用户自定义:time日历范围显示的时间日历选择的时间范围,主要用于日程管理color日历的默认文字颜色selectedColor选中区域的颜色round日历圆角对应的视图如下:由于组件的实现只需要处理传入的数据,这里我们看简单的代码实现:importReact,{useState,memo,useEffect,useRef}from'react';import{Calendar}from'zarm';importstylesfrom'./index.less';import{ICalendarConfig}from'./schema';constCalendarCp=memo((props:ICalendarConfig&{isTpl:boolean})=>{const{time,range,color,selectedColor,round,isTpl}=props;//...return(/(0|6)/.test(date.getDay())}onChange={(value:Date[]|undefined)=>{setValue(value);}}/>

});exportdefaultCalendarCp;这是一个门组件的基本原型,然后我们看架构部分。这部分主要包括组件的类型定义和基本形状可编辑属性(editable),如下:TTextDefaultTypeData{;round:TNumberDefaultType;}exportinterfaceICalendarConfig{config:ICalendarConfig;}constCalendar:ICalendarSchema={editData:[{key:'time',name:'calendartime',type:'Text',placeholder:'格式如2020-01or2020-11'},{key:'range',name:'日历选择范围',type:'Text',placeholder:'格式如01-12(数字到数字)'},{key:'color',name:'文本颜色',type:'Color'},{key:'selectedColor',name:'selectedcolor',type:'Color'},{key:'round',name:'roundedcorner',type:'Number'},],config:{time:'2020-12',range:'05-08',color:'rgba(0,0,0,1)',selectedColor:'rgba(22,40,212,1)',round:0},};exportdefaultCalendar;如果我们要添加属性,只需要在这个文件中添加相应的属性和类型即可。模板主要是定义组件的分区和初始高度,代码如下:consttemplate={type:'Calendar',h:185,displayName:'calendarcomponent',};exportdefaulttemplate;有了以上三部分,我们就可以渲染一个画布中有可拖拽和可编辑的组件了。当然这部分还需要FormRender的帮助,后面会介绍。上面基本上实现了一个可拖动和可配置的日历组件。我们继续看地图Components。开发地图组件有了以上的组件开发经验,我们开发地图组件就非常方便了。地图组件我们这里使用@uiw/react-baidu-map,也就是百度地图的React版本。也可以使用高德地图。由于地图组件react-baidu-map需要提前阅读相应的文档,笔者在此不再一一介绍。让我们直接看看如何实现它。同样,我们也需要定义地图对外暴露的道具。笔者这里简单定义了几个可配置的属性:ak百度地图使用凭据,建议大家在生产环境中替换为自己所在位置的经纬度,这样可以快速定位到所在位置的地名,我们可以自定义设置如下图:基本代码实现如下:importReact,{memo}from'react';import{Map,Marker,Label,APILoader}from'@uiw/react-baidu-map';importstylesfrom'./index.less';import{IMapConfig}from'./schema';constMapcomponent=memo((props:IMapConfig)=>{const{ak,location,position}=props;return(
)});exportdefaultMapcomponent;最后,H5-Dooring可视化搭建平台还在更新中,主要更新如下:List组件增加搜索功能Icon组件增加链接交互功能,自定义文字、文字颜色、文字大小配置图表组件支持自定义第三方api接口,一键导入第三方数据源