layuiajax提交表单控制层代码_NoForm - 一个更好的表单解决方案

前言

在昨天刚结束的第一届 前端艺术家沙龙 上,NoForm 首次正式对外公布,鸣波大大发表非常精彩的演讲,后续现场有些童鞋对于这个话题也颇感兴趣,作为作者之一,也有义务把这个方案的前世今生讲一下。

为什么

有人说都8012年了,我们都把特斯拉送上月球了,还在做表单方案?

5353902f6b6de2190bb3a7ce02c2bf69.png

B类业务 的同学应该深有感触,我们日常需要面对大量操作类或者表单类的场景,因此只要是能从这些重复的CRUD解放出来的方案,就是最好的方案,

核心

NoForm想要呈现给开发者最重要的的点就是:自由

8683f8e13d77a1deeae04d79e6789138.png

大部分的同学都自建了一些快速生成的方案,有配置类型的,动态生成类型的,在初期往往可以解决60-80%的问题,但需要去维护的时候,维护者就会非常痛苦 (定制化需求),因此当我们在说 提升效能 之前,更重要的是,用的爽(自由)。然后基于这点再做上层建筑才会更稳


快速开始

好了,吹B结束,以下是快速索引。这里主要讲设计,就像用户手册一样,希望读者看完也知道如何去编写代码了,当然文档也会附上:

  • DEMO: 首先通过 DEMO 查看一些特性。
  • 官网:https://alibaba.github.io/nopage
  • GITHUB:https://github.com/alibaba/nopage
  • Ant-Design最佳实践 https://alibaba.github.io/noform/#/docs?md=easy/best-practise-antd

主要设计

aa0aa60ad711fb18c7fe149ca6a99fd3.png

如图所示,我们会用 FomCore 这个纯逻辑的处理单元去描述表单,那么能够完整描述表单的话会有以下几个维度:

  • values (最核心以及基本的维度)
  • status (描述整体和个体状态,如 edit(编辑), preview(预览), disabled(禁用) )
  • errors (描述目前表单有哪些字段校验不通过)
  • props (描述目前表单各个字段当前属性,如prefix, suffix 等)

因此Form就变成完全受控的组件(即外部传入什么值,就显示什么值),这样控制FormCore就等于控制表单。

状态控制

如下图所示,状态控制的优势在于 同一份代码通过切换不同的状态 即可实现以下的需求。

497119a33e1d4081febbe1797bdf2204.png

上层拓展

基于这种基础设计,往上层拓展就会容易多了。

36044ef7506b8224c54914da01d809e5.png

做好自己的本分

NoForm的设计思路就是先做好底层模块,保证底层模块的 内聚性 鲁棒性,上层才会稳固。对于 表单领域来说,表单项(FormItem) 就是底层模块。

b7f9c0d048ab6b71a31ea7c733e66413.png
FormItem 示意

fe9a542dbb305dde2747e9331f67a161.png
实际FormItem示意

结合上面两图来看,Content 即实际的表单元素,如 Select/Input/Checkbox 等等,这样的话,上面提及的状态切换,也需要根据单个表单项的实现才得以完成。

cee06f5e253a1f5e788a7353f464f7aa.png

根据以上设计,实际上,FormItem 就有维护自己的一份 values, errors, props, status 的itemCore , 而整体的值,实际上就是所有itemCore的总和。

f5bcbd40838186b1a5ad4ba2d6e20b96.png
看完前面的部分,可能会觉得NoForm整体的设计就很 “不负责任” ,把要做的事情都一层一层传递到下面的小弟身上,实际上这是尽量让专业的人做专业的事情,这样权责分明后维护的成本就会低很多。

控制机制

基于EventEmitter的设计是非常轻量和稳的设计,整体设计如图所示:

2a91196777067deca177ea5d8e1dc324.png

联动

联动是表单领域一个非常头疼的问题,而 kk大佬 说NoForm的精髓是处理联动,说来惭愧,联动方面也是非常 “不负责任” 的, 以下代码就是NoForm实现联动的办法:让用户自己去处理...

  1. 显示联动
<FormItem label="username" name="username"><Input /></FormItem>
<If when={(values, formCore) => {
    return values.username === 'bobby';
}}>
    <div>anything you want to return....</div>
</If>

用户需要去实现 when 自己决定处理的逻辑,If 主要功能来处理 是否显示 的联动形式。

2. 逻辑联动

<

3. 触发联动的契机

除了用户自己输入外,也可以使用上面提及的 FormCore 去执行

core.setValues({ // 设置值
    username: 'bobby',
    age: 23
});
core.setGlobalStatus('preview'); // 设置全局状态

更多内容,请查看 联动 和 核心控制

以上提及的就是NoForm在表单领域内做的一些事情,当然还有 校验 等一些环节没有提及,读者都可以在链接或者上面的文档进行查阅。

表单组件化标准

NoForm做的另外比较大的一块是组件标准化,正如上面所示,NoForm是很 “不负责任” 的,这么做的目的是想把属于表单领域的逻辑无UI化。这样的话,我们可以快速接入社区优秀的组件库,诸如 Ant-Design 飞冰 等...

实际上标准的React受控组件,都可以无缝接入。因此接入自定义组件可以参考 组件接入的标准。而NoForm 自身集成了 Ant-Design 的适配层,因此可以无缝接入。

不是Ant-Design 也没有关系,适配层主要是做了两件事: 标准化状态适配,详细的代码可以直接看 wrapper源码

TroubleShooting

以上就是NoForm设计的前世今生了,实际上在产出NoForm前内部还有很多实践,诸如mobx,基于 JSON-SCHEMA的联动和配置化渲染 等等,最终还是觉得底层需要做的比较薄,可控,强大但简洁,然后再基于这层往上拓展不至于伤到自己(很严肃不要笑...

27dde8a4973a42930f32cbbc3ebcc2ae.png

Roadmap

按照惯例还是要澄清一下这不是KPI项目,然后NoForm只是一个起点,我们希望它足够稳定和可信赖,目前放出的版本是0.x,还会迭代约2个月左右升级至1.x,后续会有一系列的升级步骤。

1.x 和 0.x 除了适配层都是兼容性升级,2.x 由于会接入vue 即将会是非兼容性升级
  • 0.x 维护至 11月
  • 1.x 整体升级至react@16 , 第三方适配层Ant-Design 独立一个库出来, 针对Ice 和 zent独立设计适配层库
  • 2.x 整体核心逻辑独立,vue版本产出(欢迎vue大佬加入我们一起搞起 ...

结语

不知不觉写了好长,这是团队向外暴露的第一个产品,后续会有更多的产品在路上,昨天会后有一些小伙伴表示非常想用,在这里也恳请各位尝试的小伙伴无论最终是否会用在自己的产品线上,有任何的问题都可以在Github上留下你的反馈,哪怕你不喜欢,也恳请告知离开的理由,因为我们是非常想把这款产品做好的,感谢...

为了更好更快的反馈使用者的问题,欢迎使用钉钉和我们联系。(比较尴尬,钉钉会自动转二维图,还是直接搜群号比较快)

钉钉群号: 23134927

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
form表单元素包括:text 文本输入框,password密码输入框,checkbox复选框,radio单选框,file 文件域,submit表单提交action指向的文件,reset表单清空,image图片提交按钮,button按钮,hidden隐藏域。 select option select 实现下拉选 callback 是回调函数 layui.模块   模块可以是layui已经存在的模块,也可以通过layui.define([mods], callback) 来自己自定义模块。 如果想要使用模块首先要做的必然是加载模块,layui.use(['laypage', 'layedit'], function(){}); 接下来使用layui风格控件  其实感觉layui帮我们定义好了CSS和许多JS文本,我们需要做的只是按照layui的命名规范选好样式进而使用就可以了。  layu官方文档的命名规范为: CSS命名规范 class命名前缀:layui,连接符:-,如:class="layui-form" 命名格式一般分为两种: 一:layui-模块名-状态或类型 二:layui-状态或类型 因为有些类并非是某个模块所特有,他们通常会是一些公共类。如: 一(定义按钮的原始风格):class="layui-btnlayui-btn-primary" 二(定义内联块状元素):class="layui-inline" 1 2 3 4 5 6 7 8 9 当然还有前面提到的使用模块的js代码layui.use(['form', 'layedit', 'laydate'], function(){   var form = layui.form   ,layer = layui.layer   ,layedit = layui.layedit   ,laydate = layui.laydate;   //日期   laydate.render({     elem: '#date'   });   laydate.render({     elem: '#date1'   });   //创建一个编辑器   var editIndex = layedit.build('LAY_demo_editor');   //自定义验证规则   form.verify({     title: function(value){       if(value.length < 5){         return '标题至少得5个字符啊';       }     }     ,pass: [/(.+){6,12}$/, '密码必须6到12位']     ,content: function(value){       layedit.sync(editIndex);     }   });   //监听指定开关   form.on('switch(switchTest)', function(data){     layer.msg('开关checked:'+ (this.checked ? 'true' : 'false'), {       offset: '6px'     });     layer.tips('温馨提示:请注意开关状态的文字可以随意定义,而不仅仅是ON|OFF', data.othis)   });   //监听提交   form.on('submit(demo1)', function(data){     layer.alert(JSON.stringify(data.field), {       title: '最终的提交信息'     })     return false;   }); }); 下面我们按照官方文档的开发规范使用一下form表单的例子       表单集合演示           单行输入框                       验证必填项                             验证手机                                   验证邮箱                                       多规则验证                                   验证日期                                   验证链接                                 验证身份证                       自定义验证                   请填写6到12位密码               范围                           -                                 单行选择框                   </opt

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值