低代码平台表单设计系统技术分析(实战二)

0 阅读1分钟

第二篇:表单组件体系设计与实现

上一篇我们分析了低代码平台表单设计系统的整体架构,这一篇将深入探讨表单组件体系的设计与实现。

1. 组件类型体系

该低代码平台设计了丰富的表单组件类型,通过 formDefine.js 定义了每种组件的结构和默认属性。

组件类型分类:

2. 组件视图渲染系统

组件的渲染通过 FormDesignView 组件实现,采用动态组件的方式根据组件类型渲染对应的视图。

<template>
  <el-col :span="fixGridOptions.includes(item.type) ? 24 : finalGrid">
    <div class="form-design-view" @click.stop="widgetSelect">
      <el-form
        :model="form"
        :label-width="formData.config?.labelWidth + 'px'"
        :label-position="formData.config?.labelPosition"
      >
        <!-- 渲染组件 -->
        <div class="colwrapper text-overflow">
          <div class="item-wrapper">
            <el-form-item
              :label-position="formData.config?.labelPosition"
              :required="item.isRequired"
            >
              <!-- 组件标签 -->
              <template #label>
                <!-- 标签内容 -->
              </template>
              
              <!-- 省略 -->      
              
              <!-- 动态渲染组件视图 -->
              <template v-if="item.type === FORM_TYPE.TEXT">
                <TextView v-model:data="item.value" :item="item" :mode="FORM_MODE.DESIGN" />
              </template>
         
              <!-- 其他组件类型... -->
            </el-form-item>
          </div>
          
          <!-- 组件操作 -->
          <div v-if="isShowLabel">
            <ActionMask
              :element="item"
              :formData="formData"
              v-if="chosenItem.itemId === item.itemId"
              :parentItem="parentItem"
            />
          </div>
        </div>
      </el-form>
    </div>
  </el-col>
</template>

组件视图渲染流程:

  • 根据组件类型选择对应的视图组件
  • 传递组件配置和模式(设计模式和运行模式)
  • 应用表单级别的布局设置(如标签宽度、位置)
  • 显示组件的操作掩码(当组件被选中时)

3. 组件配置系统

组件的配置通过 FormDesignConfig 组件实现,根据组件类型动态加载对应的配置组件。

<template>
  <div class="form-design-config">
    <el-form label-position="top">
      <component
        :key="item.itemId"
        :is="dynamicComponent"
        :item="item"
        :passParam="passParam"
        v-bind="$attrs"
      />
    </el-form>
  </div>
</template>

<script setup>
import { xxx } from '@/utils/util'
import centreBus from '@/utils/eventBus'

const props = defineProps({
  item: { type: Object },
  formData: { type: Object }
})

 // 省略  
</script>

配置组件示例 - TextConfig:

<template>
  <div class="form-design-config">
    <!-- 组件标题输入 -->
    <TitleInput :item="item">
      <template #label-extra>
        <!-- 组件类型切换 -->
      </template>
    </TitleInput>

    <!-- 描述信息 -->
    <el-form-item v-if="specialShow">
      <WangEditor v-model:valueHtml="item.desc"></WangEditor>
    </el-form-item>

    <!-- 其他属性配置... -->
  </div>
</template>

配置系统特点:

  • 动态加载 :根据组件类型动态加载对应的配置组件
  • 分层配置 :从基础属性到高级属性,层次清晰
  • 实时预览 :配置变更实时反映到画布中的组件
  • 智能联动 :某些配置项会根据其他配置的变化而变化

4. 组件间通信机制

组件间通信主要通过以下方式实现: 

 1. 事件总线 :使用 eventBus 实现跨组件通信

// 发送事件
centreBus.emit('passParamToConfig', resetParam)

// 监听事件
centreBus.on('passParamToConfig', handleParam)

2. Provide/Inject :实现跨层级组件通信

// 提供数据
provide('formData', props.formData)

// 注入数据
const switchForm = inject('switchForm')

3. Props/Events :父子组件间通信

// 父组件传递props
<FormDesignView
  @on-widget-select="widgetSelect(element)"
  :item="element"
  :chosenItem="currentItem"
  :formData="formData"
></FormDesignView>

// 子组件触发事件
const emit = defineEmits(['on-widget-select'])
const widgetSelect = (e) => {
  e.preventDefault()
  emit('on-widget-select')
}

5. 组件扩展性设计

(1) 组件注册机制 :通过 getTheComponent 函数动态加载组件

const getTheComponent = (componentName, type) => {
  // 根据类型和名称动态导入组件
  // ...
}

(2) 组件类型定义 :通过 formDefine.js 集中管理组件类型定义

  • 新增组件只需在 formDefine.js 中添加组件定义
  • 为新组件创建对应的视图和配置组件

(3) 配置项扩展 :每个组件可以根据需要定义自己的配置项

  • 基础配置(如标签、描述、是否必填等)
  • 特有配置(如日期格式、选项列表等)

(4) 组件切换机制 :支持组件类型间的切换

const switchFormComponent = (list, currentItem, targetType, callback) => {
  // 实现组件类型切换逻辑
  // ...
}

6. 技术亮点 

  • 统一的组件接口 :所有组件都遵循相同的数据结构和生命周期
  • 模块化设计 :每个组件的视图和配置都独立封装
  • 动态组件加载 :根据组件类型自动选择对应的视图和配置 
  • 响应式配置 :配置变更实时反映到组件视图
  • 丰富的配置选项 :每个组件都有详细的配置项 
  • 组件间的智能联动 :支持组件间的数据联动和依赖关系

7. 优化建议

(1)组件模板优化 : 

  • 使用 v-for 和动态组件简化 FormDesignView 中的模板代码
  • 提取重复的配置项为公共组件

(2)性能优化 :

  • 对于复杂组件,使用 v-memo 或 v-once 减少不必要的渲染
  • 实现配置项的懒加载,减少初始加载时间

(3)可维护性优化 :

  • 建立组件配置的统一规范
  • 添加组件文档和类型定义
  • 实现组件测试用例

(4)性能优化 :

  • 设计插件系统,支持第三方组件的集成
  • 实现组件模板和预设配置

8. 总结

  • 该低代码平台的表单组件体系设计具有以下特点:
  • 丰富的组件类型 :覆盖了几乎所有常见的表单场景
  • 灵活的配置系统 :每个组件都有详细的配置选项
  • 统一的架构设计 :所有组件遵循相同的设计模式
  • 良好的扩展性 :易于添加新组件和功能
  • 优秀的用户体验 :可视化配置和实时预览 

下一篇预告 :《拖拽功能与布局系统》,将详细分析表单设计中的拖拽功能实现和布局系统设计。