Form 表单

由输入框、文本框、单选框、多选框、评分控件组成,用以收集、校验、提交数据。适用于账号注册、用户信息填写等表单页面。

基础案例

用户信息表单。

  1. <l-form name="student" l-form-btn-class="l-form-btn-class" bind:linsubmit="submit">
  2. <l-form-item label="姓名:" name="studentName">
  3. <l-input id="studentName" value="{{student.name}}" hide-label show-row="{{false}}"/>
  4. </l-form-item>
  5. <l-form-item label="年龄:" name="studentAge">
  6. <l-input id="studentAge" value="{{student.age}}" hide-label show-row="{{false}}"/>
  7. </l-form-item>
  8. <l-form-item label="地址:" name="studentAddress">
  9. <l-input id="studentAddress" value="{{student.address}}" hide-label show-row="{{false}}"/>
  10. </l-form-item>
  11. <view slot="submit">
  12. <l-button>提交</l-button>
  13. </view>
  14. <view slot="reset">
  15. <l-button type="default" plain>重置</l-button>
  16. </view>
  17. </l-form>
  1. .l-form-btn-class{
  2. display: flex;
  3. justify-content: space-around;
  4. margin-top: 10rpx;
  5. }
  1. Page({
  2. data: {
  3. student: {
  4. name: '',
  5. age: '',
  6. address: ''
  7. },
  8. },
  9. submit(event){
  10. const {detail} = event;
  11. /*
  12. detail 返回三个参数
  13. 1、values: 各表单项的value值
  14. 2、errors: 各表单项验证后的返回的错误信息数组
  15. 3、isValidate: 表单是否验证通过的boolean值
  16. 具体格式示例:
  17. detail = {
  18. values: {
  19. studentName: "",
  20. studentAge: "",
  21. studentAddress: ""
  22. },
  23. errors: {
  24. studentName: [],
  25. studentAge: [],
  26. studentAddress: []
  27. },
  28. isValidate: true
  29. }
  30. */
  31. },
  32. onLoad: function () {
  33. wx.lin.initValidateForm(this)
  34. },
  35. })

Form 表单 - 图1

在 form 组件中,每一个表单域由一个 form-Item 组件构成,表单域中可以放置各种类型的表单控件,包括 InputCheckboxRadioRateTextArea 。 form-Item 中只能使用 Lin-UI 的表单元素,不能使用其他UI组件或者小程序的原生组件。

表单使用需要有以下注意:

  1. 使用 form 组件时需要在 onLoad 中调用 wx.lin.initValidateForm(this)进行初始化。

  2. 需要给 form 组件设置 name 属性。当用户手动提交表单的时候需要传入表单 name。例: <l-form name="student"></l-form>

  3. 需要给 form-Item 设置 name 属性。name 的值将作为提交表单时返回的 Key 。例: <l-form-item name="studentName"></l-form-item>

  4. 每一个表单控件必须设置一个 id 属性,且属性值必需与 form-Item 的 name 属性值相同。id属性用于通过selectComponent获取表单域的值。 例:<l-form-item name="studentName"><l-input id="studentName"/></l-form-item>

使用更多表单项

示例代码

  1. <l-form name="form" bind:linsubmit="submit" l-form-btn-class="l-form-btn-class">
  2. <l-form-item label="填写姓名:" name="name">
  3. <l-input id="name" value="{{name}}" hide-label show-row="{{false}}"/>
  4. </l-form-item>
  5. <l-form-item label="选择歌曲:" name="music" >
  6. <l-checkbox-group bind:linchange="change" id="music" placement="row">
  7. <l-checkbox
  8. l-class="l-checkbox-color"
  9. wx:for="{{items}}"
  10. wx:key="{{item.id}}"
  11. placement="{{position}}"
  12. key="{{item.name}}"
  13. checked="{{item.checked}}"
  14. >
  15. {{item.name}}
  16. </l-checkbox>
  17. </l-checkbox-group>
  18. </l-form-item>
  19. <l-form-item label="选择性别:" name="sex">
  20. <l-radio-group current="{{sex}}" id="sex" placement="row">
  21. <l-radio key="0">
  22. </l-radio>
  23. <l-radio key="1">
  24. </l-radio>
  25. </l-radio-group>
  26. </l-form-item>
  27. <l-form-item label="自我评分:" name="score">
  28. <l-rate id="score" value="{{score}}" />
  29. </l-form-item>
  30. <l-form-item label="性格描述:" name="desc">
  31. <l-textarea border="{{false}}" id="desc" value="{{desc}}" />
  32. </l-form-item>
  33. <view slot="submit">
  34. <l-button>提交验证</l-button>
  35. </view>
  36. <view slot="reset">
  37. <l-button type="default" plain>重置</l-button>
  38. </view>
  39. </l-form>
  1. data: {
  2. name: '王大锤',
  3. sex: '',
  4. music: '',
  5. score: '',
  6. desc: '',
  7. items: [
  8. {
  9. id: 1,
  10. name: '青瓷',
  11. checked: false
  12. },
  13. {
  14. id: 2,
  15. name: '双棍',
  16. checked: false
  17. },
  18. {
  19. id: 3,
  20. name: '明天',
  21. checked: false
  22. }]
  23. },
  24. onLoad: function () {
  25. wx.lin.initValidateForm(this)
  26. },
  27. change(e) {
  28. let items = this.data.items;
  29. items.forEach(item => {
  30. if(item.name == e.detail.key) {
  31. item.checked = e.detail.checked;
  32. }
  33. });
  34. this.setData({
  35. items: items
  36. });
  37. }

Form 表单 - 图2

更改表单域的布局方式

通过设置 label-placement 切换表单项的布局方式。 默认值是 row ,即label与内容项同行显示。值为 column 时,label显示在内容项上方。

示例代码

  1. <l-form-item label="填写姓名:" name="name" label-placement="column">
  2. <l-input id="name" value="{{name}}" hide-label show-row="{{false}}"/>
  3. </l-form-item>

设置表单域标签的文字对齐方式

通过设置 align-items 更改表单域标签内容文字的对齐方式。默认值是 start ,可选项为 start/center/end

示例代码

  1. <l-form-item label="填写姓名:" name="name" align-items="start">
  2. <l-input id="name" value="{{name}}" hide-label show-row="{{false}}"/>
  3. </l-form-item>

设置表单域标签的宽度

通过设置 label-width 属性来修改表单域标签的宽度。

示例代码

  1. <l-form-item label="填写姓名:" name="name" label-width="300rpx">
  2. <l-input id="name" value="{{name}}" hide-label show-row="{{false}}"/>
  3. </l-form-item>

自定义表单域标签的内容

通过设置 label-slot 为 true, 使用具名插槽 label 自定义表单域标签的内容。

示例代码

  1. <l-form-item label="填写姓名:" name="name" label-slot>
  2. <view slot="label">插槽姓名:</view>
  3. <l-input id="name" value="{{name}}" hide-label show-row="{{false}}"/>
  4. </l-form-item>

带验证的表单案例

通过在 form-Item 上设置 rules 属性,给表单项添加验证规则。rules 接收一个验证对象或者由多个验证对象组成的数组。 form组件使用了开源库 async-validatorForm 表单 - 图3 来实现表单验证。可以快速使用 async-validator 内置的常用验证,也可以自定义验证函数。

验证时机: form组件可以实时验证,也可以在用户提交时统一‍验证。通过 trigger 设置表单项验证的时机,可选值 blur/change。trigger 默认为空,此时表单不会实时验证,可在提交时统一校验。trigger 可以传入一个数组或字符串,例: trigger:blurtrigger:['blur','change']

提示方式: 验证器提供了三种提示错误的方式:message 、 toast 和 text ,通过设置 form-Item 的 tip-type 值为 messagetoasttext 修改提示方式。默认值为 toast注意: 使用 message 和 toast 的方式需要在配置文件中引用组件。

基础校验

使用内置常用验证函数,例如:长度验证、必填验证、邮箱验证、自定义正则验证等。

  1. <l-form name="loginForm" bind:linsubmit="submit" l-form-btn-class="l-form-btn-class">
  2. <l-form-item label="账号:" name="loginFormLoginId" rules="{{loginForm.loginIdRules}}">
  3. <l-input id="loginFormLoginId" value="{{loginForm.loginId}}" hide-label show-row="{{false}}"/>
  4. </l-form-item>
  5. <l-form-item label="密码:" name="loginFormPassword" rules="{{loginForm.passwordRules}}">
  6. <l-input id="loginFormPassword" value="{{loginForm.password}}" hide-label show-row="{{false}}"/>
  7. </l-form-item>
  8. <view slot="submit">
  9. <l-button>注册</l-button>
  10. </view>
  11. <view slot="reset">
  12. <l-button type="default" plain>重置</l-button>
  13. </view>
  14. </l-form>
  1. Page({
  2. data: {
  3. loginForm: {
  4. loginId: '',
  5. password: '',
  6. loginIdRules:{
  7. type: 'email',
  8. required: true,
  9. message: '邮箱地址不合法',
  10. trigger: 'change'
  11. },
  12. passwordRules: [
  13. { required: true, message: '请输入登录密码', trigger: 'blur' },
  14. { min: 8, max: 20, message: '密码长度在8-20个字符之间', trigger: 'blur' },
  15. { pattern: '^[A-Za-z0-9]+$', message: '密码必须由数字字母组成',trigger: 'blur'}
  16. ],
  17. }
  18. }
  19. })

Form 表单 - 图4

自定义校验

通过设置 validator 函数自定义验证规则,validator 接收四个参数。rule 表示当前的验证规则,value 表示当前验证的值,callback 为回调函数,source 为整个表单的数据。 若验证不通过调用callback(false),若验证通过 调用callback()

  1. <l-form name="register" l-form-btn-class="l-form-btn-class">
  2. <l-form-item tip-type="text" label="登录账号:" name="loginId" rules="{{loginIdRules}}">
  3. <l-input id="loginId" value="{{register.loginId}}" hide-label show-row="{{false}}"/>
  4. </l-form-item>
  5. <l-form-item tip-type="text" label="登录密码:" name="password" rules="{{passwordRules}}">
  6. <l-input id="password" value="{{register.password}}" hide-label show-row="{{false}}"/>
  7. </l-form-item>
  8. <l-form-item tip-type="text" label="确认密码:" name="confirm" rules="{{confirmRules}}">
  9. <l-input id="confirm" value="{{register.confirm}}" hide-label show-row="{{false}}"/>
  10. </l-form-item>
  11. <view slot="submit">
  12. <l-button>注册</l-button>
  13. </view>
  14. <view slot="reset">
  15. <l-button type="default" plain>重置</l-button>
  16. </view>
  17. </l-form>
  1. data: {
  2. register: {
  3. loginId: '',
  4. password: '',
  5. confirm: ''
  6. },
  7. loginIdRules: {
  8. type: 'email',
  9. required: true,
  10. message: '邮箱地址不合法',
  11. trigger: 'blur'
  12. },
  13. passwordRules: [
  14. { required: true, message: '请输入登录密码', trigger: 'blur' },
  15. { min: 8, max: 20, message: '密码长度在8-20个字符之间', trigger: 'blur' },
  16. { pattern: '^[A-Za-z0-9]+$', message: '密码必须由数字字母组成',trigger: 'blur'}
  17. ],
  18. confirmRules: [
  19. {
  20. validator(rule, value, callback,source) {
  21. const {password,confirm} = source;
  22. if(password !== confirm) {
  23. callback(false);
  24. }
  25. callback()
  26. },
  27. message: '两次密码输入不一致',
  28. trigger: 'change'
  29. }
  30. ]
  31. }

Form 表单 - 图5

复杂表单的校验案例

  1. <l-form is-submit-validate="{{isSubmitValidate}}" name="ruleForm" bind:linsubmit="submit" l-form-btn-class="l-form-btn-class">
  2. <l-form-item label="登录账号:" name="ruleName" rules="{{nameRules}}">
  3. <l-input id="ruleName" value="{{ruleForm.name}}" hide-label show-row="{{false}}"/>
  4. </l-form-item>
  5. <l-form-item rules="{{musicRules}}" label="选择歌曲:" name="ruleMusic" >
  6. <l-checkbox-group bind:linchange="change2" id="ruleMusic" placement="row">
  7. <l-checkbox
  8. l-class="l-checkbox-color"
  9. wx:for="{{items2}}"
  10. wx:key="{{item.id}}"
  11. placement="{{position}}"
  12. key="{{item.name}}"
  13. checked="{{item.checked}}"
  14. >
  15. {{item.name}}
  16. </l-checkbox>
  17. </l-checkbox-group>
  18. </l-form-item>
  19. <l-form-item label="选择性别:" name="ruleSex">
  20. <l-radio-group id="ruleSex" placement="row">
  21. <l-radio key="0">
  22. </l-radio>
  23. <l-radio key="1">
  24. </l-radio>
  25. </l-radio-group>
  26. </l-form-item>
  27. <l-form-item rules="{{scoreRules}}" label="自我评分:" name="ruleScore">
  28. <l-rate id="ruleScore" value="{{ruleForm.score}}" />
  29. </l-form-item>
  30. <l-form-item rules="{{descRules}}" label="性格描述:" name="ruleDesc">
  31. <l-textarea border="{{false}}" id="ruleDesc" value="{{ruleForm.desc}}" />
  32. </l-form-item>
  33. <view slot="submit">
  34. <l-button>提交验证</l-button>
  35. </view>
  36. <view slot="reset">
  37. <l-button type="default" plain>重置</l-button>
  38. </view>
  39. </l-form>
  1. data: {
  2. ruleForm: {
  3. name: '',
  4. music: '',
  5. sex: '',
  6. desc: '',
  7. score: ''
  8. },
  9. items: [
  10. {id: 1,name: '青瓷',checked: false},
  11. {id: 2,name: '双棍',checked: false},
  12. {id: 3,name: '明天',checked: false}
  13. ],
  14. items2: [
  15. {id: 1,name: '青瓷',checked: false},
  16. {id: 2,name: '双棍',checked: false},
  17. {id: 3,name: '明天',checked: false}
  18. ],
  19. tipType: 'toast',
  20. isSubmitValidate: false,
  21. alignType: 'start',
  22. nameRules: [
  23. { required: true, message: '请输入真实姓名', trigger: 'blur' },
  24. { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' },
  25. ],
  26. descRules: { min: 10, max: 50, message: '请输入10到50个字符的自我描述', trigger: 'change' },
  27. musicRules: [
  28. { type:'array', required: true, message: '歌曲必选', trigger: 'change' },
  29. ],
  30. scoreRules: [
  31. { type:'number',required: true, message: '请选择评分', trigger: 'blur' },
  32. {
  33. validator(rule, value, callback) {
  34. if(value < 3) {
  35. callback(false);
  36. } else {
  37. callback()
  38. }
  39. },
  40. message: '评分必须大于等于3分',
  41. trigger: 'change'
  42. }
  43. ]
  44. }

Form 表单 - 图6

校验规则属性 (Rules Attributes)

参数说明类型可选值默认值
enum枚举类型String--
len字段长度Number--
max最大长度Number--
message校验错误提示文案String--
min最小长度Number--
pattern正则表达式校验String--
required是否必选Boolean-false
type内建校验类型String见下表string
whitespace必选时,空格是否会被视为错误Boolean-false

更多高级用法可研究 async-validatorForm 表单 - 图7

TIP

提示:pattern属性的值需是 String,传入正则时,微信小程序不识别,会导致传入的 pattern 是个空的对象。

内置校验类型 (Type Value)

参数说明
string字符串
number数字
boolean布尔
method方法
regexp正则
integer整数
float浮点数字
array数组
object对象
enum枚举类型,值必须存在 enum 中
date日期
url网址
email邮箱
hex16进制

手动提交或重置表单

通过wx.lin.submitForm('formName')方法, 传入对应表单formname 属性提交表单 。

通过wx.lin.resetForm('formName')方法, 传入对应表单formname 属性重置表单 。

表单容器组件属性 (Form Attributes)

参数说明类型可选值默认值版本号
name表单的nameString—-—-—-
is-submit-validate提交时是否校验Booleantrue/falsetrue—-

表单容器组件外部样式类(Form ExternalClasses)

外部样式类名说明备注版本号
l-form-container-classform的外部样式类—-—-
l-form-btn-class按钮容器的外部样式类—-—-
l-form-submit-class提交按钮的外部样式类—-—-
l-form-reset-class重置按钮外部样式类—-—-

表单容器组件事件 (Form Events)

事件名称说明返回值备注版本号
bind:linsubmit点击提交按钮时触发点击提交时触发 linsubmit 事件,event.detail = {values: 整个表单项的value, errors: 表单内各字段的校验结果,isValidate: 表单是否验证通过}-—-
bind:linreset点击重置按钮时触发--

表单项组件属性(Form-Item Attributes)

参数说明类型可选值默认值版本号
labelform-item 的文字内容String
label-placement文字内容所在区域Stringrow/columnrow
align-items文字对齐方式Stringstart/end/centerstart
label-width文字内容的宽度String—-200rpx
label-slot是否开启文字内容插槽Booleantrue/falsefalse
namenameString
rules表单项的验证规则Object/Array
tip-type验证提示类型Stringtext/toast/messagetext

表单项组件外部样式类(Form-Item ExternalClasses)

外部样式类名说明备注版本号
l-form-item-classform-item的外部样式类
l-form-label-classform-item文字区域的外部样式类
l-form-content-classform-item内容区域的外部样式类
l-error-text-classform-item校验错误提示的外部样式类当 tip-type 为 text 时有效