Form 表单
代码演示
基础用法
表单组件 <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>
纯文本表单
为表单添加属性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>
表单验证
参考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前端组 |