Form 表单

代码演示

0 / 20

基础用法

表单组件 <w-form /> 由<w-form-item />组件包裹常见表单元素如: input、checkbox、radio、switch、select等构成的。

查看代码 < />

<template>
  <w-form :model="form" label-width="85px">
    <w-form-item label="医院名称">
      <w-input v-model="form.hosName" :maxlength="20" showCounter
        placeholder="如:上海华山附属医院"></w-input>
    </w-form-item>
    <w-form-item label="所在区">
      <w-select v-model="form.zoom" placeholder="请选择">
        <w-option v-for="item in zooms"
          :key="item.value"
          :label="item.label"
          :value="item.value">
        </w-option>
      </w-select>
    </w-form-item>
    <w-form-item label="时间选择">
      <w-date-picker v-model="form.range"
        type="daterange"
        range-separator="至"
        start-placeholder="开始日期"
        end-placeholder="结束日期">
      </w-date-picker>
    </w-form-item>
    <w-form-item label="加急">
      <w-switch v-model="form.urgent"
        active-color="#0F49ED"
        inactive-color="#C5D0D9">
      </w-switch>
    </w-form-item>
    <w-form-item label="常用项目">
      <w-checkbox-group v-model="form.project">
        <w-checkbox :label="1">阶段小结</w-checkbox>
        <w-checkbox :label="2">查房纪录</w-checkbox><br />
        <w-checkbox :label="3">就诊记录</w-checkbox>
        <w-checkbox :label="4">文件汇总</w-checkbox>
      </w-checkbox-group>
    </w-form-item>
    <w-form-item label="显示病史">
      <w-radio-group v-model="form.isShow">
        <w-radio :label="true">显示</w-radio>
        <w-radio :label="false">不显示</w-radio>
      </w-radio-group>
    </w-form-item>
    <w-form-item label="医嘱补录">
      <w-input v-model="form.note" type="textarea"
        placeholder="请对病人医嘱进行补录" :rows="6"></w-input>
    </w-form-item>
    <w-form-item style="text-align: right;">
      <w-button>取 消</w-button>
      <w-button type="primary" @click="submit">发 送</w-button>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      zooms: [{
        value: '选项1',
        label: '安徽省合肥市蜀山区'
      }, {
        value: '选项2',
        label: '安徽省合肥市庐阳区'
      }, {
        value: '选项3',
        label: '安徽省合肥市瑶海区'
      }, {
        value: '选项4',
        label: '安徽省合肥市政务区'
      }],
      form: {
        zoom: '',
        range: '',
        hosName: '',
        urgent: false,
        project: [],
        isShow: true,
        note: ''
      }
    }
  },
  methods: {
    submit () {
      console.log(this.form)
    }
  }
}
</script>
安徽省第二附属医院
安徽省合肥市蜀山区
张生
30岁

纯文本表单

为表单添加属性text, 即可切换为纯文本表单, 这种模式用于表单型纯文本信息的展示。

查看代码 < />

<template>
  <w-form label-width="85px" label-align="right" text>
    <w-form-item v-for="(item, index) in list"
      :key="index" :label="item.label">
      {{item.value}}
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      list: [{
        label: '医院名称',
        value: '安徽省第二附属医院'
      }, {
        label: '医院地址',
        value: '安徽省合肥市蜀山区'
      }, {
        label: '患者姓名',
        value: '张生'
      }, {
        label: '年龄',
        value: '30岁'
      }, {
        label: '性别',
        value: '男'
      }]
    }
  }
}
</script>

对齐方式

组件的 label 对齐方式默认为 left, 可选值有 left, right, center, top。

查看代码 < />

<template>
  <w-radio-group v-model="align" class="align-radio">
    <w-radio label="left">居左</w-radio>
    <w-radio label="right">居右</w-radio>
    <w-radio label="center">居中</w-radio>
    <w-radio label="top">顶部</w-radio>
  </w-radio-group>
  <w-form :model="form" label-width="110px" :label-align="align">
    <w-form-item label="就诊医院名称">
      <w-input v-model="form.hosName"
        placeholder="如:上海华山附属医院"></w-input>
    </w-form-item>
    <w-form-item label="是否接种">
      <w-radio-group v-model="form.inoculation">
        <w-radio :label="true">接种</w-radio>
        <w-radio :label="false">不接种</w-radio>
      </w-radio-group>
    </w-form-item>
    <w-form-item label="医嘱补录">
      <w-input v-model="form.note" type="textarea" placeholder="请输入患者医嘱"
        :rows="4"></w-input>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      align: 'left',
      form: {
        hosName: '',
        inoculation: false,
        note: ''
      }
    }
  }
}
</script>

行内表单

为组件添加inline属性,就可以将表单变成行内表单。

查看代码 < />

<template>
  <w-form :model="form" ref="form" label-width="80px" inline>
    <w-form-item label="用户名" prop="name">
      <w-input v-model="form.name" placeholder="请输入用户名"></w-input>
    </w-form-item>
    <w-form-item label="密码" prop="password">
      <w-input
        v-model="form.password"
        placeholder="请输入密码"
        type="password"
      ></w-input>
    </w-form-item>
    <w-form-item>
      <w-button type="primary">登 录</w-button>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      form: {
        name: ''
      }
    }
  }
}
</script>
4 / 20

表单验证

参考element-ui表单验证逻辑, 基于 async-validator 为表单提供基础验证机制。

查看代码 < />

<template>
  <w-form :model="form" ref="form" label-width="85px" :rules="rules">
    <w-form-item label="医院名称" prop="hosName.name" required>
      <w-input v-model="form.hosName.name" :maxlength="20" showCounter
        placeholder="如:上海华山附属医院"></w-input>
    </w-form-item>
    <w-form-item label="区域" prop="region">
      <w-select v-model="form.region" placeholder="请选择">
        <w-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value">
        </w-option>
      </w-select>
    </w-form-item>
    <w-form-item label="地址" prop="place">
      <w-cascader
        :options="placeOptions"
        v-model="form.place"
        clearable
      ></w-cascader>
    </w-form-item>
    <w-form-item label="类型" prop="type">
      <w-tree-select
        v-model="form.type"
        v-bind="treeSelectParams">
      </w-tree-select>
    </w-form-item>
    <w-form-item label="时间选择" prop="range">
      <w-date-picker v-model="form.range"
        type="daterange"
        range-separator="至"
        start-placeholder="开始日期"
        end-placeholder="结束日期">
      </w-date-picker>
    </w-form-item>
    <w-form-item label="常用项目" prop="project">
      <w-checkbox-group v-model="form.project">
        <w-checkbox :label="1">阶段小结</w-checkbox>
        <w-checkbox :label="2">查房纪录</w-checkbox><br />
        <w-checkbox :label="3">就诊记录</w-checkbox>
        <w-checkbox :label="4">文件汇总</w-checkbox>
      </w-checkbox-group>
    </w-form-item>
    <w-form-item label="显示病史" prop="isShow">
      <w-radio-group v-model="form.isShow">
        <w-radio :label="true">显示</w-radio>
        <w-radio :label="false">不显示</w-radio>
      </w-radio-group>
    </w-form-item>
    <w-form-item label="加急" prop="urgent">
      <w-switch v-model="form.urgent"
        active-color="#0F49ED"
        inactive-color="#C5D0D9">
      </w-switch>
    </w-form-item>
    <w-form-item label="医嘱补录" prop="note">
      <w-input
        v-model="form.note"
        type="textarea"
        placeholder="请对病人医嘱进行补录"
        :rows="6">
      </w-input>
    </w-form-item>
    <w-form-item style="text-align: right;">
      <w-button @click="reset">重 置</w-button>
      <w-button type="primary" @click="submit">发 送</w-button>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      rules: {
        'hosName.name': [{
          required: true, message: '请输入医院名称', trigger: ['blur']
        }],
        region: [{
          required: true, message: '请选择区域', trigger: 'change'
        }],
        place: [{
          required: true, type: 'array', message: '请选择地址', trigger: 'change'
        }],
        type: [{
          required: true, type: 'array', message: '请选择医院类型', trigger: 'change'
        }],
        range: [{
          required: true, type: 'array', message: '请选择时间范围', trigger: 'change'
        }],
        project: [{
          required: true, type: 'array', message: '请选择常用项目', trigger: 'change'
        }],
        isShow: [{
          required: true, type: 'boolean', message: '请选择是否显示病历', trigger: 'change'
        }],
        note: [{
          required: true, message: '请补录医嘱内容', trigger: 'blur'
        }]
      },
      form: {
        zoom: '',
        type: ['1', '2-2'],
        place: ['110000', '110100', '110101'],
        range: [],
        project: [],
        hosName: {
          name: '省立医院'
        },
        urgent: '',
        isShow: '',
        note: '',
        region: '',
      },
      treeSelectParams: {
        multiple: true,
        clearable: true,
        placeholder: '请选择类型',
        treeClickParent: true,
        filterable: false,
        'check-strictly': true,
        'default-expand-all': true,
        'expand-on-click-node': false,
        treeData: [
          {
            testId: '1',
            name: '综合医院',
            disabled: true,
            child: [
              {
                testId: '1-1',
                name: '省立医院'
              }
            ]
          },
          {
            testId: '2',
            name: '肿瘤医院',
            child: [
              {
                testId: '2-2',
                disabled: true,
                name: '省立肿瘤医院'
              }
            ]
          },
          {
            testId: '3',
            name: '妇幼医院'
          },
        ],
        treeProps: {
          children: 'child',
          label: 'name',
          disabled: 'disabled',
          value: 'testId'
        }
      },
      options: [
        {
          value: '选项1',
          label: '安徽'
        }, {
          value: '选项2',
          label: '上海'
        }, {
          value: '选项3',
          label: '北京'
        }, {
          value: '选项4',
          label: '南京'
        }, {
          value: '选项5',
          label: '深圳'
        }
      ],
      placeOptions: regionData,
    }
  },
  methods: {
    submit () {
      this.$refs.form.validateForm((valid) => {
        if (valid) {
          // 通过验证
          console.log('submit !')
        } else {
          // 未通过
          console.log('invalid form !')
        }
      })
    },
    reset () {
      this.$refs.form.resetFields()
    }
  }
}
</script>

WARNING

对于非自定义的表单验证,对于值的判定包含类型判断。在定义字段规则(rules)时,默认字段类型为string类型,此时可以不需要定义type字段,否则需要手动定义类型,否则在表单验证时将因类型不符造成验证失败的问题。

忘记密码

自定义验证

rules中的 validator 属性用于指定自定义验证的函数。

查看代码 < />

<template>
  <w-form :model="form" ref="form" label-width="70px" :rules="rules">
    <w-form-item label="用户名" prop="name">
      <w-input v-model="form.name" placeholder="请输入用户名"></w-input>
    </w-form-item>
    <w-form-item label="密码" prop="password">
      <w-input v-model="form.password" showCounter :maxlength="6"
        :minlength="6" placeholder="请输入密码" type="password"></w-input>
    </w-form-item>
    <w-form-item label="">
      <div class="option-zoom">
        <w-checkbox v-model="form.rememberme" :label="true">记住我</w-checkbox>
        <a href="#" class="forget-password">忘记密码</a>
      </div>
    </w-form-item>
    <w-form-item>
      <w-button type="primary" @click="submit">登 录</w-button>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    const validatePassword = (rule, value, cb) => {
      if (value.length !== 6) return cb(new Error('请输入6位数密码'))
      cb()
    }
    return {
      rules: {
        name: [{
          required: true, message: '请输入用户名', trigger: ['blur']
        }],
        password: [{
          validator: validatePassword, trigger: ['blur']
        }]
      },
      form: {
        name: '',
        password: ''
      }
    }
  },
  methods: {
    submit () {
      this.$refs.form.validateForm((valid) => {
        if (valid) {
          // 通过验证
          console.log('submit !')
        } else {
          // 未通过
          console.log('invalid form !')
        }
      })
    },
    reset () {
      this.$refs.form.resetFields()
    }
  }
}
</script>

表单单元验证

可以通过为form-item添加rules的方式, 来解决部分表单元素或在v-for中使用表单元素的验证问题.

查看代码 < />

<template>
  <w-form :model="form" ref="form" label-width="85px">
    <template v-for="(item, index) of form.dynamicArr">
      <w-form-item
        :key="index"
        :label="item.label" :prop="`dynamicArr.${index}.value`"
        :rules="[{
          required: true, message: '该项为必填项', trigger: ['blur']
        }]">
        <w-input v-model="form.dynamicArr[index].value"></w-input>
      </w-form-item>
    </template>
    <w-form-item style="text-align: right;">
      <w-button @click="reset">重 置</w-button>
      <w-button type="primary" @click="submit">发 送</w-button>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      form: {
        dynamicArr: [{
          label: '医院名称',
          value: ''
        }, {
          label: '患者姓名',
          value: ''
        }]
      }
    }
  },
  methods: {
    submit () {
      this.$refs.form.validateForm((valid) => {
        if (valid) {
          // 通过验证
          console.log('submit !')
        } else {
          // 未通过
          console.log('invalid form !')
        }
      })
    },
    reset () {
      this.$refs.form.resetFields()
    }
  }
}
</script>

WARNING

sizes的值必须是 large, medium, small, mini等固定值才能生效, 否则以表单元素自身的大小为准。

尺寸选择

w-form 组件接受一个参数 sizes 用于控制表单元素的大小。

查看代码 < />

<template>
  <w-radio-group v-model="sizes" class="align-radio">
    <w-radio label="large">large</w-radio>
    <w-radio label="medium">medium</w-radio>
    <w-radio label="small">small</w-radio>
    <w-radio label="mini">mini</w-radio>
  </w-radio-group>
  <w-form :model="form" label-width="110px" :sizes="sizes">
    <w-form-item label="就诊医院名称">
      <w-input v-model="form.hosName"
        placeholder="如:上海华山附属医院"></w-input>
    </w-form-item>
    <w-form-item label="是否接种">
      <w-radio-group v-model="form.inoculation">
        <w-radio :label="true">接种</w-radio>
        <w-radio :label="false">不接种</w-radio>
      </w-radio-group>
    </w-form-item>
    <w-form-item label="医嘱补录">
      <w-input v-model="form.note" type="textarea" placeholder="请输入患者医嘱"
        :rows="4"></w-input>
    </w-form-item>
    <w-form-item style="text-align: right;">
      <w-button>取 消</w-button>
      <w-button type="primary">发 送</w-button>
    </w-form-item>
  </w-form>
</template>
<script>
export default {
  data () {
    return {
      sizes: 'medium',
      form: {
        hosName: '',
        inoculation: false,
        note: ''
      }
    }
  }
}
</script>

API

Form Attributes

参数 说明 类型 可选值 默认值 Version
inline 是否为行内表单 Boolean
label-width label的长度, 支持auto属性,label自由展开 String v1.7.10
label-align label对齐方式 String left, right, center, top left
model 表单绑定的数据 Object
rules 表单的验证规则 Object
sizes 控制表单元素大小 String large, medium, small, mini -
text 是否为纯文本表单 Boolean

Form Methods

事件名称 说明 回调参数 Version
clearValidate 清除表单元素的验证结果(props可以是 string | array 如果不传参则默认清空所有表单元素的验证结果) Function(props: string | array) v1.5.22
resetFields 重置表单, 将字段值重置为初始值
validateField 验证表单部分字段 Function (props: array | string, cb) v1.4.13
validateForm 验证表单(回调函数第一个参数valid表示表单是否验证成功, 第二个参数invalidFields是所有未通过验证的表单字段) Function (cb: Function(valid, invalidFields)) v1.5.25

Form-Item Attributes

参数 说明 类型 可选值 默认值 Version
label label的文本值 String
label-width label的长度, 支持auto(优先级高于form中的labelWidth属性) String v1.7.12
prop 在表单model中的所属字段, 需要验证或重置表单时必填 String
rules 该表单的验证规则 Array
required 是否必填 Boolean true
showMessage 是否显示提示文字 Boolean true

Form-Item Slot

参数 说明 Version
表单元素
label 表单的标签

贡献者

类型 参与者
设计者 UED视觉组
维护者 UED前端组
上次更新: 12/24/2020, 9:46:11 AM