UNPKG

cloud-ui.vusion

Version:
614 lines (518 loc) 22.3 kB
<!-- 该 README.md 根据 api.yaml 和 docs/*.md 自动生成,为了方便在 GitHub 和 NPM 上查阅。如需修改,请查看源文件 --> # UForm 表单 - [概述](#undefined) - [相关组件](#相关组件) - [示例](#示例) - [基本用法](#基本用法) - [行内](#行内) - [栅格布局](#栅格布局) - [标签块级布局](#标签块级布局) - [插槽](#插槽) - [数据转换](#数据转换) - [表单验证](#表单验证) - [UForm API](#uform-api) - [Props/Attrs](#propsattrs) - [Computed](#computed) - [Slots](#slots) - [Events](#events) - [Methods](#methods) - [UFormItem API](#uformitem-api) - [Props/Attrs](#propsattrs-2) - [Slots](#slots-2) - [Events](#events-2) - [Methods](#methods-2) - [UFormGroup API](#uformgroup-api) - [Props/Attrs](#propsattrs-3) - [Slots](#slots-3) - [Events](#events-3) **Form** 具有数据收集、校验和提交功能的表单,包含输入框、选择框、复选框、单选框等元素。 ### 相关组件 #### 表单 UForm 用于整体布局,集中设置属性,统一暴露事件和方法。 #### 验证器 UValidator 实现了基础的嵌套验证功能和原子化验证功能,包含提示样式。 #### 表单项 UFormItem 继承自验证器,具备所有验证器的功能。与验证器相比,是为了配合 UForm 布局方便而生。 #### 表单域(表单控件)MField MField 作为各种表单域(表单控件)的基类,用于触发 UValidator(或 UFormItem)的验证功能。 比如常见的:`<u-input>`、`<u-select>`、`<u-radios>`、`<u-date-picker>`都属于这一类。 #### 复杂动态验证组件 如:`<u-form-table-view>`和`<u-dynamic-cards>` ## 示例 ## 表单布局 ### 基本用法 ``` html <u-form gap="large"> <u-form-item label="计费方式" required> <u-radios value="0"> <u-radio label="0">包年包月</u-radio> <u-radio label="1">按量付费</u-radio> </u-radios> </u-form-item> <u-form-item label="实例名称" required> <u-input size="huge" maxlength="63" placeholder="由1-63个小写字母,数字,中划线组成,以字母开头,字母或数字结尾"></u-input> </u-form-item> <u-form-item label=" " required> <u-input size="huge" maxlength="63" placeholder="label为空的必填项"></u-input> </u-form-item> <u-form-item label="规格"> <u-capsules value="0101"> <u-capsule value="0101">1核 1GB</u-capsule> <u-capsule value="0102">1核 2GB</u-capsule> <u-capsule value="0204">2核 4GB</u-capsule> <u-capsule value="0408">4核 8GB</u-capsule> <u-capsule value="0816">8核 16GB</u-capsule> <u-capsule value="0832">8核 32GB</u-capsule> <u-capsule value="1664">16核 64GB</u-capsule> </u-capsules> </u-form-item> <u-form-item label="类型" description="高性能 SSD 云盘不支持快照功能" layout="block"> <u-capsules value="SSD"> <u-capsule value="SSD">SSD 云盘</u-capsule> <u-capsule value="HSSD">高性能 SSD 云盘</u-capsule> </u-capsules> </u-form-item> <u-form-item label="端口号" required> <u-input size="huge medium" maxlength="5" placeholder="1150-65535" value="3306"></u-input> </u-form-item> <u-form-item label="公网带宽"> <u-combo-slider :step="10" unit="Mbps"></u-combo-slider> </u-form-item> <u-form-item label="详情" layout="block"> <u-textarea size="huge"></u-textarea> </u-form-item> <u-form-item> <u-button color="primary">立即创建</u-button> </u-form-item> </u-form> ``` ### 行内 ``` html <u-form layout="inline" label-size="auto"> <u-form-item label="状态"> <u-select auto-select> <u-select-item>认证中</u-select-item> </u-select> </u-form-item> <u-form-item label="用户名"> <u-input maxlength="63" placeholder="请输入用户名"></u-input> </u-form-item> <u-form-item label="联系号码"> <u-input maxlength="63" placeholder="请输入联系号码"></u-input> </u-form-item> <u-form-item> <u-button color="primary">查询</u-button> </u-form-item> </u-form> ``` ### 栅格布局 使用栅格布局可以使多行表单对齐美观,设置 `repeat` 划分栅格数量,设置 `span` 占用对应空间。 ``` html <u-form repeat="3"> <u-form-item label="状态"> <u-select auto-select> <u-select-item>认证中</u-select-item> </u-select> </u-form-item> <u-form-item label="备案类型"> <u-select auto-select> <u-select-item>全部</u-select-item> </u-select> </u-form-item> <u-form-item label="备案号"> <u-input maxlength="63"></u-input> </u-form-item> <u-form-item label="用户名"> <u-input maxlength="63"></u-input> </u-form-item> <u-form-item label="单位名称"> <u-input maxlength="63"></u-input> </u-form-item> <u-form-item span="3"> <u-button color="primary">查询</u-button> </u-form-item> </u-form> ``` ### 标签块级布局 ``` html <u-linear-layout direction="vertical"> <u-panel title="结合默认布局"> <u-form label-layout="block"> <u-form-item label="计费方式" required> <u-radios value="0"> <u-radio label="0">包年包月</u-radio> <u-radio label="1">按量付费</u-radio> </u-radios> </u-form-item> <u-form-item label="实例名称" required description="高性能 SSD 云盘不支持快照功能"> <u-input size="huge" maxlength="63" placeholder="由1-63个小写字母,数字,中划线组成,以字母开头,字母或数字结尾"></u-input> </u-form-item> <u-form-item> <u-button color="primary">查询</u-button> </u-form-item> </u-form> </u-panel> <u-panel title="结合栅格布局"> <u-form repeat="3" label-layout="block"> <u-form-item label="状态"> <u-select auto-select> <u-select-item>认证中</u-select-item> </u-select> </u-form-item> <u-form-item label="备案类型"> <u-select auto-select> <u-select-item>全部</u-select-item> </u-select> </u-form-item> <u-form-item label="备案号"> <u-input maxlength="63"></u-input> </u-form-item> <u-form-item label="用户名"> <u-input maxlength="63"></u-input> </u-form-item> <u-form-item label="单位名称"> <u-input maxlength="63"></u-input> </u-form-item> <u-form-item span="3"> <u-button color="primary">查询</u-button> </u-form-item> </u-form> </u-panel> </u-linear-layout> ``` ### 插槽 - 通过`slot="label"`插槽自定义左侧内容 - 通过`slot="description"`插槽自定义描述内容 - 通过`slot='extra'`插槽自定义`label`右侧额外内容 ``` html <u-form ref="form"> <u-form-item required layout="block"> <span slot="label"> 用户名 </span> <div slot="description">描述描述</div> <u-icon-tooltip slot="extra" content="请输入正确格式的中文汉字"></u-icon-tooltip> <u-input maxlength="4" maxlength-message="不超过4个字符" placeholder="不超过4个字符"></u-input> </u-form-item> </u-form> ``` ## 数据收集与提交 推荐将各表单控件使用`v-model`绑定的数据,统一收集到`data`里的`model`对象中。 ``` vue <template> <u-form gap="large"> <u-form-item label="计费方式" required> <u-radios v-model="model.chargeType"> <u-radio label="0">包年包月</u-radio> <u-radio label="1">按量付费</u-radio> </u-radios> </u-form-item> <u-form-item label="实例名称" required> <u-input v-model="model.name" size="huge" maxlength="63" placeholder="由1-63个小写字母,数字,中划线组成,以字母开头,字母或数字结尾"></u-input> </u-form-item> <u-form-item label="规格"> <u-capsules v-model="model.spec"> <u-capsule value="0101">1核 1GB</u-capsule> <u-capsule value="0102">1核 2GB</u-capsule> <u-capsule value="0204">2核 4GB</u-capsule> <u-capsule value="0408">4核 8GB</u-capsule> <u-capsule value="0816">8核 16GB</u-capsule> <u-capsule value="0832">8核 32GB</u-capsule> <u-capsule value="1664">16核 64GB</u-capsule> </u-capsules> </u-form-item> <u-form-item label="类型" description="高性能 SSD 云盘不支持快照功能" layout="block"> <u-capsules v-model="model.type"> <u-capsule value="SSD">SSD 云盘</u-capsule> <u-capsule value="HSSD">高性能 SSD 云盘</u-capsule> </u-capsules> </u-form-item> <u-form-item label="端口号" required> <u-input v-model.number="model.port" size="huge normal" maxlength="5" placeholder="1150-65535"></u-input> </u-form-item> <u-form-item label="公网带宽"> <u-combo-slider v-model="model.bandwidth" :step="10" unit="Mbps"></u-combo-slider> </u-form-item> <u-form-item label="描述" layout="block"> <u-textarea v-model="model.description" size="huge"></u-textarea> </u-form-item> <u-form-item> <u-button color="primary" @click="submit()">立即创建</u-button> </u-form-item> </u-form> </template> <script> export default { data() { return { model: { chargeType: '0', name: '', spec: '0101', type: 'SSD', port: '', bandwidth: 10, description: '', }, }; }, methods: { submit() { console.log(this.model); this.$toast.show('没有验证,直接提交成功!'); }, }, }; </script> ``` ### 数据转换 有时 UI 中的数据与向后端提交的数据不完全一致,可以将`v-model`分解为一个`:value`属性绑定 + `@input`事件,做临时转换。 对于需要保持数字类型的,可以直接使用 Vue 的 `v-model` 的 `.number` 修饰符。 ``` vue <template> <u-form gap="large"> <u-form-item label="超时时长" required> <u-input size="huge normal" maxlength="5" placeholder="300-10000" :value="model.timeout / 1000" @input="model.timeout = $event * 1000"></u-input> </u-form-item> <u-form-item label="端口号" required> <u-input v-model.number="model.port" size="huge normal" maxlength="5" placeholder="1150-65535"></u-input> </u-form-item> <u-form-item> <u-button color="primary" @click="submit()">立即创建</u-button> </u-form-item> </u-form> </template> <script> export default { data() { return { model: { timeout: 900000, port: '', }, }; }, methods: { submit() { console.log(this.model); this.$toast.show('没有验证,直接提交成功!'); }, }, }; </script> ``` ### 表单验证 需要在`<u-form-item>`的`rules`属性添加验证规则,输入和失焦会自动触发验证,点击提交按钮时,需要手动调用 form 的`validate`方法。 可以根据`@validate`事件监听表单的验证状态。 关于验证规则的详细使用,参见 [UValidator](#components/u-validator)。 ```vue <template> <u-form ref="form" gap="large"> <u-form-item label="计费方式" required> <u-radios v-model="model.chargeType"> <u-radio label="0">包年包月</u-radio> <u-radio label="1">按量付费</u-radio> </u-radios> </u-form-item> <u-form-item label="实例名称" required rules="required | ^az | az09$ | ^az09-$ | rangeLength(1,63)" validateMessage="错误"> <u-input v-model="model.name" size="huge" maxlength="63" placeholder="由1-63个小写字母,数字,中划线组成,以字母开头,字母或数字结尾"></u-input> </u-form-item> <u-form-item label="规格"> <u-capsules v-model="model.spec"> <u-capsule value="0101">1核 1GB</u-capsule> <u-capsule value="0102">1核 2GB</u-capsule> <u-capsule value="0204">2核 4GB</u-capsule> <u-capsule value="0408">4核 8GB</u-capsule> <u-capsule value="0816">8核 16GB</u-capsule> <u-capsule value="0832">8核 32GB</u-capsule> <u-capsule value="1664">16核 64GB</u-capsule> </u-capsules> </u-form-item> <u-form-item label="类型" description="高性能 SSD 云盘不支持快照功能" layout="block"> <u-capsules v-model="model.type"> <u-capsule value="SSD">SSD 云盘</u-capsule> <u-capsule value="HSSD">高性能 SSD 云盘</u-capsule> </u-capsules> </u-form-item> <u-form-item label="端口号" required rules="required | integer | range(1150,65535)"> <u-input v-model.number="model.port" size="huge normal" maxlength="5" placeholder="1150-65535"></u-input> </u-form-item> <u-form-item label="公网带宽"> <u-combo-slider v-model="model.bandwidth" :step="10" unit="Mbps"></u-combo-slider> </u-form-item> <u-form-item label="描述" layout="block" rules="minLength(8)"> <u-textarea v-model="model.description" size="huge"></u-textarea> </u-form-item> <u-form-item> <u-button color="primary" @click="submit">立即创建</u-button> </u-form-item> </u-form> </template> <script> export default { data() { return { model: { chargeType: '0', name: '', spec: '0101', type: 'SSD', port: '', bandwidth: 10, description: '', }, }; }, methods: { async submit() { const result = await this.$refs.form.validate(); if (result.valid) this.$toast.show('验证通过,提交成功!'); else this.$toast.show('验证失败!'); }, }, }; </script> ``` ## UForm API ### Props/Attrs | Prop/Attr | Type | Options | Default | Description | | --------- | ---- | ------- | ------- | ----------- | | model | object | | | 表单数据模型 | | size | string | `[object Object]`<br/>`[object Object]` | `'normal'` | | | rules | object | | | 验证规则。简写格式为字符串类型,完整格式或混合格式为数组类型 | | layout | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'block'` | | | repeat | number | | `1` | 整个表单的划分列数 | | label-layout | string | `[object Object]`<br/>`[object Object]` | `'inline'` | | | label-ellipsis | boolean | | `false` | 文字过长是否省略显示。默认文字超出时会换行。 | | collapsible | boolean | | `false` | 设置是否可以展开/折叠 | | accordion | boolean | | `false` | 设置是否每次只展开一个 | | expand-trigger | string | `[object Object]`<br/>`[object Object]` | `'click'` | 展开/折叠操作的触发方式 | | gap-width | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'normal'` | 设置表单列间隔大小 | | gap-height | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'normal'` | 设置表单行间隔大小 | | label-size | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'normal'` | | ### Computed | Computed | Type | Description | | -------- | ---- | ----------- | | touched | boolean | 用户是否触碰 | | dirty | boolean | 用户是否修改值 | | valid | boolean | 验证是否通过 | | firstError | string | 第一个错误提示消息 | ### Slots #### (default) 插入`<u-form-item>`子组件。 ### Events #### @validate 验证时触发 | Param | Type | Description | | ----- | ---- | ----------- | | $event | object | 自定义事件对象 | | $event.trigger | string | 本次验证的触发方式 | | $event.valid | boolean | 验证是否通过 | | $event.touched | boolean | 用户是否触碰 | | $event.dirty | boolean | 用户是否修改值 | | $event.firstError | string | 第一个错误提示消息 | | senderVM | UValidator | 发送事件实例 | Methods #### validate(trigger, muted) 手动验证。 | Param | Type | Default | Description | | ----- | ---- | ------- | ----------- | | trigger | string | `'submit'` | 触发方式,可选值:`submit`、`blur`和`input`之一,或者它们的任意组合。 | | muted | boolean | `false` | 是否验证后无提示 | #### validateItem(name, trigger, muted) 验证表单中的某一项,已废弃。表单中的项是嵌套的,用 name 层级较深,而且可能有重名。 | Param | Type | Default | Description | | ----- | ---- | ------- | ----------- | | name | string | | 表单项的 name | | trigger | string | `'submit'` | 触发方式,可选值:`submit`、`blur`和`input`之一,或者它们的任意组合。 | | muted | boolean | `false` | 是否验证后无提示 | ## UFormItem API ### Props/Attrs | Prop/Attr | Type | Options | Default | Description | | --------- | ---- | ------- | ------- | ----------- | | name | string | | | 表单项名称。已废弃 | | label | string | | | 用于左侧显示,同时用于提示消息的合成 | | muted | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'none'` | 验证是否静默 | | placement | string | `[object Object]`<br/>`[object Object]` | `'right'` | 改变提示信息显示位置 | | ignore-rules | boolean | | `false` | 忽略验证规则。已废弃,同`ignore-validation` | | validating-options | object | | | 验证辅助对象。在 Rule 的 `validate` 方法中使用 | | validating-value | any | | | 临时修改验证值 | | validating-process | Function | | | 验证前对值进行预处理 | | span | string | | `1` | 列跨越的格数 | | label-layout | string | `[object Object]`<br/>`[object Object]` | `'inline'` | | | label-ellipsis | boolean | | `false` | 文字过长是否省略显示。默认文字超出时会换行。 | | required | boolean | | `false` | 是否必填。仅显示样式,如果要验证必填项,需要在`rules`中添加必填规则。 | | required-position | string | `[object Object]`<br/>`[object Object]` | `'right'` | undefined | | message | string | | | 鼠标悬浮标签后的图标显示释义提示信息 | | description | string | | | 辅助说明的文本信息 | | layout | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'center'` | 标签与表单元素的纵轴对齐方式,默认为顶对齐 | | rules | string \| Array | | | 验证规则。简写格式为字符串类型,完整格式或混合格式为数组类型 | | ignore-validation | boolean | | `false` | | | field-size | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'normal'` | 单独设置表单项的内容大小 | | label-size | string | `[object Object]`<br/>`[object Object]`<br/>`[object Object]`<br/>`[object Object]` | `'normal'` | | ### Slots #### (default) 插入文本或 HTML。 #### label 插入自定义标签,代替`label`属性。 #### description 插入自定义描述内容,代替`description`属性。 #### extra 自定义标签右侧额外内容。 ### Events #### @validate 对于第一个 Field 或者所有子 UValidator: | Param | Type | Description | | ----- | ---- | ----------- | | $event.valid | boolean | 验证是否通过 | | $event.touched | boolean | 用户是否触碰 | | $event.dirty | boolean | 用户是否修改值 | | $event.firstError | string | 第一个错误提示消息 | | senderVM | UValidator | 发送事件实例 | Methods #### validate(trigger, muted) 验证此表单项。 | Param | Type | Default | Description | | ----- | ---- | ------- | ----------- | | trigger | string | `'submit'` | 触发方式,可选值:`submit`、`blur`和`input`之一,或者它们的任意组合。 | | muted | boolean | `false` | 是否验证后无提示 | ## UFormGroup API ### Props/Attrs | Prop/Attr | Type | Options | Default | Description | | --------- | ---- | ------- | ------- | ----------- | | title | string | | | | | repeat | number | | `1` | 整个表单的划分列数 | | label-layout | string | `[object Object]`<br/>`[object Object]` | `'inline'` | | | label-ellipsis | boolean | | `false` | 文字过长是否省略显示。默认文字超出时会换行。 | | collapsible | boolean | | `false` | 设置是否可以展开/折叠 | | expanded.sync | boolean | | `false` | 展开状态分为“True(展开)/False(折叠)”,默认为“展开” | | disabled | boolean | | `false` | 置灰显示,且禁止展开/折叠操作 | ### Slots #### (default) 插入`<u-form-item>`或`<u-form-divider>`子组件。 #### title 自定义标题文本。 #### extra 在右侧可以附加内容。 ### Events #### @before-toggle 展开/折叠此分组前触发 | Param | Type | Description | | ----- | ---- | ----------- | | $event | object | 自定义事件对象 | | $event.expanded | boolean | 展开/折叠状态 | | $event.groupVM | UFormGroup | 分组组件 | | $event.preventDefault | Function | 阻止展开/折叠流程 | | senderVM | Vue | 发送事件实例 | #### @toggle 展开/折叠某分组时触发 | Param | Type | Description | | ----- | ---- | ----------- | | $event | object | 自定义事件对象 | | $event.expanded | boolean | 展开/折叠状态 | | $event.groupVM | UFormGroup | 分组组件 | | senderVM | Vue | 发送事件实例 |