drip-ui
Version:
Lightweight Mobile UI Components built on Vue
356 lines (330 loc) • 10.2 kB
Markdown
## Form 表单
### 使用指南
``` javascript
import { Form } from 'drip-ui';
Vue.use(Form);
```
### 代码演示
```html
<drip-form
:size="'small'"
ref="applierForm"
:title="'投保人信息'"
:list="applierList"
="selectInputRightBtn">
</drip-form>
<drip-button
class="form-submit"
="submit"
size="large"
type="orange">
提交校验
</drip-button>
<!-- 弹框 -->
<drip-popup
v-model="popup.show"
:title="popup.title"
position="bottom"
:submitBtn="true">
<div slot="content">
<drip-picker
v-if="popup.type === 'applierDepositBank'"
:slots="bankList"
value-key="name"
="onValuesChange">
</drip-picker>
</div>
<drip-button
slot="button"
="popupSelect"
size="large"
type="orange">
完成
</drip-button>
</drip-popup>
```
```javascript
// index.js
import { applierUserFn } from './data'
export default {
data () {
return {
applierList: [], // 表单数据
relTypeList: [{ // 选择关系列表
name: '本人',
value: 1
}, {
name: '配偶',
value: 2
}, {
name: '父母',
value: 3
}, {
name: '子女',
value: 4
}],
bankList: [{ // 银行卡列表
flex: 1,
defaultIndex: 1,
values: [{
name: '招商银行',
value: 111
}, {
name: '北京银行',
value: 222
}, {
name: '中国银行',
value: 333
}, {
name: '濮阳银行',
value: 444
}]
}],
popup: { // popup弹框
show: false,
title: '',
type: ''
},
inputLocation: {}, // 存储当前选中的对象
pickerMiddleware: [] // 存储picker当前选中的内容
}
},
mounted () {
this.applierList = applierUserFn(this.relTypeList)
},
methods: {
selectInputRightBtn (data) {
// 存储当前选中对象
this.inputLocation = data
const {item: {name, label}} = data
this.popup = {
type: name,
title: label,
show: true
}
},
onValuesChange (picker, values) {
// 存储当前picker选择数据
this.pickerMiddleware = values
},
// 选择popup弹框
popupSelect () {
this.popup.show = false
const { index } = this.inputLocation
const { name, value } = this.pickerMiddleware[0]
this.applierList[index].valueView = name
this.applierList[index].value = value
},
// 表单校验
submit () {
let err = []
this.$refs.applierForm
.validate(result => {
if (!result.status) err.push(result)
})
if (err.length) {
this.$notify({
content: err[0].errmsg
})
return
}
this.$notify({
content: '校验通过',
type: 'success'
})
}
}
}
```
```javascript
// data.js
export const applierUserFn = (relTypeList) => {
return [{
name: 'applierUserName', // 用于标示当前对象的唯一索引值
label: '姓名', // 左侧label显示的文案
placeholder: '请输入投保人姓名', // input没有文案时展示的提示文案
value: '', // input显示的内容, 且需要传入后端的数据
rules: [{ // 校验规则
required: true,
errmsg: '请输入投保人姓名'
}, {
cname: true,
errmsg: '投保人姓名有误'
}]
}, {
name: 'applierIdCard',
label: '身份证号',
placeholder: '请输入身份证号码',
value: '',
rules: [{
required: true,
errmsg: '请输入投保人身份证'
}, {
idCard: true,
errmsg: '请输入正确的身份证'
}]
}, {
name: 'applierMobile',
label: '手机号码',
placeholder: '请输入手机号码',
value: '',
rules: [{
required: true,
errmsg: '请输入投保人手机号'
}, {
phone: true,
errmsg: '请输入正确的手机号'
}]
}, {
name: 'applierEmail',
label: '邮箱',
placeholder: '请输入邮箱',
value: '',
rules: [{
required: true,
errmsg: '请输入邮箱'
}, {
email: true,
errmsg: '请输入正确的邮箱'
}],
}, {
name: 'applierdesc',
label: '投保人性格爱好',
placeholder: '最多填写30个字',
rightType: 'textarea',
maxlength: 30,
value: '',
rules: [{
required: true,
errmsg: '请输入您的喜好,至少30个字'
}, {
custom: /^([\u4e00-\u9fa50-9A-Za-z\-_()]{10,})$/, // 自定义规则校验
errmsg: '不可少于10个字'
}]
}, {
name: 'relType',
label: '为谁投保',
rightType: 'selectButton', // 右侧选项类型,如果是非input, 必填
list: relTypeList, // 选项列表
raValue: [1], // 初始化时默认选中的选项
}, {
name: 'insuranceNums',
label: '投保份数',
rightType: 'numInput', // 右侧选项类型,如果是非input, 必填
minNum: 1,
maxNum: 3,
value: 1
}, {
name: 'applierDepositBank',
label: '银行',
placeholder: '请选择银行卡开户行',
value: '',
valueView: '',
disabled: true, // input 框不可点击
rules: [{
required: true,
errmsg: '请选择银行卡开户行'
}],
btn: () => { // 最右侧按钮(如果input可点击,热区只有按钮处,如果input框不可点,热区为整个input 部分)
return `<button class="form-down"></button>`
}
}, {
name: 'severeDisease',
label: '重疾受益人',
value: '被保人本人',
disabled: true
}, {
name: 'death',
label: '身故受益人',
value: '法定受益人',
disabled: true,
hideLine: true // 隐藏下边框
}, {
label: '满期返还保费',
riskDescShow: true, // 显示?条件1
riskDesc: [ // 数组不为空 条件2
{
name: '标题',
value: '1234'
},
{
name: '标题2',
// 必须是span要不有问题
value: '<span>1</span>'
}
],
}]
}
```
#### form参数
| 参数 | 说明 | 类型 | 默认值 |
|-----------|-----------|-----------|-------------|
| title | 表单title | `String` | - |
| titleStyle | title样式 | `String` | - |
| list| 表单列表 数组对象 | `Array` | - |
| isSlot | 是否有solt | `Boolean` | false |
| size | 表单大小 | `default` `small` | `default` |
#### list 内部对象参数
| 参数 | 说明 | 类型 | 默认值 |
|-----------|-----------|-----------|----------|
| name | 用于标示当前对象的唯一索引值 | `String` | - |
| label| 左侧label显示的文案 | `String` | - |
| placeholder | input框未填写默认提示信息 | `String` | - |
| value | 需要传入后端的数据,如果对象没有valueView,此值同时也展示在页面 | `String` | - |
| valueView | 展示在页面input的值, 是有 disabled 属性或者过 showView 属性 为 true 才有用 | `String` | - |
| rightType | 右边是什么类型,不传默认是input弹框 `selectButton`: 选择按钮, `textarea`: 多行输入框, `numInput`: 份数选择 | `String` | - |
| minNum | 表单右侧为 `numInput`, 份数最小份 | `Number` | 1 |
| maxNum | 表单右侧为 `numInput`, 份数最大份 | `Number` | - |
| riskDescShow | 表单右侧是否显示?icon `Boolean` | false |
| riskDesc | 表单右侧`riskDescShow`为true 传入的选择数据,具体格式请看 `riskDesc` 组件 | `Array` | - |
| showView | 是否展示valueView | `Boolean` | false |
| maxlength | 表单右侧是 `textarea` 类型时,文案最长的长度 | `Number` | - |
| list | 右侧类型是`selectButton`时,传入的选择数据,具体格式请看 `selectButton` 组件 | `Array` | - |
| raValue | 右侧类型是`selectButton`时,刚开始默认选中的字段, 具体格式请看 `selectButton` 组件 | `Array` | - |
| type | 右侧类型是`selectButton`时,按钮类型, 具体格式请看 `selectButton` 组件 | `String` | radio |
| width | 右侧类型是`selectButton`时,选择按钮的宽度, 具体格式请看 `selectButton` 组件 | `String` | - |
| readonly | input或者textarea 是否添加readonly属性 | `Boolean` | false |
| disabled | input或者textarea 是否添加disabled属性 | `Boolean` | false |
| hideLine | 每一行都有底边框,是否隐藏 | `Boolean` | false |
| rules | 检验规则---具体格式见下 | `Array` | - |
##### 校验规则
1. cname -> 校验姓名
2. positiveNumber -> 校验是否是正数
3. idCard -> 校验身份证号
4. phone -> 校验手机号
5. email -> 校验邮箱
6. address -> 校验地址
7. cardNo -> 校验身份证号
8. custom -> 支持自定义规则校验
```javascript
// eg
rules: [{
required: true,
errmsg: '请输入邮箱'
}, {
email: true,
errmsg: '请输入正确的邮箱'
}, {
custom: /\d+/, // custom为自定义校验规则
errmsg: '....'
}]
```
### Event
| 事件名 | 说明 | 参数 |
|-----------|-----------|-----------|
| select | 选中按钮触发的事件 | item, index, arentIndex: |
| getRaValue | 选中选择按钮触发的事件 | item, value |
| focus | 获取焦点时 | item, index |
| blur | 失去焦点 | item,index |
| input change | input 更新 | item, index |
| highMax | 选择分数超过最大 | val |
| lowMin | 选择分数小于最小 | val |
| getNumValue | 选择份数每次触发 | item, value, type |
#### 组件包含的方法,可以直接通过refs去获取
| 事件名 | 说明 | 参数 | 返回值 |
| --| --- | --| -- |
| validate | 校验数据 | callback 函数 | - |
| getNameValue | 获取指定name的value值 | name | value |
| getValues| 获取表单全部的value值 | - | obj: {name: value} |
#### 注意!!需要注意,手机号校验时,会把用户填写的所有除数字以外的信息过滤掉再进行校验,这里是为了解决ios11粘贴拨号盘的隐形字符的校验问题
#### 如果不是用表单暴露的getValues方法去获取数据,自己实现的话,需要注意获取到的手机号有可能包含空格或其他字符,与后端交互或者做其他操作都应当过滤掉!!