form表单API文档

wb-form参数:

参数说明类型可选默认必填
data绑定的表单数据objest--
rules校验对象(全局校验定义为空对象)objest--
field-list渲染表单数据Array--
list-type-info可放置options(如:celect /rodio/picker等)objest--
type-pattern是否启用浮动模式(浮动模式下带有重置功能)booleantrue/falsefalse
isShowBtn是否显示按钮(不显示则自定义按钮)booleantrue/falsefalse
className给form起的名称String--
label-width表单字段的宽度(带‘px’)String-100px

温馨提示:(可定义在一个变量里(formInfo),便于阅读和维护)

  • event事件
参数说明参数
blurEvent失去焦点事件val
formRef将form实例返回到父级(如:上传图片可能会用到等ref实例

注意(可自定义事件,添加多个事件,前提得封装在组件中。可看封装说明!)

field-list参数:

参数说明类型可选默认必填
label字段名String--
value绑定值(注意:prop必填值也会使用)String--
type渲染类型Stringinput/select等(查看:type参数说明)-
disabled是否禁止booleantrue/faslefasle
filterable是否可筛选(搜索)booleantrue/faslefasle
clearable是否可清除booleantrue/faslefasle
Noshow是否不显示booleantrue/faslefasle
required是否必填booleantrue/faslefasle
validator自定义验证fn(参数:rule, value, callback)--
pattern自定义正则正则--
message自定义正则不满足回调消息(仅限有正则使用)String--
style控制样式(如:width:50%)String--
dateType日期类型Stringdate/week/month/year/daterange-
rangeSeparator仅限日期和时间使用 范围使用( 链接符号)String-“-”
format仅限日期使用(日期格式,不懂的看element-API)String--
value-format仅限日期使用 (输出日期格式)String--
event绑定事件名(用来定位触发本身是谁 /用到时必填)String--
showPassword仅限密码使用 (是否显示查看密码功能)booleantrue/faslefasle
className给form-item起的名称String--
autosize仅限文本域使用 (置宽高大小,{ minRows: 2, maxRows: 4})objest--
maxlength仅限文本域使用 (最大输入长度 )String--
step仅限计数器使用 (计数器步长 )number--
list放置list-type-info的名称String--
color仅限开关使用 (自定义颜色)String--
isRange仅限时间使用 (是否为时间范围选择)booleantrue/faslefasle
tag仅限日期使用 (自定义时间,带快捷选项等)objest--
btnName仅限标签使用 (btn名称)String--
PickerOptionsList仅限日期使用 (自定义时间,带快捷选项等)objest--
PickerOptionsList仅限日期使用 (自定义时间,带快捷选项等)objest--
PickerOptionsList仅限日期使用 (自定义时间,带快捷选项等)objest--
  • type参数说明:
参数说明
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: {
      // 通过监听来实现(单选框,选择A,AA字段消失,选择B, AA,BB字段消失,)
      '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}$/},
            // // validator: checkAccount
            { label: '密码', value: 'password', type: 'password', required: true, event: 'password',showPassword: true},
            { label: '新密码', value: 'newpassword', type: 'password', required: true, event: 'password'},
            // validator: checkPwd
            { 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: {
      // 通过监听来实现(单选框,选择A,AA字段消失,选择B, AA,BB字段消失,)
      '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 语句用于基于不同条件执行不同动作。
        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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值