低代码框架初步搭建

168 阅读1分钟

前置

  • npm install vuedraggable@2.24.3
  • Vue2

以下代码

<div class="myDraggable">
        <a-card class="myDraggable-left">
            <draggable :group="{name: 'dragGroup', pull: 'clone', put: false}" :sort="false" v-model="basicFields"
                element="ul" :clone="handleFieldWidgetClone">
                <transition-group tag="div" class="form-widget-list">
                    <li v-for="(item, i) in basicFields" :key="i" class="container-widget-item">
                        <span>{{widgetLabel[item.type]}}</span>
                    </li>
                </transition-group>
            </draggable>
        </a-card>
        <a-card class="myDraggable-content">
            <div class="operate">
                <span @click="clearFormWidget"><a-icon type="delete" /> 删除</span>
                <span @click="previewForm"><a-icon type="eye"/> 预览</span>
            </div>
            <a-form-model class="full-height-width" :labelAlign="formConfig.labelAlign" :layout="formConfig.layout" 
                v-bind="formItemLayout" :class="formConfig.layout == 'horizontal' ? 'flex-form' : '' ">
                <p class="no-widget-hint" v-if="!designer.widgetList.length">请从左侧列表中选择一个组件, 然后用鼠标拖动组件放置于此处.</p>
                <draggable v-bind="{group:'dragGroup', ghostClass: 'ghost', animation: 100}" 
                    v-model="designer.widgetList" 
                    handle=".drag-handler"
                    @end="onDragEnd" @add="onDragAdd" @update="onDragUpdate" :move="checkMove"
                >
                    <transition-group name="fade" tag="div" class="form-widget-list">
                        <template v-for="(widget, index) in designer.widgetList">
                            <component :is="getWidgetName(widget)" :key="widget.id" :field="widget" :designer="designer" 
                            :parent-list="designer.widgetList" :index-of-parent-list="index" :formConfig="formConfig"></component>
                        </template>
                    </transition-group>
                </draggable>
            </a-form-model>
        </a-card>
        <a-card class="myDraggable-right">
            <a-tabs default-active-key="1">
                <a-tab-pane key="1" tab="表单属性">
                  <formSetting :formConfig="designer.formConfig"></formSetting>
                </a-tab-pane>
                <a-tab-pane key="2" tab="组件属性">
                    <formEditor :designer="designer" :formConfig="designer.formConfig"></formEditor>
                </a-tab-pane>
              </a-tabs>
        </a-card>
        <a-modal title="预览" v-model="showPreviewDialogFlag" v-if="showPreviewDialogFlag" width="850px">
            <VFormRender :form-json="formJson" :designer="designer"></VFormRender>
        </a-modal>
    </div>
  • 其中 basicFields 为左边组件栏目
  • 中间为展示栏,通过draggable绑定一个数组展示左侧的托到中间的数组,本质上是通过循环去遍历动态组件,然后根据左侧的类型展示组件
  • 右侧其实也是组件进行遍历展示的,其中表单属性是一个a-form表单,组件属性是动态组件,和中间栏渲染方式类似。
  • draggable需要注意的是v-bind属性中的group,这个是进行分组,如果两个值设置不一样,则draggable不会互相拖拽。

展示图

1698897006620.png