# Form 表单


# 引入

在 app.json 或 index.json 中引入组件,详细介绍见快速上手

"usingComponents": {
  "lin-form": "/dist/form/index",
  "lin-form-item": "/dist/form-item/index"
}

# 基础使用

Form 组件中,每一个表单域由一个 FormItem 组件构成,表单域中可以放置各种类型的表单控件。

代码示例
<lin-form model="{ {student1}}">
  <lin-form-item label="姓名:">
    <lin-field
      bind:change="onChange"
      data-key="student1.name"
      placeholder="请输入姓名"
      titleWidth="0"
      border="{ {false}}"
      value="{ {student1.name}}"
    />
  </lin-form-item>
  <lin-form-item label="爱好:">
    <lin-checkbox-group
      direction="row"
      data-key="student1.hobby"
      value="{ { student1.hobby }}"
      bind:change="onChange"
    >
      <lin-checkbox style="margin-right: 10rpx;" name="a">篮球</lin-checkbox>
      <lin-checkbox style="margin-right: 10rpx;" name="b">足球</lin-checkbox>
      <lin-checkbox name="c">排球</lin-checkbox>
    </lin-checkbox-group>
  </lin-form-item>
  <lin-form-item label="性别:">
    <lin-radio-group
      direction="row"
      data-key="student1.sex"
      value="{ { student1.sex }}"
      bind:change="onChange"
    >
      <lin-radio style="margin-right: 10rpx;" name="man"></lin-radio>
      <lin-radio name="woman"></lin-radio>
    </lin-radio-group>
  </lin-form-item>
  <lin-form-item label="公开:">
    <lin-switch
      data-key="student1.public"
      checked="{ { student1.public }}"
      bind:change="onChange"
    />
  </lin-form-item>
  <view slot="footer">
    <lin-button type="primary" bind:click="submit1">提交</lin-button>
    <lin-button style="margin-left: 20rpx;" bind:click="reset1">重置</lin-button>
  </view>
</lin-form>
Page({
  data: {
    student1: {
      name: "",
      hobby: [],
      sex: "",
      public: false,
    },
  },
  submit1() {
    wx.showToast({
      title: "提交",
      icon: "none",
    });
  },

  reset1() {
    wx.showToast({
      title: "重置",
      icon: "none",
    });
    this.setData({
      student1: {
        name: "",
        hobby: [],
        sex: "",
        public: false,
      },
    });
  },
  onChange(event) {
    const { key } = event.currentTarget.dataset;
    this.setData({
      [key]: event.detail,
    });
  },
});

# 表单校验

Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 FormItemname 属性设置为需校验的字段名即可

代码示例
<lin-form id="form" model="{ {student2}}" rules="{ {rules}}">
  <lin-form-item label="姓名:" name="name">
    <lin-field
      bind:change="onChange"
      data-key="student2.name"
      placeholder="请输入姓名"
      titleWidth="0"
      border="{ {false}}"
      value="{ {student2.name}}"
    />
  </lin-form-item>
  <lin-form-item label="爱好:" name="hobby">
    <lin-checkbox-group
      direction="row"
      data-key="student2.hobby"
      value="{ { student2.hobby }}"
      bind:change="onChange"
    >
      <lin-checkbox style="margin-right: 10rpx;" name="a">篮球</lin-checkbox>
      <lin-checkbox style="margin-right: 10rpx;" name="b">足球</lin-checkbox>
      <lin-checkbox name="c">排球</lin-checkbox>
    </lin-checkbox-group>
  </lin-form-item>
  <lin-form-item label="性别:" name="sex">
    <lin-radio-group
      direction="row"
      data-key="student2.sex"
      value="{ { student2.sex }}"
      bind:change="onChange"
    >
      <lin-radio style="margin-right: 10rpx;" name="man"></lin-radio>
      <lin-radio name="woman"></lin-radio>
    </lin-radio-group>
  </lin-form-item>
  <lin-form-item label="公开:" name="public">
    <lin-switch
      data-key="student2.public"
      checked="{ { student2.public }}"
      bind:change="onChange"
    />
  </lin-form-item>
  <view slot="footer">
    <lin-button type="primary" bind:click="submit2">提交</lin-button>
    <lin-button style="margin-left: 20rpx;" bind:click="reset2">重置</lin-button>
  </view>
</lin-form>
Page({
  data: {
    student2: {
      name: "",
      hobby: [],
      sex: "",
      public: false,
    },
    rules: {
      name: [
        {
          required: true,
          message: "姓名不能为空",
          trigger: "blur",
        },
      ],
      hobby: [
        {
          required: true,
          message: "爱好不能为空",
          validator(rule, value, callback) {
            if (value.length === 0) {
              callback(new Error("爱好不能为空"));
            } else {
              callback();
            }
          },
        },
      ],
      sex: [
        {
          required: true,
          message: "性别不能为空",
        },
      ],
      public: [
        {
          required: true,
          message: "请选择是否公开",
        },
      ],
    },
  },
  submit2(event) {
    const $form = this.selectComponent("#form");
    $form.checkValue((flag) => {
      console.log(flag);
    });
  },
  reset2() {
    this.setData({
      student2: {
        name: "",
        hobby: [],
        sex: "",
        public: false,
      },
    });
  },
  onChange(event) {
    const { key } = event.currentTarget.dataset;
    this.setData({
      [key]: event.detail,
    });
  },
});

# Form 属性

参数 说明 类型 可选值 默认值
labelWidth 表单域标签的宽度 String, Number
flexDirection 表单域对齐方式 String column, row row
rules 表单验证规则 Object
model 表单数据对象 Object

# Form 事件

事件名 说明 参数
bind:validate 任一表单项被校验后触发 被校验的表单项 prop 值,校验是否通过,错误消息(如果存在)

# Form 插槽

插槽名称 说明
一般是 FormItem 组件
footer 表单底部内容

# Form 外部样式类

类名 说明
custom-class 根节点样式类
footer-class 底部样式类

# Form 方法

方法名 参数 返回值 介绍
checkValue Function(callback: Function(boolean, object)) 对整个表单进项校验
clearValidate 移除表单项的校验结果

# FormItem 属性

参数 说明 类型 可选值 默认值
label 标签文本 String
name 表单域 model 字段 String 传入 Form 组件的 model 中的字段
labelWidth 表单域标签的宽度 String, Number
flexDirection 表单域对齐方式 String column, row
rules 表单验证规则 Array
hideRequiredAsterisk 是否隐藏 * Boolean false
showMessage 是否显示校验错误信息 Boolean true

# Form 外部样式类

类名 说明
custom-class 根节点样式类
label-class 标签文本样式类
content-class 内容样式类
errormsg-class 校验错误信息样式类