小程序SDK版本 1.4

表单校验之难
如果要问微信小程序最难实现的公共业务是什么?应该是表单校验,没有之一。原因如下:
表单组件在数量上达到11个,居各类组件之首。当然幸运的是,并不是所有的都需要校验。
而这些组件操作方式多样,可分为滑动、(多行)输入、点击、点击+滑动。
即使是同一个组件,因为业务场景不同就会有不同的校验规则。
更麻烦的是,这些组件之间经常还会联动或者关联校验。
…
但是,作为一个非简单静态页面,有着较多用户交互的小程序,表单校验又是一个非常常用的功能:登录、注册、新增、编辑…
总而言之:表单组件的多样性 X 校验规则的多样性 = 复杂的公共业务
这么棘手的问题我们怎么来解决它呢?
尝试组件化
如果你关注近年前端发展趋势,一定会想到“组件化”来实现:
把每个表单组件的视图、样式、校验逻辑封装成单独的业务组件,然后直接调用。
可事情似乎没这么简单。
如果考虑把n个原生组件抽象出来,配上n个校验规则,再乘以组件之间的关系n(的全排列),复杂度至少达到n³。
而且每个组件的校验失败或成功都要通知父组件,以便显示错误信息或者进行下一步操作。
这样不但没有解决问题,反而使得这些公用的表单组件过于复杂,耦合混乱。
尝试非组件化
既然原先的思路行不通,再来回到出发点,看看我们最核心的需要被抽象出来的是什么。
无非是两样东西:视图层的元素样式和逻辑层的校验规则。
上面说到封装原生表单组件会极大的增加复杂度,索性放弃它,复杂度瞬间可以下降到n²。
但同时我们又要保持样式统一,也就是我们常说的风格一致。
比如输入框该多高,错误提示怎么显示,字体大小颜色…之类的。
这个好办,我们把样式类写入一个公共样式文件form.wxss,然后需要的时候引入,甚至可以全局引入。
// form.wxss
.form {
display: block;
font-size: 28rpx;
position: relative;
}
.form-line {
background-color: #fff;
border-bottom: 1px solid #e5e5e5;
font-size: 34rpx;
height: 96rpx;
line-height: 96rpx;
display: flex;
padding: 0 31rpx;
}
.form-title {
box-sizing: border-box;
background-color: #efefef;
color: #838383;
font-size: 28rpx;
padding: 31rpx;
min-height: 90rpx;
}
...
我们使用的时候只需要在对应的元素上添加相应的样式即可。比如:
// xxx.wxml <form class="form"> <view class="form-title">请输入手机号</view> <view class="form-line"> <label class="label">手机</label> <view class="form-control"> <input class="f-1 va-m input" /> </view> </view> ... </form>
那么接下来我们只剩下校验规则和组件关联关系之间这两个难题了。
校验规则理想的状态是可扩展和可配置。
可扩展。随着业务的增长,在不修改已有规则情况可以新增校验规则。
可配置。可单独为每个表单组件配置不同的单个或多个校验规则。
如何做到可定义?用统一的形式即可。比如:
/*
统一的格式:
[规则名]: {
rule: [校验方式]
msg: [错误信息]
}
*/
const validators = {
// 简单的校验用正则
required: {
rule: /.+/,
msg: '必填项不能为空'
},
// 复杂的校验用函数
same: {
rule (val='', sVal='') {
return val===this.data[sVal]
},
msg: '密码不一致'
}
...
}
如何做到可配置?配置上支持类似数组的形式,然后用统一的函数依次读取这些校验规则,逐个校验。
配置的规则肯定是在原生表单组件上,至于组件的值也只能通过事件对象获取。
如果直接绑定事件进行校验会阻碍父页面获取值,所以最好由父页面绑定事件传值,并且传入事件对象和执行环境进行处理:
/*
校验函数部分代码
e 事件对象
context 页面对象函数执行的上下文环境
*/
let validate = (e, context) => {
// 从事件对象中获取组件的值
let value = (e.detail.value || '').trim()
// 从事件中获取校验规则名称
let validator = e.currentTarget.dataset.validator ? e.currentTarget.dataset.validator .split(',') : []
// 遍历规则进行校验
for (let i = 0; i < validator.length; i++) {
let ruleName = validator[i].split('=')[0]
let ruleValue = validator[i].split('=')[1]
let rule = validators[ruleName].rule || /.*/
if ('function' === typeof rule) {
rule.call(context, value, ruleValue) ? '' : validators[ruleName].msg
} else {
rule.test(value) ? '' : validators[ruleName].msg
}
}
...
}
调用起来也非常简单,按照固定的格式加上对应的样式,配置校验规则,然后调用校验函数。
// 部分代码示例
// page.wxml
<form>
<!-- 一个表单组件 -->
<view class="form-line">
<label class="label">授权手机</label>
<view class="form-control">
<!-- 校验规则:必须填写,且为电话号码 -->
<input maxlength="11" class="f-1 va-m input" bindblur="validate" type="number" data-name="phone" data-validator="required,phone" confirm-type="next" value="{{phone}}" />
<!-- 错误图标 -->
<icon wx:if="{{form.phone!==undefined}}" type="{{form.phone?'warn':'success'}}" size="16" />
</view>
</view>
...
</form>
// page.js
valid(e) {
this.setData({
[e.currentTarget.dataset.name]: e.detail.value
})
validate(e, this)
}
上面的代码中省略了校验错误提示和非空校验。详细代码请查看GitHub仓库:
https://github.com/yalishizhude/miniprogram-seed.git
总结
写代码最然总是要抱着最美好的想法,但同时也要做着最坏的打算。尤其是面对一些底层框架限制的时候。
面对这种情况,我们要从核心需求出发,把能抽出公用的东西都出来,同时保证可配置、可扩展。
好的的架构师不但喜欢未开垦的处女地,也应不惧布满杂石乱草的荒野~
欢迎到评论区留言交流:https://github.com/yalishizhude/webclub-discuss/issues/1
为大家推荐现在关注度比较高的微信小程序教程一篇:《微信小程序开发教程》小编为大家精心整理的,希望喜欢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# 微信小程序
# 表单校验
# 微信小程序中form 表单提交和取值实例详解
# 微信小程序 PHP后端form表单提交实例详解
# 微信小程序 表单Form实例详解(附源码)
# 微信小程序简单实现form表单获取输入数据功能示例
# 微信小程序表单验证功能完整实例
# 微信小程序 input表单与redio及下拉列表的使用实例
# 微信小程序表单验证form提交错误提示效果
# 微信小程序表单弹窗实例
# 微信小程序使用form表单获取输入框数据的实例代码
# 微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
# 微信小程序bindinput与bindsubmit的区别实例分析
# 表单
# 的是
# 错误信息
# 绑定
# 错误提示
# 如果你
# 是在
# 又是
# 尤其是
# 都要
# 多个
# 也要
# 已有
# 还会
# 遍历
# 只需
# 说到
# 较高
# 要在
# 抱着
相关文章:
公司网站的制作公司,企业网站制作基本流程有哪些?
电商网站制作公司有哪些,1688网是什么意思?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
家庭服务器如何搭建个人网站?
如何快速上传自定义模板至建站之星?
如何基于PHP生成高效IDC网络公司建站源码?
如何在建站主机中优化服务器配置?
如何通过山东自助建站平台快速注册域名?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何通过VPS搭建网站快速盈利?
建站之星CMS五站合一模板配置与SEO优化指南
网页设计与网站制作内容,怎样注册网站?
设计网站制作公司有哪些,制作网页教程?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
jQuery 常见小例汇总
c# 在高并发场景下,委托和接口调用的性能对比
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
制作营销网站公司,淘特是干什么用的?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
建站之星客服服务时间及联系方式如何?
教程网站设计制作软件,怎么创建自己的一个网站?
如何通过PHP快速构建高效问答网站功能?
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
建站之星如何一键生成手机站?
如何选择域名并搭建高效网站?
建站之星微信建站一键生成小程序+多端营销系统
安徽网站建设与外贸建站服务专业定制方案
大连 网站制作,大连天途有线官网?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在IIS服务器上快速部署高效网站?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何在建站之星网店版论坛获取技术支持?
如何打造高效商业网站?建站目的决定转化率
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
西安专业网站制作公司有哪些,陕西省建行官方网站?
高防服务器租用指南:配置选择与快速部署攻略
如何做静态网页,sublimetext3.0制作静态网页?
如何在宝塔面板中修改默认建站目录?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何通过虚拟机搭建网站?详细步骤解析
寿县云建站:智能SEO优化与多行业模板快速上线指南
c# 在高并发下使用反射发射(Reflection.Emit)的性能
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
Swift中swift中的switch 语句
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
如何配置WinSCP新建站点的密钥验证步骤?
*请认真填写需求信息,我们会在24小时内与您取得联系。