可视化搭建平台的地图组件和日历组件方案选型

可视化搭建平台除了需要为用户提供简单便捷的操作方式之外, 还需要提供丰富的组件支持和组件扩展, 这样才能满足更多用户的业务需求.

在 H5-dooring 创建的初期主要考虑的方向是用户使用的便捷性, 即最大程度的降低用户操作成本, 所以采用了智能布局, 也就是react-grid-layout这个库, 之前考虑过完全的自由布局, 也实现了一套自由布局的方案(使用react-draggable和React-Resizable), 但是崇尚 less is more 的设计哲学, 还是坚定的走了智能布局的道路.

笔者接下来会介绍如何在 H5页面编辑器 中自定义开发自己的组件, 以及如何开发可以使H5展现力更强的组件: 地图和日历组件.

如果大家对可视化拖拽搭建平台的实现方案感兴趣, 可以参考我之前的文章和 github. 后续会更新更多lowcode和nocode的技术实现和国内外方案分析.

演示效果

实现自定义组件开发的流程

作为前端工程师, 我们对于开发vue组件或者react组件想必不会很陌生, 对于一个可扩展复用当然组件来说, 我们只需要做好以下几点就好了:

  • 语义化 : 组件命名可读性强, 比如antd, element的组件风格
  • 重用-发布等价原则(REP): 组件中的类要么都是可重用的,要么都不可重用
  • 共同重用原则(CRP): 组件中所有类应该是共同重用的,如果重用了组件中的一个类就应该重用组件中的所有类
  • 共同封闭原则(CCP): 组件的所有类对同一性质的变化是共同封闭的, 同时不会影响到外部, 即对修改是封闭的,但对扩展应该是开放的
  • 稳定抽象原则(SAP): 组件的抽象程度应该与其稳定程度保持一致

基本上任何组件的设计都会或多或少的遵循以上原则, 所以说我们在实现自定义组件时, 往往也需要考虑内外部的抽象.

我们定义Dooring的自定义组件时, 会分为以下几个步骤:

组件的shape主要是组件对外暴露的属性和方法, 可以实现用户层面的配置, 也就是vue/react组件的props, 由于项目使用typescript编写, 所以我们需要定义对应的ts类型, 来实现组件的健壮性和可溯源. 最后我们会定义组件初始化的样子(init shape), 然后才是实现组件, 这样的步骤好处是我们可以明确组件的边界, 自然贴合上面笔者说的组件设计原则.

以上流程我们会产生如下三个文件:

  • componet 组件的实现代码
  • schema 组件的shape和type
  • template 组件的类型映射模版

开发一个日历组件

我们接下来就来实现拖拽平台的日历组件. 日历组件我们直接采用zarm的Calendar组件, 将其封装成dooring的受控组件.

日历组件我们可以暴露如下props给到用户自行配置:

  • time 日历显示的时间
  • range 日历被选中的时间范围, 主要用来做日程管理
  • color 日历默认的文本颜色
  • selectedColor 选中区域的颜色
  • round 日历的圆角

对应的view如下:

由于组件的实现只需要处理传过来的数据, 这里我们看看简单的代码实现:

 
 
 
 
  1. import React, { useState, memo, useEffect, useRef } from 'react'; 
  2. import { Calendar } from 'zarm'; 
  3. import styles from './index.less'; 
  4. import { ICalendarConfig } from './schema'; 
  5.  
  6. const CalendarCp = memo((props: ICalendarConfig & { isTpl: boolean }) => { 
  7.   const { time, range, color, selectedColor, round, isTpl } = props; 
  8.   // ... 
  9.   return ( 
  10.      
  11.       
  12.         multiple={!!range} 
  13.         value={value} 
  14.         min={min} 
  15.         max={new Date(max)} 
  16.         disabledDate={(date:any) => /(0|6)/.test(date.getDay())} 
  17.         onChange={(value:Date[] | undefined) => { 
  18.           setValue(value); 
  19.         }} 
  20.       /> 
  21.     
 
  • }); 
  •  
  • export default CalendarCp; 
  •  这是一个dooring组件的基本雏形, 其次我们看看 schema 部分. 这一部分主要包含了组件的shape的类型定义和基本的可编辑属性(editable), 如下:

     
     
     
     
    1. export type TCalendarEditData = Array
    2. export interface ICalendarConfig { 
    3.   time: TTextDefaultType; 
    4.   range: TTextDefaultType; 
    5.   color: TTextDefaultType; 
    6.   selectedColor: TTextDefaultType; 
    7.   round: TNumberDefaultType; 
    8.  
    9. export interface ICalendarSchema { 
    10.   editData: TCalendarEditData; 
    11.   config: ICalendarConfig; 
    12.  
    13. const Calendar: ICalendarSchema = { 
    14.   editData: [ 
    15.     { 
    16.       key: 'time', 
    17.       name: '日历时间', 
    18.       type: 'Text', 
    19.       placeholder: '格式如2020-01或2020-11' 
    20.     }, 
    21.     { 
    22.       key: 'range', 
    23.       name: '日历选中范围', 
    24.       type: 'Text', 
    25.       placeholder: '格式如01-12(几号到几号)' 
    26.     }, 
    27.     { 
    28.       key: 'color', 
    29.       name: '文本颜色', 
    30.       type: 'Color' 
    31.     }, 
    32.     { 
    33.       key: 'selectedColor', 
    34.       name: '选中颜色', 
    35.       type: 'Color' 
    36.     }, 
    37.     { 
    38.       key: 'round', 
    39.       name: '圆角', 
    40.       type: 'Number' 
    41.     }, 
    42.   ], 
    43.   config: { 
    44.     time: '2020-12', 
    45.     range: '05-08', 
    46.     color: 'rgba(0,0,0,1)', 
    47.     selectedColor: 'rgba(22,40,212,1)', 
    48.     round: 0 
    49.   }, 
    50. }; 
    51.  
    52. export default Calendar; 

    如果我们想增加属性, 我们只需要在这个文件里添加对应的属性和类型即可.

    template主要是定义了组件的分区和初始高度, 代码如下:

     
     
     
     
    1. const template = { 
    2.   type: 'Calendar', 
    3.   h: 185, 
    4.   displayName: '日历组件', 
    5. }; 
    6. export default template; 

    有了以上三个部分, 我们要可以渲染出一个在画布中可拖拽, 可编辑的组件了. 当然这块还需要FormRender的帮助, 这块笔者后期会介绍.

    以上基本就实现了一个可拖拽可配置的日历组件, 我们接下来继续看看地图组件.

    开发地图组件

    有了以上的组件开发经验之后我们开发地图组件就非常方便了. 地图组件我们这里使用了@uiw/react-baidu-map, 也就是百度地图的React版本, 大家也可以使用高德地图.因为地图组件react-baidu-map 需要提前阅读对应的文档, 这里笔者就不一一介绍了, 我们直接来看如何实现.同样我们也需要定义好地图对外暴露的props, 笔者这里简单定义几个可配置的属性:

    如下图:

    基本的代码实现如下:

     
     
     
     
    1. import React, { memo } from 'react'; 
    2. import { Map, Marker, Label, APILoader } from '@uiw/react-baidu-map'; 
    3. import styles from './index.less'; 
    4. import { IMapConfig } from './schema'; 
    5.  
    6. const Mapcomponent = memo((props: IMapConfig) => { 
    7.   const { ak, location, position } = props; 
    8.   return ( 
    9.          
    10.            
    11.              
    12.                
    13.               
    14.                 content={location}  
    15.                 position={{ lng: position[0], lat: position[1] }}  
    16.                 style={{color: '#000', borderColor: '#06c', padding: '3px 10px', borderRadius: '6px'}}  
    17.               /> 
    18.              
    19.            
    20.         
     
  •       ) 
  • }); 
  •  
  • export default Mapcomponent; 
  •  最后

    目前H5-Dooring可视化搭建平台还在持续更新, 主要更新如下:

    当前文章:可视化搭建平台的地图组件和日历组件方案选型
    链接地址:http://www.hantingmc.com/qtweb/news11/414161.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

    猜你还喜欢下面的内容

    微信小程序知识

    分类信息网