wb-form参数:
参数 | 说明 | 类型 | 可选 | 默认 | 必填 |
---|
data | 绑定的表单数据 | objest | - | - | 是 |
rules | 校验对象(全局校验定义为空对象) | objest | - | - | 否 |
field-list | 渲染表单数据 | Array | - | - | 是 |
list-type-info | 可放置options(如:celect /rodio/picker等) | objest | - | - | 否 |
type-pattern | 是否启用浮动模式(浮动模式下带有重置功能) | boolean | true/false | false | 否 |
isShowBtn | 是否显示按钮(不显示则自定义按钮) | boolean | true/false | false | 否 |
className | 给form起的名称 | String | - | - | 否 |
label-width | 表单字段的宽度(带‘px’) | String | - | 100px | 否 |
温馨提示:(可定义在一个变量里(formInfo),便于阅读和维护)
参数 | 说明 | 参数 |
---|
blurEvent | 失去焦点事件 | val |
formRef | 将form实例返回到父级(如:上传图片可能会用到等 | ref实例 |
注意(可自定义事件,添加多个事件,前提得封装在组件中。可看封装说明!)
field-list参数:
参数 | 说明 | 类型 | 可选 | 默认 | 必填 |
---|
label | 字段名 | String | - | - | 是 |
value | 绑定值(注意:prop必填值也会使用) | String | - | - | 是 |
type | 渲染类型 | String | input/select等(查看:type参数说明) | - | 是 |
disabled | 是否禁止 | boolean | true/fasle | fasle | 否 |
filterable | 是否可筛选(搜索) | boolean | true/fasle | fasle | 否 |
clearable | 是否可清除 | boolean | true/fasle | fasle | 否 |
Noshow | 是否不显示 | boolean | true/fasle | fasle | 否 |
required | 是否必填 | boolean | true/fasle | fasle | 否 |
validator | 自定义验证 | fn(参数:rule, value, callback) | - | - | 否 |
pattern | 自定义正则 | 正则 | - | - | 否 |
message | 自定义正则不满足回调消息(仅限有正则使用) | String | - | - | 否 |
style | 控制样式(如:width:50%) | String | - | - | 否 |
dateType | 日期类型 | String | date/week/month/year/daterange | - | 是 |
rangeSeparator | 仅限日期和时间使用 范围使用( 链接符号) | String | - | “-” | 否 |
format | 仅限日期使用(日期格式,不懂的看element-API) | String | - | - | 否 |
value-format | 仅限日期使用 (输出日期格式) | String | - | - | 否 |
event | 绑定事件名(用来定位触发本身是谁 /用到时必填) | String | - | - | 否 |
showPassword | 仅限密码使用 (是否显示查看密码功能) | boolean | true/fasle | fasle | 否 |
className | 给form-item起的名称 | String | - | - | 否 |
autosize | 仅限文本域使用 (置宽高大小,{ minRows: 2, maxRows: 4}) | objest | - | - | 否 |
maxlength | 仅限文本域使用 (最大输入长度 ) | String | - | - | 否 |
step | 仅限计数器使用 (计数器步长 ) | number | - | - | 否 |
list | 放置list-type-info的名称 | String | - | - | 否 |
color | 仅限开关使用 (自定义颜色) | String | - | - | 否 |
isRange | 仅限时间使用 (是否为时间范围选择) | boolean | true/fasle | fasle | 否 |
tag | 仅限日期使用 (自定义时间,带快捷选项等) | objest | - | - | 否 |
btnName | 仅限标签使用 (btn名称) | String | - | - | 否 |
PickerOptionsList | 仅限日期使用 (自定义时间,带快捷选项等) | objest | - | - | 否 |
PickerOptionsList | 仅限日期使用 (自定义时间,带快捷选项等) | objest | - | - | 否 |
PickerOptionsList | 仅限日期使用 (自定义时间,带快捷选项等) | objest | - | - | 否 |
参数 | 说明 |
---|
input | 输入框 |
select | 选择器 |
password | 密码输入框 |
textarea | 文本域 |
data | 日期 |
cascader | 联级选择器 |
slot | 自定义(如:上传图片等) |
inputNumber | 计数器 |
radio | 单选框 |
checked | 多选框 (注意:使用多选框data绑定值:必须为数组 ) |
switch | 开关 |
time | 时间 |
tag | 标签(注意:使用标签data绑定值:必须为数组 ) |
rules校验:
- 采用全局校验, 所以只需要关注以下代码!(全局验证请查看《form表单的全局验证》)
methods: {
initRules () {
const formInfo = this.formInfo
formInfo.rules = this.$initRules(formInfo.fieldList)
},
},
created() {
this.initRules()
},
可能会遇到的问题:
- 单选框,选择A,AA字段消失,选择B, AA,BB字段消失或显示
- 通过监听来实现
watch: {
'formInfo.data.difficulty' (val) {
console.log(val)
const fieldList = this.formInfo.fieldList
if(val === "1"){
fieldList.forEach(item => {
if (['data', 'week'].includes(item.value)) {
item.Noshow = true
} else {
item.Noshow = false
}
})
}else if(val === "2"){
fieldList.forEach(item => {
if (['month', 'year'].includes(item.value)) {
item.Noshow = true
} else {
item.Noshow = false
}
})
}else if(val === "3"){
fieldList.forEach(item => {
if (['daterange', 'time'].includes(item.value)) {
item.Noshow = true
} else {
item.Noshow = false
}
})
}
}
},
使用组件案例:
<template>
<div>
<wb-form
:data="formInfo.data"
:rules="formInfo.rules"
:label-width="formInfo.labelWidth"
:field-list="formInfo.fieldList"
:list-type-info="formInfo.listTypeInfo"
:type="formInfo.type"
@changeEvent="changeEventFn"
@blurEvent="blurEventFn"
@formRef="updaterefObjFn"
@success="successFn"
>
<template v-slot:form-headerImg>
<div class="slot-headerImg">
<img
:src="formInfo.data.headerImg"
style="height: 30px;"
>
<el-button
type="primary"
icon="el-icon-picture"
size="mini"
@click="ClickImgFn"
>
更换头像
</el-button>
</div>
</template>
</wb-form>
</div>
</template>
<script>
export default {
name: 'wb-ceshiForm',
data () {
return {
refForm: '',
formInfo: {
data:{
headerImg: '',
user:'',
password: '',
newpassword: '',
num:1,
TaskType:'',
difficulty:'1',
color: [],
moneyType: '',
data:'',
week: '',
month: '',
year: '',
daterange: '',
time: '',
tag:[],
phone: ''
},
rules: {},
fieldList: [
{ label: '上传头像', value: 'headerImg', type: 'slot', required: true, },
{ label: '账号', value: 'user', type: 'input', required: true , event: 'user', pattern:/^[\u4e00-\u9fa5]+$/,message:'账号必须为汉字'},
{ label: '手机号', value: 'phone', type: 'input', event: 'phone', pattern:/^1[3-9]\d{9}$/},
{ label: '密码', value: 'password', type: 'password', required: true, event: 'password',showPassword: true},
{ label: '新密码', value: 'newpassword', type: 'password', required: true, event: 'password'},
{ label: '描述', value: 'desc', type: 'textarea',maxlength: '100'},
{ label: '计数器', value: 'num', type: 'inputNumber',required: true},
{ label: '任务类型', value: 'TaskType', type: 'select',list: 'options',filterable:true, event: 'TaskType',required: true},
{ label: '城市', value: 'city', type: 'cascader',list: 'cityOptions'},
{ label: '难度', value: 'difficulty', type: 'radio',list: 'rodioOptions',event:'difficulty',required: true},
{ label: '喜欢颜色', value: 'color', type: 'checked',list: 'colorOptions',required: true},
{ label: '按年付费', value: 'moneyType', type: 'switch'},
{ label: '日期', value: 'data', type: 'date', dateType: 'date',format:'yyyy-MM-dd',Noshow: true},
{ label: '周期', value: 'week', type: 'date', dateType: 'week',format:'yyyy 第 WW 周',Noshow: true},
{ label: '月份', value: 'month', type: 'date', dateType: 'month'},
{ label: '年份', value: 'year', type: 'date', dateType: 'year'},
{ label: '日期范围', value: 'daterange', type: 'date', dateType: 'daterange',list: 'pickerOptions'},
{ label: '上班时间', value: 'time', type: 'time',isRange: true},
{ label: '标签', value: 'tag', type: 'tag',btnName: '添加标签',required: true},
],
listTypeInfo:{
options: [
{
value: '选项1',
label: '黄金糕'
}, {
value: '选项2',
label: '双皮奶'
}, {
value: '选项3',
label: '蚵仔煎'
}, {
value: '选项4',
label: '龙须面'
}, {
value: '选项5',
label: '北京烤鸭'
}
],
cityOptions: [
{
value: 'zhinan',
label: '指南',
children: [{
value: 'shejiyuanze',
label: '设计原则',
children: [{
value: 'yizhi',
label: '一致'
}, {
value: 'fankui',
label: '反馈'
}, {
value: 'xiaolv',
label: '效率'
}, {
value: 'kekong',
label: '可控'
}]
}, {
value: 'daohang',
label: '导航',
children: [{
value: 'cexiangdaohang',
label: '侧向导航'
}, {
value: 'dingbudaohang',
label: '顶部导航'
}]
}]
},
],
rodioOptions: [
{label: '简单', value: '1'},
{label: '困难', value: '2'},
{label: '超级困难', value: '3'},
],
colorOptions: [
{label: '红色', value: 'red'},
{label: '黄色', value: 'yellow'},
{label: '蓝色', value: 'blue'},
{label: '绿色', value: 'greend'},
],
pickerOptions: {
shortcuts: [{
text: '本月',
onClick(picker) {
picker.$emit('pick', [new Date(), new Date()]);
}
}, {
text: '今年至今',
onClick(picker) {
const end = new Date();
const start = new Date(new Date().getFullYear(), 0);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近六个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setMonth(start.getMonth() - 6);
picker.$emit('pick', [start, end]);
}
}]
},
}
},
}
},
watch: {
'formInfo.data.difficulty' (val) {
console.log(val)
const fieldList = this.formInfo.fieldList
if(val === "1"){
fieldList.forEach(item => {
if (['data', 'week'].includes(item.value)) {
item.Noshow = true
} else {
item.Noshow = false
}
})
console.log(fieldList)
}else if(val === "2"){
fieldList.forEach(item => {
if (['month', 'year'].includes(item.value)) {
item.Noshow = true
} else {
item.Noshow = false
}
})
}else if(val === "3"){
fieldList.forEach(item => {
if (['daterange', 'time'].includes(item.value)) {
item.Noshow = true
} else {
item.Noshow = false
}
})
}
}
},
methods: {
blurEventFn(val) {
console.log(val)
switch(val) {
case 'TaskType':
break;
case 'difficulty':
break;
default:
}
},
changeEventFn (res) {
console.log(res)
},
updaterefObjFn (el) {
console.log(el)
this.refForm = el
},
initRules () {
const formInfo = this.formInfo
formInfo.rules = this.$initRules(formInfo.fieldList)
},
ClickImgFn () {
this.formInfo.data.headerImg = require('../../assets/logo.png')
this.refForm.validateField('headerImg')
},
successFn () {
console.log(this.formInfo.data)
}
},
created() {
this.initRules()
},
}
</script>
<style scoped>
</style>