Flask+LayUI开发手记(九):关于layui-form表单中的选择域

发布于:2025-07-01 ⋅ 阅读:(17) ⋅ 点赞:(0)

        使用layui-form,总体的感觉就是这是个半成品。相比于layui-table表格以字典参数动态生成拥有复杂且灵活展示功能的数据表格,form表单只是定义了一些css,而表单的绘制还是要手动完成的,这个可能是觉得form输入域太灵活没法抽象,也可能是觉得抽象出的功能太简单,不如直接手写,总之form.render()似乎是一个可有可无的函数,以前以为用JS动态修改form的DOM后,得用render()来实现真实渲染,但现在的高版本似乎是修改完了立即生效,所以这一功能也不用了。

        总之,还是觉得form如果只是止步于现在的样子,实在是有些功能不足,毕竟,table表格组件真是太强大也太吸引人了,form做一个基于列表参数的渲染也是很有用的,尤其是把选择域的条目做成前后端一体控制的组件时,表单的自动渲染就更显得有吸引力。

       当然,做这个总体渲染并不是啥难事。真正的工作量,还是把form中除输入域之外的其它选项域都能完成参数化配置,比如现有的select单选、checkbox复选、radio单选,以及现在表单还缺失的树型单选和树型复选,以及日期、日期区间、富文本编辑以及图片上传等,其实都可以写成统一的选项组件来实现,现在的form中只需要加入相应属性参数即可以。

       这一阵子都在忙乎这些事,选项组件也实现的差不多了。在这个过程中也遇到过比较困扰的技术麻烦,选项域的赋值就是个其中一个,之所以说form是个半成品,也是这个原因。除了赋值,另一个就是checkbox复选框和radio单选按钮的字体样式调整不了,也是颇费了一些时间,才发现问题。这些算是在layui开发中比较有意思的坑,所以,单列一章写出来。

一、选项域的赋值和取值

      layui的选项域,包括select单选域、checkbox复选域、radio单选按钮域,其实对它们的赋值很简单,就是根据这些域的name属性,生成对应的键值对字典,然后调用form.val()函数即可。但问题就在于,普通的直接输入域除了用form.val()赋值外,使用jquery的$(item).val()函数赋值也是有效的,而且这种方式显然更为直接快捷。但选项域就是不支持这种,哪怕你去查DOM,发现已经设上了,实际显示也是无效的,必须用form.val()才有效。

       而究其原因,其实是layui对这三种选择域,都是采用由原生DOM内容生成衍生DOM内容来完成控制的方式,初始渲染时会考虑原生DOM设定的值,但是之后如果直接修改原生DOM的值,那就不会触发衍生DOM的值变化了。

       不过,无论哪种输入域,取值倒是统一的,就是用form.val()有效,用jquery的$(item).val()也有效,这倒是让操作方便了不少,不过对初学者来说,就更增加了一些困惑。

二、选项域的事件触发

       选项域的事件触发也是很有意思,首先是在程序中用form.val()修改值之后,并不会触发change事件,当然直接输入域也不触发。所以,如果需要监听表单值改变的事件,就必须在form.val()之后,加上一个命令手动的事件触发,这个要用trigger()即可。这个对于选项域、输入域都是统一的,示例如下:

form.val(iform,rsdata);
let keyw_name = `#${iform} input,#${iform} select,#${iform} textarea`;
$(keyw_name).trigger('change');

       与此同时,当手动输入造成值变化时,输入域和选项域就不同了。输入域会直接触发change事件,而选项域并不会触发change事件,而是会触发form.on()表单事件,所以,要想监测手动选项变成,就必须要写一个form.on()程序来处理,所以,对于选项域(select、checkbox、radio),可能要针对change和form.on写出同样的程序,当然,你也可以在change中写处理,在form.on中触发change事件,这样也是可以的。

//当输入值发生变化时,刷新复选框
$(i_elem).on('change',function(e) {
    。。。。。。。
	//form.render(null,formId);
});

//当选择框点击后,刷新输入值
form.on('select(lay-filter)',function(data) {
    .........
	return ;
});

        form.on的事件元素是用lay-filter属性定义的,这个属性要定义成form中唯一,如果同页面有两个form,那要定义成全局唯一,否则会出问题。

三、关于checkbox、radio的字体调整

        这也是个困扰人的问题,表单的默认字体是14px,做了一个表格表单一体的编辑工具,表单字体再设成14px就有些大了,所以设成了12px,设完后对输入域和单选域都是有效的,但对于复选和单选按钮,就是怎么调都不对。就象下面这个图案。

       进入调试工作台仔细看网页才发现,原生的DOM定义并不会影响到衍生的DOM,而派生出的元素内容,是用class类型layui-form-checkbox和layui-form-radio来标记的,因为在css中加入了如下设定,字体就可以调整了。

.layui-form-radio div,
.layui-form-checkbox div {
    font-size:12px;
}

       用layui做前端,有种很好的感觉,就是整个工具的架构和接口,都体现出一个工具程序员的优雅,也就是在用时,它的风格总能和使用者想要的相一致,这点真让人感到舒服。但是可能确实是编程人太少了难免会疏漏,所以,时不时会遇到某些不完善的地方,像是黑洞一样,时不时卡人一下。好在,熟悉了之后,也就都能事先避开。


网站公告

今日签到

点亮在社区的每一天
去签到