1.0.3 • Published 2 years ago
hjf v1.0.3
本组件是根据ANTDV 1.x版本进行的二次封装,满足一般的表单需求,数据驱动配置即用,减少Dom的书写,优化代码可读性。
重要!!!!!配置时间的时候必须引入moment模块,并且引入moment方法,否则无法使用时间限定
配置的方法主要通过配置configuration来实现,
注意事项:单个弹出框只能用一个表单,不然无法监听多个表单的变化,对于表单的输入判断,必须保持value跟ruleData的值相对应,动态生成ruleData会导致表单输入失败(antdv本身就是这样设定的,因为数据加载有前后关系)。(上传组件限制默认拦截,但是无法判断多个上传组件合用,一般业务也只会有一个。可以外挂上传组件解决问题)---已解决。使用jsx语法时发现不支持vue的@以及一些语法!!!(不清楚什么原因,希望大佬帮忙解决)
对于一些有递归的业务可以定义两层进行嵌套循环,可以跟react一样完美解决dom递归生成
主要结构为
configuration:{
//定义item内部的元素的style
innerStyle:'width:100%',
//配置按钮的样式跟文字
change:{
submit:{
//按钮上的文字
title:string,
style:string
},
reset:{
title:string,
style:string
}
},
//配置表单的ref属性
ref:'home',
//标签文本对齐方式,其中labelAlign的属性有'left' | 'right'
labelAlign:'right',
//设置itme的布局形式 可选值'horizontal'|'vertical'|'inline'
layout:'inline',
//item的长度
outStyle:'margin-top:10px;width:48%',
//表单的值,该值跟ruleFrom里的value对应,为防止重复命名可以在ruleData里面记录
ruleData:{},
//表单的属性配置,value要对等ruleData,数组配置,输入相应的字段即可
ruleFrom:[],
//设置标题跟输入框的占比
bang: {labelCol: { span: 4 },wrapperCol: { span: 18 }},
//验证方式,验证方式的属性名要跟ruleFrom的title对应
rules: {
pass: [{ validator: validatePass, trigger: 'change' }],
checkPass: [{ validator: validatePass2, trigger: 'change' }],
age: [{ validator: checkAge, trigger: 'change' }],
}
}
let checkPending;
let checkAge = (rule, value, callback) => {
clearTimeout(checkPending);
if (!value) {
return callback(new Error('Please input the age'));
}
checkPending = setTimeout(() => {
if (!Number.isInteger(value)) {
callback(new Error('Please input digits'));
} else {
if (value < 18) {
callback(new Error('Age must be greater than 18'));
} else {
callback();
}
}
}, 1000);
};
let validatePass = (rule, value, callback) => {
if (value === '') {
// console.log(rule,value)
callback(new Error('Please input the password'));
} else {
// console.log(rule,value)
if (this.ruleForm.checkPass !== '') {
this.$refs.ruleForm.validateField('checkPass');
}
callback();
}
};
let validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('Please input the password again'));
} else if (value !== this.ruleForm.pass) {
callback(new Error("Two inputs don't match!"));
} else {
callback();
}
};
组件的使用
//时间选择改变的回调
@dateChange="dateChange"
//滑块按钮改变的回调
@switchChange="switchChange"
//文件上传拦截的回调
@uploadRequest="uploadRequest"
//提交表单的回调
@submit="submit"
//清空表单的回调
@reset="reset"
<hjfForm ref="aa" :configurations="configuration"></hjfForm>
//如果使用弹出窗进行行为拦截,无需在表单中配置提交按钮。
setup:{
// 开启title自定义
title:()=>{
return <span style="color:red">ss</span>
},
// 开启footer自定义
footer:()=>{
return <a-button slot="footer" key="back">Return</a-button>
},
okButtonProps:{ props: { disabled: false } },
cancelButtonProps:{ props: { disabled: false } },
//垂直剧中
centered:true,
//右上角关闭图标
closable:true,
//是否显示
visible:false,
//确认按钮的文字
okText:'确定',
//取消按钮的文字
cancelText:'取消',
//上方的文字
// title:'11',
//弹出框的优先层
// zIndex:''
//弹出框的宽度
width:1200,
//确认按钮的加载动效
confirmLoading:false
},
configuration:{
//定义最高顶级变量单个item的值
innerStyle:'width:100%',
//配置按钮的样式跟文字
change:{
submit:{
title:'提交',
// style:'background-color:red'
},
reset:{
title:'重置',
style:'margin-left: 10px'
}
},
//配置表单的ref属性
ref:'home',
//设置标题的靠向
labelAlign:'right',
//设置itme的布局形式
// layout:'horizontal',
layout:'inline',
//设置长度
//item的长度
outStyle:'margin-top:10px;width:48%',
//表单的值,该值需要跟ruleFrom里的value对应,为防止重复命名可以ruleData里面记录
ruleData:{
// pass:'',
// age:'',
// area:undefined,
// delivery:false,
// checkbox:[],
// textarea:'',
// uploadvalue:[],
// date:[]
},
//表单的属性配置,value要对等ruleData
ruleFrom:[
{
//是否可以输入
disabled:true,
//为diff算法准备
id:1,
//输入框的类型
type:'password',
//输入框的提示语句
placeholder:'输入密码',
//给验证输入内容的函数提供对应入口
title:'pass',
//输入框的label值
label:'密码',
//
feedback:false,
autocomplete:false,
value:'pass'
},
{
id:3,
type:'number',
title:'age',
label:'年龄',
placeholder:'输入年龄',
feedback:true,
autocomplete:false,
value:'age',
},
{
id:4,
label:'地名',
title:'area',
type: 'select',
placeholder:'选择地名',
autocomplete:false,
feedback:false,
value:'area',
data:[
{
id:1,
optionValue:'1',
optionTitle:'上海',
},
{
id:2,
optionValue:'2',
optionTitle:'北京',
}
]
},
{
id:5,
//需要用到的组件类型
type:'date',
disabled: true,
//时间的格式
format:'YYYY-MM-DD HH:mm:ss',
//设置大小,//large//default//small
size:'default',
//默认选择时间
defaultValue:[moment('00:00:00', 'HH:mm:ss'), moment('11:59:59', 'HH:mm:ss')],
//时间选择器的类型
dateType:'range',
//对应规则判断,理论上除了from都可以不用
title:'datetime',
//label使用的字段
label: '时间',
feedback: false,
autocomplete: false,
//对应配对的存值属性名称
value:'date',
//不可以选择的时间
disabledDateTime:function disabledDateTime() {
return {
disabledHours: () =>range(0, 24).splice(4, 20),
disabledMinutes: () =>range(30, 60),
disabledSeconds: () => [55, 56],
};
},
// //不可以选择的日期
// disabledDate: function disabledDate(current) {
// return current && current < moment().endOf('day');
// },
},
{
id:6,
type: 'switch',
title:'delivery',
label: '开关',
value:'delivery'
},
{
id:7,
type:'checkbox',
title:'checkbox',
label: '多选框',
value:'checkbox',
data:[
{
id:1,
optionValue:'1',
optionTitle:'上海',
name:'q'
},
{
id:2,
optionValue:'2',
optionTitle:'北京',
name:'q'
}
]
},
{
id:8,
type:'radio',
title:'radio',
label:'单选框',
value:'radio',
data:[
{
id:1,
optionValue:'1',
optionTitle:'上海',
name:'q'
},
{
id:2,
optionValue:'2',
optionTitle:'北京',
name:'q'
}
]
},
{
id:9,
type:'textarea',
placeholder:'输入文本',
title:'textarea',
label:'密码',
feedback:false,
autocomplete:false,
value:'textarea'
},
{
id:10,
type: 'upload',
label: '上传',
listType:'picture',
title:'uploadvalue',
value:'uploadvalue',
showWay:'head',
url:'http://localhost',
multiple:true,
headers:{},
text:'上传'
}
],
//验证方式,验证方式的属性名要跟ruleFrom的title对应
rules: {
pass: [{ validator: validatePass, trigger: 'change' }],
checkPass: [{ validator: validatePass2, trigger: 'change' }],
age: [{ validator: checkAge, trigger: 'change' }],
},
//设置标题跟输入框的占比
bang: {
labelCol: { span: 4 },
wrapperCol: { span: 18 },
},
},
输入框的主要类型有password,text,textarea,number.
遇到特定回调需要手动写出,根据title进行判断属于哪个组件,并进行数据处理。event为事件
@change="inputChange(item.title,$event)"
@blur="inputBlur(item.title,$event)"
@click="inputClick(item.title,$event)"
@focus="inputFocus(item.title,$event)"
input的主要api
配置文档
{
//input输入框的配置实现
//设置id
id:1,
//输入框前面的label
label:'输入框',
//存储值的变量名需要自己写入并且会对应rules的输入内容检测
value:'pass',
//输入框的类型 类型分别有text|password|textarea|number|color
type:'text',
//输入框是否可以输入值 默认值为false
disabled:false,
//输入框的大小 值有 large default small 默认为default
size:'default',
//可以点击清除图标删除内容
allowClear:true,
//textarea的高度 number
rows:6,
//默认显示文本
placeholder:'默认显示',
//输入框默认值
defaultValue:'sdad',
//带标签的 input,设置后置标签 string|slot
addonAfter:()=>{
return <span>后面</span>
},
//带标签的 input,设置前置标签 string|slot
addonBefore:()=>{
return <span>前面</span>
},
}
下拉选择有的模式 'default' | 'multiple' | 'tags' | 'combobox'
配置介绍
{
//select选择框的配置实现
//设置id
id:2,
//选择框前面的label
label:'输入框',
//存储值的变量名需要自己写入并且会对应rules的输入内容检测
value:'sle',
//选择框的类型 select
type:'select',
//选择框是否可以输入值 默认值为false
disabled:false,
//选择框的大小 值有 large default small 默认为default
size:'default',
//可以点击清除图标删除内容
allowClear:true,
//默认显示文本
placeholder:'默认显示',
//默认打开---(无效)
// defaultOpen:true,
// 手动控制展开(问题很大)
// open:false,
//下拉选择的模式 'default' | 'multiple' | 'tags' | 'combobox'
mode:'default',
//开启搜索功能
showSearch:true,
//自定义的选择框后缀图标 VNode | slot
suffixIcon:()=>{return <span>sd</span>},
//自定义的多选框清除图标 VNode | slot
removeIcon:()=>{return <span>sd</span>},
//配置option, id为diff,optionValue为code,optionTitle为要显示的数值
data:[
{
id:1,
optionValue:1,
optionTitle:'测试1'
},
{
id:2,
optionValue:2,
optionTitle:'测试2'
}
]
}
//事件回调,第一个参数为组件的名称,第二为事件回调
@dropdownVisibleChange="selectDropdownVisibleChange(item.value,$event)"
@select="selectSelect(item.value,$event)"
@blur="selectBlur(item.value,$event)"
@change="selectChange(item.value,$event)"
@search="selectSearch(item.value,$event)"
时间选择器一共有三种,通过以下配置即可使用,
{
//时间选择的配置实现
//设置id
id:3,
//选择框前面的label
label:'输入框',
//存储值的变量名需要自己写入并且会对应rules的输入内容检测
value:'ss',
//选择框的类型 date
type:'date',
//时间选择模式 date|month|range 对应不同的配置
dateType:'date',
//时间选择器是否可以输入值 默认值为false
disabled:false,
//时间选择器是否显示清除按钮
allowClear:true,
//显示的时间格式
format:'YYYY-MM-DD HH-MM-SS',
//值的时间格式
valueFormat:'YYYY-MM-DD HH-MM-SS',
//时间选择器的大小 large|small
size:'small',
//不允许选择的日期
disabledDate:(e)=>{},
//不允许选择的时间
disabledDateTime:(e)=>{},
//增加时间选择功能
showTime:true,
//默认显示
placeholder:'默认显示',
//预设时间范围快捷选择{ [range: string]: moment[] } | { [range: string]: () => moment[] }
ranges:{}
}
{
//配合diff
id:4,
//label的文字信息
label:'开关',
//配置值的变量名
value:'kai',
//选择选择框类型为 switch
type: 'switch',
//是否可用
disabled: false,
//初始是否选中
defaultChecked:'',
//加载中的开关
loading:false,
//开关大小,可选值:default small
size:'default',
//选中时的内容 string|slot
checkedChildren:()=>{return <span>不选择</span>},
//非选中时的内容 string|slot
unCheckedChildren:()=>{return <span>选择</span>}
}
@change="switchChange(item.value,$event)"
{
//配合diff
id:5,
//label的文字信息
label:'多选',
//配置值的变量名
value:'duo',
//选择选择框类型为 switch
type: 'checkbox',
//是否可用
disabled: false,
//默认选中的选项 Array
defaultValue:[1,2],
//checkbox的配置信息
data:[
{
id:1,
//真正的值
optionValue:1,
//显示的值
optionTitle:'测试1'
},
{
id:2,
optionValue:2,
optionTitle:'测试2'
}
],
//指定可选项,可以通过 slot="label" slot-scope="option" 定制label
//string[] | Array<{ label: string value: string disabled?: boolean, //indeterminate?: boolean, onChange?: function }>
options:{}
}
@change="changeCheckbox(item.value,$event)"
{
//配合diff
id:6,
//label的文字信息
label:'多选',
//配置值的变量名
value:'duo',
//选择选择框类型为 switch
type: 'radio',
//配置单选的类型 radio|button
radioType:'button',
//是否可用
disabled: false,
//默认选中的值
defaultValue:1,
//RadioGroup 下所有 input[type="radio"] 的 name 属性 string
name:'ds',
//以配置形式设置子元素 string[] | Array<{ label: string value: string disabled?: boolean }>
// options:[],
//大小,只对按钮样式生效 large | default | small
size:'default',
//RadioButton 的风格样式,目前有描边和填色两种风格 outline | solid
buttonStyle:'outline',
data: [
{
id:1,
optionValue:1,
optionTitle:'测试1'
},
{
id:2,
optionValue:2,
optionTitle:'测试2'
}
]
},
@change="radioChange(item.value,$event)"
{
//配合diff
id:7,
//label的文字信息
label:'上传',
//配置值的变量名
value:'shang',
//选择选择框类型为 switch
type: 'upload',
//是否可用
disabled: false,
//接受上传的文件类型
accept:'',
//上传的地址
action:'',
//设置上传的请求头部,IE10 以上有效
header:{},
//是否支持多选文件,ie10+ 支持。开启后按住 ctrl 可选择多个文件。
multiple:true,
//上传列表的内建样式,支持三种基本样式 text, picture 和 picture-card
listType:'text',
}
:customRequest="customRequest"
:beforeUpload="beforeUpload"
弹出框的确认事件将会覆盖默认的表单的确认事件(抽取)