京东低代码平台:水滴表单联动可视化配置的实现与思考

news2025/1/15 13:15:13

TL;DR

  • drip-form在0.9.0的alpha版支持了可视化配置联动的功能(仍在测试中)
  • drip-form通过协议到代码的转换,尽可能降低常见联动配置的开发成本
  • 探讨:JSON diff动态生成常见联动和校验
  • drip form的后续更新:v0.9.0是v0最后一个版本,后续v0以维护为主并更新v0的文档。v1规划中。
  • 联动或表单有更好的想法,欢迎讨论

前言

重要: 这篇文章不是表单联动实现的最佳方案,只是个人对联动的一些想法,欢迎探讨

表单联动是表单可视化配置的难点之一,如何以最少的代码实现尽可能多的联动功能感觉是一个悖论。

  • 联动功能多,代码量会增加
    我们可以对联动到代码的这层去做转化配置逻辑,减少代码的开发工作量。
  • 联动协议转换联动代码 ,降低了代码编写工作,却带来了新的可视化平台配置上手成本和适配成本

表单联动的实现方式

表单联动实现大体分为三种方式:

  • 纯代码开发
  • 联动协议配置化
  • 部分联动配置化、复杂联动代码开发

开发一个可视化配置联动的方案需要考虑三个成本:

  • 不使用可视化配置联动的代码编写成本、
  • 使用可视化配置表单联动带来的协议理解和配置成本
  • 使用低代码平台的理解成本

本质上并没有一个最佳的方案,本文只是针对固定表单联动场景,提高搭建效率的探索和纯配置实现尽可能多的联动功能的思考

联动常见场景

在设计配置协议前,我们需要了解常见的表单联动场景

  • 表单A控制表单B的数据
  • 表单A控制表单B的样式
    • 表单A控制表单B的展示隐藏
  • 表单A控制表单B的校验
    还有更复杂的联动可能还涉及表单的数据处理和转换逻辑,在涉及到复杂逻辑的时候,纯配置去搭建的联动的成本,可能没有配置+代码或纯代码实现来的快。所以这里不过多讨论

方案设计

实现分析

对上述几种场景进行分析,发现大部分的联动代码逻辑都可以通过编写if语句实现。

if(条件A){执行B}
复制代码

条件A

针对不同的数据类型,梳理常见的判断表达式以及对应类型的比较操作符

  • 表单A 是string类型,且为某个值时
  • 表单A 是number类型,大于某个值时
  • 表单A 是boolean类型,为真时
  • 表单A 是对象类型,包括某个属性时
  • 表单A 是数组类型,包括某个值时
    从上面例子判断表达式的组成:表单A的值、比较操作符、被比较值

以下是常见的数据类型对应的比较操作符

// nubmer 类型支持的操作符
type NumberOperator = '>=' | '<=' | '<' | '>' | '===' | '!=='
// string 类型支持的操作符
type StringOperator = '===' | '!==' | 'includes' | '-includes'
// boolean 类型支持的操作符
type BooleanOperator = 'true' | 'false'
// object 类型支持的操作符
type ObjectOperator = 'in' | '-in'
// array 类型支持的操作符
type ArrayOperator = 'includes' | '-includes'
复制代码

我们需要获取表单A的值,这个值对应的可能是表单数据(data)、表单的ui数据(uiSchema)、校验数据(dataSchema)。
现在有一个如下的get函数去获取表单的数据

//获取表单A的数据
get(A).data
//获取表单A的ui数据
get(A).uiSchema
//获取表单A的校验数据
get(A).dataSchema
复制代码

最终,条件A可以用下面代码实现

//如果表单A是string类型,并且为1时,执行B
if(get(A).data === '1'){执行B}
复制代码

执行B

条件A满足的时候,我们需要执行B。
在表单联动中,执行B的语句通常是需要设置表单B的数据、ui数据、校验数据

现有一个set函数可以设置表单B的数据

//设置表单B的数据
set(B,'data',value)
//设置表单的ui数据
set(B,'uiSchema',value)
//设置表单的校验数据
set(B,'dataSchema',value)
复制代码

最终,整个语句用下面代码实现

//如果表单A是string类型,并且为1时,设置表单B的值为2
if(get(A).data === '1'){set(B,'data',2)}
复制代码

协议定制

联动的纯配置化,是需要一个协议去描述上面的if逻辑。并通过一定的转换逻辑(比如:new Function)将配置转换为代码。

{
    //联动协议版本
    version:string
    //联动协议触发时机
    trigger:{
            //全局监听
            event:'globalChange'
    }
    //监听后执行的动作
    actions:[
            {
                //if语句
                type:'controlFlow'
                //if条件 (条件A)
                condintion:[
                        {
                            /**
                            * 表单A的值
                            * 格式:"fieldKey getType property" "fieldKey getType"
                            * fieldkey: 需要获取的表单的fieldkey	
                            * getType: 对应get的属性 data|uiSchema|dataSchema
                            * property: 可选 获取属性(用于处理对象)
                            */
                            fieldKey1:string
                            operator:string
                            //被比较值
                            value2:unknown
                            //可能存在多个条件 条件之间的关系 或/且
                            logicOperator:'||'
                        }
                ]
                //if条件触发的动作(执行B
                effect:[
                        {
                                //设置表单数据
                                type:'set',
                                /**
                                * 格式:"fieldKey setType property" "fieldKey setType"
                                * fieldkey: 需要获取的表单的fieldkey
                                * setType: data|uiSchema|dataSchema
                                * property: 可选 获取属性
                                */
                                fieldKey:string,
                                value:unknown
                            }
                ]
            }
    ]
}
复制代码

协议定制的时候,需要考虑后续协议的扩展性。

  • 可能会添加新的逻辑判断语句支持(比如else语句、switch case语句等)
    action中添加type判断当前语句
  • 可能存在嵌套语句(比如if的嵌套,子逻辑等)
    语句中的effect添加type判断语句类型
  • 联动的触发时机(比如组件加载,组件变动,依赖变动等)
    添加trigger.event判断

交互设计

参考outlook的邮件规则,最终设计如下

  • 条件
    判断的条件可能存在多个,所以使用或或者且按钮添加更多的条件。
  • 结果
    条件成立,可能执行多个动作。可以使用新增动作添加更多的触发场景
  • if语句或其他语句可能存在多个
    使用新增条件添加更多的联动逻辑

目前方案和思考

联动二期规划

  • 目前联动一期 alpha版并没有实现获取ui配置和设置ui数据和校验数据
    二期需要支持配置ui配置和校验配置
    比如:选中表单A,设置表单B的任何样式,设置表单B的任何校验信息
  • 支持自增模式下嵌套内容的配置

思考

  • 是否有必要支持复杂联动的配置?
    复杂联动的配置本质上是对js的语法配置化,对于平台新手用户来说,可能并不了解代码的底层实现,配置成本巨高。而对于开发来说,可能复杂的配置还没有手写几行联动代码更快。

    因此联动配置化需要固定的表单业务场景,复杂联动的配置化并不适合。在开发联动配置化前需要梳理当前业务域、支持域。

  • 是否需要一键设置反转? 比如:表单A选中某个值时,表单B隐藏。
    开启自动反转,则表单A未选中某个值时,表单B都是展示的

  • 是否需要开启动作触发时机和次数(生命周期概念)
    比如:表单A选中某个值时,表单B值为1
    表单B的值后续是否可以更改?可以更改,则这个联动是一次性的。不可以更改则是永久的

  • 如何降低联动配置成本
    现在的交互设计有理解成本。对于不了解平台的新手,搭建仍然一脸懵。

    是否可以通过两次表单的JSON对比,自动生成联动逻辑

    1. 先拖拽没有触发联动时的表单样式
    2. 配置触发联动之后的表单样式
    3. 两次配置的JSON自动比对,自动生成联动语句
    4. 生成的联动信息提示用户确认

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/45086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机组成原理-总线详细讲解(持续更新中)

总线概念与分类 定义 总线是一组能为多个部件分时共享的公共信息传送线路 共享是指总线上可以挂接多个部件&#xff0c;各个部件之间互相交换的信息都可以通过这组线路分时共享。 分时是指同一时刻只允许有一个部件向总线发送信息&#xff0c;如果系统中有多个部件&#xf…

React源码分析1-jsx转换及React.createElement

jsx 的转换 我们从 react 应用的入口开始对源码进行分析&#xff0c;创建一个简单的 hello, world 应用&#xff1a; import React, { Component } from react; import ReactDOM from react-dom; export default class App extends Component {render() {return <div>h…

科普下抖音的规则,为什么别人的内容很容易火,而我的很难?

今天给大家科普下抖音的规则&#xff0c;为什么别人的内容很容易火&#xff0c;而我的很难&#xff1f; 上一篇给大家讲了现在做抖音还来得及么&#xff1f;肯定的回答&#xff0c;一直都来得及。 既然来得及&#xff0c;那么我们怎么才能做好抖音呢&#xff1f; 在我看来&a…

Rust 基础(四)

十、泛型、Traits和生命周期 每种编程语言都有有效处理概念重复的工具。在Rust中&#xff0c;一个这样的工具就是泛型:具体类型或其他属性的抽象替身。我们可以表达泛型的行为&#xff0c;或者它们如何与其他泛型相关联&#xff0c;而不知道在编译和运行代码时它们的位置会是什…

[C++]C++入门--引用

​ &#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 博主Gitee 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎>在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode…

IPv6进阶:IPv6 过渡技术之IPv6 over IPv4 手动隧道

实验拓扑 R1-R3-R2之间的网络为IPv4环境&#xff1b;PC1及PC2处于IPv6孤岛。 实验需求 R1及R2为IPv6/IPv4双栈设备&#xff1b;在R1及R2上部署IPv6 over IPv4手工隧道使得PC1及PC2能够互相访问。 配置及实现 R3的配置如下 [R3] interface GigabitEthernet0/0/0 [R3-Gigabi…

【Java实战】工作中如何规范控制语句

目录 一、前言 二、控制语句规范 1.【强制】使用switch注意事项 2.【强制】当 switch 括号内的变量类型为 String 并且此变量为外部参数时&#xff0c;必须先进行 null 判断。 3.【强制】在 if / else / for / while / do 语句中必须使用大括号。 4.【强制】三目运算符高…

[附源码]计算机毕业设计springboot本地助农产品销售系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C++】string详细介绍及模拟实现string类

【C】string详细介绍及模拟实现string类 文章目录【C】string详细介绍及模拟实现string类1.什么是string2.string常用接口介绍2.1string类对象的常见构造2.2string类对象的容量操作2.3string类对象的访问及遍历操作2.4string类对象的修改操作2.5string类非成员函数3.string类的…

移动跨平台开发跨家选型参考建议

从 iPhone 诞生至今&#xff0c;智能手机风靡全球已将近20年&#xff0c;智能手机操作系统 iOS 和 Android 也成为当仁不让的顶流般的存在&#xff0c;而作为其背后的灵魂&#xff0c;移动应用也随着技术的发展已经越来越丰富。如果从技术层面来讲&#xff0c;移动 App 也从最开…

Cloud-computing 实验镜像 chinaskills_cloud_iaas.iso chinaskills_cloud_paas.iso

Cloud-computing 实验镜像 最近因新项目再次进行云计算环境的搭建&#xff0c; 找这两个镜像&#xff08; 找chinaskills_cloud_paas.iso chinaskills_cloud_iaas.iso&#xff09;颇为费劲&#xff0c;用尽九牛二虎之力总算找到了&#xff0c;该大侠还分享了诸多系统镜像和完…

高衍射效率的偏振无关透射光栅的分析与设计

摘要 光栅&#xff0c;特别是具有与波长相当的特征尺寸的光栅&#xff0c;具有偏振相关的光学特性。 这使得设计的具有高衍射效率的光栅难以用于任意偏振。 根据文献[T. Clausnitzer, et al&#xff0c;Proc. SPIE 5252,174-182&#xff08;2003&#xff09;]中报道的概念&…

VMware-AD域控管理

目录 新建AD用户[ 以张三[zhangsan]、李四[lisi]为例 ] 2.用户信息-属性-管理-编辑&#xff1a; 3.将张三设置为AD域控管理员&#xff0c; 在wqd.com域下新建几个部门&#xff08;IT、HR、PRD&#xff09; 对从主机&#xff08;win7&#xff09;进行AD接管 修改win7计算机名称&…

MATLB|电动车智能充电模式及电力高峰需求预测

目录 0 写在前面 1 电动车 1.1 电动车&#xff08;EV&#xff09; 1.2 电动汽车充电 1.3 智能充电和车联网&#xff08;V2G&#xff09; 1.4 V2G 应用 1.5 可再生能源可用性 1.6 基于价格的收费 2 电动车智能充电 2.1 智能充电 2.2 实时电价 2.3 智能充电模式——算…

国产CPU对比

关于国产CPU&#xff1a;龙芯、飞腾、鲲鹏、海光、申威、兆芯 CPU 是计算机系统的核心和大脑 n CPU&#xff0c;即中央处理器是计算机的运算和控制核心&#xff0c;其功能主要是解释计算机指令以及处理计算机软件中的数据. CISC实际上是以增加处理器本身复杂度作为代价&#xf…

论文翻译:多延迟块频域自适应滤波器

Multidelay Block Frequency Domain Adaptive Filter 作者&#xff1a; JIA-SIEN SOO 和 KHEE K. PANG 文章目录Multidelay Block Frequency Domain Adaptive Filter1.介绍2.MDF自适应滤波器3.仿真结果和性能分析4.计算的复杂性5.结论摘要-本文提出了一种灵活的多延迟块频域自…

农村城镇面板数据集:地级市人均消费与支出2012-2019各省农村数据2013-2019

1、2002-2019年地级市人均消费与支出数据 1、数据来源&#xff1a;wind 2、时间跨度&#xff1a;2012-2019 3、区域范围&#xff1a;287个地级市 4、指标说明&#xff1a; 包含以下四个指标&#xff1a;人均可支配收入&#xff08;农村&#xff09;、人均可支配收入&#…

在el-table表头上引入组件不能实时传参bug

文章目录场景还原解决方法出现原因场景还原 产品要求&#xff1a;点击表格的表头&#xff0c;能触发一个下拉的列表&#xff0c;列表能携带表格的筛选条件&#xff0c;获取相应的数据 写了一个demo&#xff0c;来还原一下bug出现的场景&#xff1a; <div id"demo&qu…

Day15--加入购物车-初始化vuex

1.加入购物车&#xff1a; 我的操作&#xff1a; ************************************************************************************************************* 2.购物车里面的商品数据在多个页面都会用到。所以把购物车里面的商品数据存储在vuex里面&#xff0c; 我的…

11月29日:thinkphp框架->请求

回忆上节知识点 thinkphp官方文档解释 Rest控制器&#xff1a;主要是对资源进行控制&#xff0c;在thinkphp6.0开始废弃&#xff0c;推荐使用资源控制器 Rest控制器使用符合RESTFul风格&#xff0c;RESTFul方法和标准模式的操作方法定义主要区别在于&#xff0c;需要对请求类型…