开发designable内置组件缺少的步骤器(FormStep)经验分享 #136
jinphic
started this conversation in
Show and tell
Replies: 1 comment
-
@jinphic Any working example? |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
如何开发designable内置组件缺少的步骤器(FormStep)
playground
先介绍一下designable playground 的页面结构, 左侧A区域是组件的分类和列表,B区域是展示区或者预览区,右侧C区域是选中组件后的组件的熟悉。
![image](https://user-images.githubusercontent.com/78671853/142773895-4822c18c-0902-40a0-b6da-cbdcc436c787.png)
左侧区域新增组件分类和icon
通过
GlobalDragSource.setSourcesByGroup
注册组件DragSourceWidget
这个组件的有两个属性,title
是分类的在左侧显示的名称。 可以直接传中文名称,也可以传source.xxx
, 然后进行中英文切换。name
就是用来匹配我们自定义的组件分类。和setSourcesByGroup
搭配使用,setSourcesByGroup
会在单例对象GlobalDragSource
上面注册我们的分类,DragSourceWidget
通过name
去匹配我们注册的分类组,然后就会展示对应的分类下的组件。这里最新版本已经弃用就不展开了。
这里designable的API的
ts类型
是不支持直接传入组件的icon
的,因为有这么一段声明把sourceIcon
设置为字符串类型。但是IconWidget的源码是这样的,所以可以在
sourceIcon
传入React.Element
并且断言为 any 逃过ts校验,同时达到自定义icon的目的。ITreeNode
是GlobalDragSource
操作组件的对象的最小单元,通俗来讲他就是我们自定义的组件的一个宏观上的描述.componentName
需要写死DesignableField
是因为源码里面判断是否是组件的时候会用到这个常量。DesignableField
就是可以展示在画布<ViewPanel type="DESIGNABLE">
上组件的名称,只有名称为DesignableField
的组件才能展示在画布上,这也是为什么createDesignableField/registryName
要写死。这里虽然可以传入多个,但是PreviewWidget
里面的核心函数transformToSchema
的入参数只有一个,所以这里必须写死并且保持一致,不然会出现可以拖动到画布上展示,但是无法预览的问题代码贴一下
右侧区域新增组件的属性
这部分其实就是很普通的formily的
json-schema
,用过formily的朋友都能写。这些属性就是组件编辑区组件的
props
。这里我也有一个疑问,就是C区域的属性间是不可以联动的,我试了没成功。有经验的可以分享一下解决方法。
中间区域是编辑区和预览区
这部分是核心
问题
设计一个步骤器组件在编辑画布上需要考虑的问题
可以拖动步骤器组件进入页面,使得这个组件成为一个容器组件。
没有组件的时候展示empty的背景和一个
dropable
的容器组件。拖动其他组件放入步骤组件,自动生成一个步骤。
如何生成步骤和删除步骤。
点击下一步,打开新的步骤页面子容器。
点击上一步,打开之前创建的的子容器。
最后一步点击done,收集和提交容器内部的表单数据。
点击每一步的步骤器组件容器,可以设置每一步的步骤名称
可以给步骤器组件设置初始的步骤
每一个步骤都是一个容器,新拖入的组件完全维持和拖入根组件一样的交互。
设计一个步骤器组件在预览画布上需要考虑的问题
onInput
和onBlur
才进行校验shema
.可以看见一个组件在编辑画布和在预览画布上,是有很多不同的。
props
中的一个属性。简要解决方式
步骤器组件在编辑画布的问题
使用
antd/Steps
来展示样式,根据props选择的是default 还是 navigation 来展示是普通的步骤还是导航式的步骤Steps/Step
就根据点击添加步骤和删除步骤控制其中增加步骤的例子可以参考自增组件的源码,删除的部分是我自己实现的。
直接取到
treeNode
的 第current
节点,remove
即可,但是如果删除的步骤是最后一个步骤,那么需要提前将步骤设置为前一步,这样删除后,仍然保持在最后一步的样式。而且这样避免了
remove
所在步骤的节点,造成了“自己删除自己”的错误导致页面崩掉。点击步骤切换,设置Steps的步骤current属性即可。
点击每一步的步骤器组件容器,可以设置每一步的步骤名称,
步骤器组件在预览画布的问题
onInput
和onBlur
才进行校验,如果我们想一开始就校验,该怎么做呢Steps
的全部shcemaStepPane
也就是每一个步骤的schemaBeta Was this translation helpful? Give feedback.
All reactions