根据组件类型与条件动态添加下拉框及选项

前言

本次在做低代码平台时,遇见了一个稍微有些复杂的业务场景,需求描述:

  1. 根据用户拖拽表单生成的JSON数据(本次采用了FormGenerator去生成JSON数据),生成对应的所有组件的下拉列表,并在流程图的边(节点连接线)上添加条件判断。
  2. 当用户点击流程图的边时,生成该边上对应的所有组件的下拉列表,在点击某个组件的选项后,生成对应组件的下拉列表组件,在用户取消选择后,对应组件的下拉列表组件随之消失。
  3. 针对不同组件对应的下拉列表,要求有不同的条件判断,例如:数字类型的需要有范围选择、大小判断、为空不为空,等条件;文本组件有包含不包含,等条件。
  4. 当用户选择后,自动保存到当前边对应的JSON数据,若用户的选择无效,则不保存。
  5. 要求能够回显用户选择的数据,即点击不同边时,回显该边上JSON对应的所有下拉列表组件。

经过梳理后,其实逻辑看起来也不是特别复杂,不过当时确实是有点被难倒了,主要原因就是一些细节性的问题没有考虑到,然后流程图也需要去学习如何操作,时间上有些紧,同时也在思考如何写能够更便于维护。其次就是没有一个清晰的该处业务的流程思考,不过后来捋了捋也就差不多啦,所以说三思而后行啊。

三思而后行:多思考几遍,自己又觉得自己行了哈哈

Logicflow和FromGenerator就不多说了,虽然也有点坑,但都是轮子,主要记录下这块业务场景如何实现的。

组件展示

  1. 包含所有组件的下拉列表
    在这里插入图片描述
  2. 对应组件的下拉列表组件
    在这里插入图片描述
  3. 根据条件改变输入形式
    在这里插入图片描述

在这里插入图片描述

具体实现

JSON数据处理

处理JSON,不得不提一嘴ES6结构赋值,属实是属性提取的利器。
原JSON大概长这个样子,为了区别不同类型的组件,和表单那边的小伙伴约定了两个字段,tag用于区分组件输入框的类型,typeNumber用于区分下拉列表内容有哪些

{
   
  "fields": [
    {
   
      "__config__": {
   
        "label": "单行文本",
        "labelWidth": null,
        "showLabel": true,
        "changeTag": true,
        "tag": "el-input",
        "tagIcon": "input",
        "required": true,
        "layout": "colFormItem",
        "span": 24,
        "document": "https://element.eleme.cn/#/zh-CN/component/input",
        "regList": [],
        "formId": 101,
        "renderKey": 1649927471934,
        "typeNumber": 0
      },
      "__slot__": {
   
        "prepend": "",
        "append": ""
      },
      "placeholder": "请输入单行文本",
      "style": {
   
        "width": "100%"
      },
      "clearable": true,
      "prefix-icon": "",
      "suffix-icon": "",
      "maxlength": null,
      "show-word-limit": false,
      "readonly": false,
      "disabled": false,
      "__vModel__": "field101"
    },
    {
   
      "__config__": {
   
        "label": "多行文本",
        "labelWidth": null,
        "showLabel": true,
        "tag": "el-input",
        "tagIcon": "textarea",
        "required": true,
        "layout": "colFormItem",
        "span": 24,
        "regList": [],
        "changeTag": true,
        "document": "https://element.eleme.cn/#/zh-CN/component/input",
        "formId": 102,
        "typeNumber": 1,
        "renderKey": 1649927472786
      },
      "type": "textarea",
      "placeholder": "请输入多行文本",
      "autosize": {
   
        "minRows": 4,
        "maxRows": 4
      },
      "style": {
   
        "width": "100%"
      },
      "maxlength": null,
      "show-word-limit": false,
      "readonly": false,
      "disabled": false,
      "__vModel__": "field102"
    },
    {
   
      "__config__": {
   
        "label": "级联选择",
        "showLabel": true,
        "labelWidth": null,
        "tag": "el-cascader",
        "tagIcon": "cascader",
        "layout": "colFormItem",
        "defaultValue": [
          1,
          2
        ],
        "dataType": "dynamic",
        "span": 24,
        "required": true,
        "regList": [],
        "changeTag": true,
        "document": "https://element.eleme.cn/#/zh-CN/component/cascader",
        "formId": 111,
        "typeNumber": 9,
        "renderKey": 1649942215947
      },
      "options": [
        {
   
          "id": 1,
          "value": 1,
          "label": "选项1",
          "children": [
            {
   
              "id": 2,
              "value": 2,
              "label": "选项1-1"
            }
          ]
        }
      ],
      "placeholder": "请选择级联选择",
      "style": {
   
        "width": "100%"
      },
      "props": {
   
        "props": {
   
          "multiple": false,
          "label": "label",
          "value": "value",
          "children": "children"
        }
      },
      "show-all-levels": true,
      "disabled": false,
      "clearable": true,
      "filterable": false,
      "separator": "/",
      "__vModel__": "field111"
    },
    {
   
      "__config__": {
   
        "label": "计数器",
        "showLabel": true,
        "changeTag": true,
        "labelWidth": null,
        "tag": "el-input-number",
        "tagIcon": "number",
        "span": 24,
        "layout": "colFormItem",
        "required": true,
        "regList": [],
        "document": "https://element.eleme.cn/#/zh-CN/component/input-number",
        "formId": 105,
        "typeNumber": 2,
        "renderKey": 1649927477883
      },
      "placeholder": "计数器",
      "step": 1,
      "step-strictly": false,
      "controls-position": "",
      "disabled": false,
      "__vModel__": "field105"
    },
    {
   
      "__config__": {
   
        "label": "下拉选择",
        "showLabel": true,
        "labelWidth": null,
        "tag": "el-select",
        "tagIcon": "select",
        "layout": "colFormItem",
        "span": 24,
        "required": true,
        "regList": [],
        "changeTag": true,
        "document": "https://element.eleme.cn/#/zh-CN/component/select",
        "formId": 106,
        "typeNumber": 6,
        "renderKey": 1649927484505
      },
      "__slot__": {
   
        "options": [
          {
   
            "label": "选项一",
            "value": 1
          },
          {
   
            "label": "选项二",
            "value": 2
          }
        ]
      },
      "placeholder": "请选择下拉选择",
      "style": {
   
        "width": "100%"
      },
      "clearable": true,
      "disabled": false,
      "filterable": false,
      "multiple": false,
      "__vModel__": "field106"
    },
    {
   
      "__config__": {
   
        "label": "单选框组",
        "labelWidth": null,
        "showLabel": true,
        "tag": "el-radio-group",
        "tagIcon": "radio",
        "changeTag": true,
        "layout": "colFormItem",
        "span": 24,
        "optionType": "default",
        "regList": [],
        "required": true,
        "border": false,
        "document": "https://element.eleme.cn/#/zh-CN/component/radio",
        "formId": 107,
        "typeNumber": 4,
        "renderKey": 1649927491036
      },
      "__slot__": {
   
        "options": [
          {
   
            "label": "选项一",
            "value": 1
          },
          {
   
            "label": "选项二",
            "value": 2
          }
        ]
      },
      "style": {
   },
      "size": "medium",
      "disabled": false,
      "__vModel__": "field107"
    },
    {
   
      "__config__": {
   
        "label": "多选框组",
        "tag": "el-checkbox-group",
        "tagIcon": "checkbox",
        "defaultValue": [],
        "span": 24,
        "showLabel": true,
        "labelWidth": null,
        "layout": "colFormItem",
        "optionType": "default",
        "required": true,
        "regList": [],
        "changeTag": true,
        "border": false,
        "document": "https://element.eleme.cn/#/zh-CN/component/checkbox",
        "formId": 108,
        "typeNumber": 5,
        "renderKey": 1649927491380
      },
      "__slot__": {
   
        "options": [
          {
   
            "label": "选项一",
            "value": 1
          },
          {
   
            "label": "选项二",
            "value": 2
          }
        ]
      },
      "style": {
   },
      "size": "medium",
      "disabled": false,
      "__vModel__": "field108"
    },
    {
   
      "__config__": {
   
        "label": "日期选择",
        "tag": "el-date-picker",
        "tagIcon": "date",
        "defaultValue": null,
        "showLabel": true,
        "labelWidth": null,
        "span": 24,
        "layout": "colFormItem",
        "required": true,
        "regList": [],
        "changeTag": true,
        "document": "https://element.eleme.cn/#/zh-CN/component/date-picker",
        "formId": 110,
        "typeNumber": 3,
        "renderKey": 1649927506700
      },
      "placeholder": "请选择日期选择",
      "type": "date",
      "style": {
   
        "width": "100%"
      },
      "disabled": false,
      "clearable": true,
      "format": "yyyy-MM-dd",
      "value-format": "yyyy-MM-dd",
      "readonly": false,
      "__vModel__": "field110"
    }
  ]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用layui框架进行动态添加下拉框组件动态渲染数据时,可以使用下面的代码实现: HTML代码: ```html <div class="layui-form-item"> <label class="layui-form-label">下拉框:</label> <div class="layui-input-block"> <select name="select" lay-filter="select"> <option value="">请选择</option> </select> </div> </div> ``` JavaScript代码: ```javascript layui.use(['form', 'jquery'], function(){ var form = layui.form; var $ = layui.jquery; // 动态渲染下拉框数据 function renderSelect() { var data = [{value: 1, text: '选项1'}, {value: 2, text: '选项2'}, {value: 3, text: '选项3'}]; var select = $('select[name=select]'); select.empty(); select.append('<option value="">请选择</option>'); layui.each(data, function(index, item){ select.append('<option value="'+ item.value +'">'+ item.text +'</option>'); }); form.render('select'); } // 动态添加下拉框组件 function addSelect() { var html = '<div class="layui-form-item">'+ '<label class="layui-form-label">下拉框:</label>'+ '<div class="layui-input-block">'+ '<select name="select" lay-filter="select">'+ '<option value="">请选择</option>'+ '</select>'+ '</div>'+ '</div>'; $('.layui-form').append(html); renderSelect(); } // 初始化页面 renderSelect(); // 点击按钮添加下拉框组件 $('#addSelect').click(function(){ addSelect(); }); // 监听下拉框选中事件 form.on('select(select)', function(data){ console.log(data.value + ' ' + data.elem[data.elem.selectedIndex].text); }); }); ``` 在上述代码中,首先使用`layui.use`方法加载`form`和`jquery`模块,然后定义了两个函数`renderSelect`和`addSelect`,分别用于动态渲染下拉框数据和动态添加下拉框组件。在`renderSelect`函数中,通过定义一个数据数组,然后遍历该数组,动态添加下拉框选项,并调用`form.render('select')`方法进行渲染。在`addSelect`函数中,通过拼接HTML代码,动态添加一个下拉框组件,并调用`renderSelect`函数进行数据渲染。最后,在页面加载完毕后,调用`renderSelect`函数进行初始化,并监听下拉框选中事件,输出选中的值和文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值