var maker = formCreate.maker;
vm = new Vue({
el: '#app',
data: {
formData: {},
rule: mock(),
fApi:{},
option: {
//显示表单重置按钮
resetBtn: true,
//表单提交事件
onSubmit: function(formData) {
alert(JSON.stringify(formData));
//按钮进入提交状态
vm.fApi.btn.loading();
//重置按钮禁用
vm.fApi.resetBtn.disabled();
//按钮进入可点击状态
// $f.btn.finish();
//创建第二个表单
$f = that.$formCreate(mock, root);
},
mounted: function(){
vm.fApi.setValue({"goods_name":"fdsfdsfd"});
}
}
},
watch: {
'formData.address': {
handler: function(n) {
console.log(n);
},
deep: true
}
},
methods: {
change: function(...arg) {
console.log(arg);
}
},
mounted: function() {
console.log(this.fApi.formData());
//动态添加表单元素
//$f.append($r, 'pic');
}
});
function mock() {
return [{
type: 'hidden',
field: 'id',
value: '14'
},
{
type: "cascader",
title: "所在区域",
field: "address",
value: ['陕西省', '西安市', '新城区'],
props: {
//可选项的数据源,格式参照示例说明
data: province_city_area,
//选择后展示的函数,用于自定义显示格式
renderFormat: label => label.join(' / '),
//是否禁用选择器
disabled: false,
//是否支持清除
clearable: true,
//输入框占位符
placeholder: '请选择',
//次级菜单展开方式,可选值为 click 或 hover
trigger: 'click',
//当此项为 true 时,点选每级菜单选项值都会发生变化,具体见上面的示例
changeOnSelect: false,
//输入框大小,可选值为large和small或者不填
size: undefined,
//动态获取数据,数据源需标识 loading
loadData: () => {},
//是否支持搜索
filterable: false,
//当搜索列表为空时显示的内容
notFoundText: '无匹配数据',
//是否将弹层放置于 body 内,在 Tabs、带有 fixed 的 Table 列内使用时,建议添加此属性,它将不受父级样式影响,从而达到更好的效果
transfer: false,
},
validate: [],
},
{
type: "input",
title: "商品名称",
//label名称
field: "goods_name",
//字段名称
value: "",
//input值,
props: {
"type": "text",
//输入框类型,可选值为 text、password、textarea、url、email、date
"clearable": false,
//是否显示清空按钮
"disabled": false,
//设置输入框为禁用状态
"readonly": false,
//设置输入框为只读
"rows": 4,
//文本域默认行数,仅在 textarea 类型下有效
"autosize": false,
//自适应内容高度,仅在 textarea 类型下有效,可传入对象,如 { minRows: 2, maxRows: 6 }
"number": false,
//将用户的输入转换为 Number 类型
"autofocus": false,
//自动获取焦点
"autocomplete": "off",
//原生的自动完成功能,可选值为 off 和 on
"placeholder": "请输入商品名称",
//占位文本
"size": "default",
//输入框尺寸,可选值为large、small、default或者不设置,
"spellcheck": false,
//原生的 spellcheck 属性
"required": false,
},
validate: [{
required: true,
message: '请输入商品名称',
trigger: 'blur'
},
],
},
{
type: "radio",
title: "是否包邮",
//label名称
field: "is_postage",
//字段名称
value: "0",
//input值,
options: [{
value: "0",
label: "不包邮",
disabled: false
},
{
value: "1",
label: "包邮",
disabled: false
},
{
value: "1",
label: "未知",
disabled: true
},
],
props: {
"type": undefined,
//可选值为 button 或不填,为 button 时使用按钮样式
"size": "default",
//单选框的尺寸,可选值为 large、small、default 或者不设置
"vertical": false,
//是否垂直排列,按钮样式下无效
},
},
{
type: "checkbox",
title: "标签",
//label名称
field: "label",
//字段名称
value: ["1", "2", "3"],
//input值,
options: [{
value: "1",
label: "好用",
disabled: true
},
{
value: "2",
label: "方便",
disabled: false
},
{
value: "3",
label: "实用",
disabled: false
},
{
value: "4",
label: "有效",
disabled: false
},
],
props: {
"size": "default",
//多选框组的尺寸,可选值为 large、small、default 或者不设置
},
},
{
type: "switch",
title: "是否上架",
//label名称
field: "is_show",
//字段名称
value: "1",
//input值,
props: {
"size": "default",
//开关的尺寸,可选值为large、small、default或者不写。建议开关如果使用了2个汉字的文字,使用 large。
"disabled": false,
//禁用开关
"trueValue": "1",
//选中时的值,当使用类似 1 和 0 来判断是否选中时会很有用
"falseValue": "0",
//没有选中时的值,当使用类似 1 和 0 来判断是否选中时会很有用
},
slot: {
open: "上架",
//自定义显示打开时的内容
close: "下架",
//自定义显示关闭时的内容
},
//slot可以不用配置
},
{
type: "select",
field: "cate_id",
title: "产品分类",
value: ["104", "105"],
props: {
"multiple": true,
//是否支持多选
"clearable": false,
//是否可以清空选项,只在单选时有效
"filterable": true,
// 是否支持搜索
"size": "default",
//选择框大小,可选值为large、small、default或者不填
"placeholder": "请选择",
//选择框默认文字
"not-found-text": "无匹配数据",
//当下拉列表为空时显示的内容
"placement": "bottom",
//弹窗的展开方向,可选值为 bottom 和 top
"disabled": false,
//是否禁用
},
options: [{
"value": "104",
"label": "生态蔬菜",
"disabled": false
},
{
"value": "105",
"label": "新鲜水果",
"disabled": false
},
],
},
{
type: "DatePicker",
field: "section_day",
title: "活动日期",
value: ['2018-02-20', new Date()],
//input值, type为daterange,datetimerange value为数组 [start_value,end_value]
props: {
"type": "datetimerange",
//显示类型,可选值为 date、daterange、datetime、datetimerange、year、month
"format": "yyyy-MM-dd HH:mm:ss",
//展示的日期格式
"placement": "bottom-start",
// 日期选择器出现的位置,可选值为toptop-starttop-endbottombottom-startbottom-endleftleft-startleft-endrightright-startright-end
"placeholder": "请选择获得时间",
//占位文本
"confirm": false,
//是否显示底部控制栏,开启后,选择完日期,选择器不会主动关闭,需用户确认后才可关闭
"size": "default",
//尺寸,可选值为large、small、default或者不设置
"disabled": false,
//是否禁用选择器
"clearable": true,
//是否显示清除按钮
"readonly": false,
//完全只读,开启后不会弹出选择器
"editable": false,
//文本框是否可以输入
},
},
{
type: "TimePicker",
field: "section_time",
title: "活动时间",
value: [],
//input值, type为timerange value为数组 [start_value,end_value]
props: {
"type": "timerange",
//显示类型,可选值为 time、timerange
"format": "HH:mm:ss",
//展示的时间格式
"steps": [],
//下拉列表的时间间隔,数组的三项分别对应小时、分钟、秒。例如设置为 [1, 15] 时,分钟会显示:00、15、30、45。
"placement": "bottom-start",
// 时间选择器出现的位置,可选值为toptop-starttop-endbottombottom-startbottom-endleftleft-startleft-endrightright-startright-end
"placeholder": "请选择获得时间",
//占位文本
"confirm": false,
//是否显示底部控制栏,开启后,选择完日期,选择器不会主动关闭,需用户确认后才可关闭
"size": "default",
//尺寸,可选值为large、small、default或者不设置
"disabled": false,
//是否禁用选择器
"clearable": true,
//是否显示清除按钮
"readonly": false,
//完全只读,开启后不会弹出选择器
"editable": false,
//文本框是否可以输入
},
},
{
type: "InputNumber",
field: "sort",
title: "排序",
value: 0,
//input值
props: {
"max": undefined,
//最大值
"min": undefined,
//最小值
"step": 1,
//每次改变的步伐,可以是小数
"size": "default",
//输入框尺寸,可选值为large、small、default或者不填
"disabled": false,
//设置禁用状态
"readonly": false,
//是否设置为只读
"editable": true,
//是否可编辑
"precision": 0,
//数值精度
},
},
{
type: "ColorPicker",
field: "color",
title: "颜色",
value: '#ff7271',
//input值
props: {
"alpha": false,
//是否支持透明度选择
"hue": true,
//是否支持色彩选择
"recommend": false,
//是否显示推荐的颜色预设
"size": "default",
//尺寸,可选值为large、small、default或者不设置
"colors": [],
//自定义颜色预设
"format": "hex",
//颜色的格式,可选值为 hsl、hsv、hex、rgb,开启 alpha 时为 rgb,其它为 hex
},
},
{
type: "rate",
field: "rate",
title: "推荐级别",
value: 3.5,
props: {
"count": 10,
//star 总数
"allowHalf": true,
//是否允许半选
"disabled": false,
//是否只读,无法进行交互
"showText": true,
//是否显示提示文字
"clearable": true,
//是否可以取消选择
},
validate: [{
required: true,
type: 'number',
min: 3,
message: '请大于3颗星',
trigger: 'change'
}]
},
{
type: "slider",
field: "slider",
title: "滑块",
value: [0, 50],
//滑块选定的值。普通模式下,数据格式为数字,在双滑块模式下,数据格式为长度是2的数组,且每项都为数字
props: {
"min": 0,
//最小值
"max": 100,
//最大值
"step": 1,
//步长,取值建议能被(max - min)整除
"disabled": false,
//是否禁用滑块
"range": true,
//是否开启双滑块模式
"showInput": false,
//是否显示数字输入框,仅在单滑块模式下有效
"showStops": true,
//是否显示间断点,建议在 step 不密集时使用
"showTip": "hover",
//提示的显示控制,可选值为 hover(悬停,默认)、always(总是可见)、never(不可见)
"tipFormat": undefined,
//Slider 会把当前值传给 tip-format,并在 Tooltip 中显示 tip-format 的返回值,若为 null,则隐藏 Tooltip
"inputSize": "small",
//数字输入框的尺寸,可选值为large、small、default或者不填,仅在开启 show-input 时有效
},
},
{
type: "Upload",
field: "pic",
title: "轮播图",
value: ['http://img1.touxiang.cn/uploads/20131030/30-075657_191.jpg'],
//input值
props: {
"type": "select",
//上传控件的类型,可选值为 select(点击选择),drag(支持拖拽)
"uploadType": "image",
//上传文件类型,可选值为 image(图片上传),file(文件上传)
"action": "",
//上传的地址,必填
"headers": {},
//设置上传的请求头部
"multiple": true,
//是否支持多选文件
"data": {},
//上传时附带的额外参数
"name": "",
//上传的文件字段名
"withCredentials": false,
//支持发送 cookie 凭证信息
"accept": "",
//接受上传的文件类型
"format": [],
//支持的文件类型,与 accept 不同的是,format 是识别文件的后缀名,accept 为 input 标签原生的 accept 属性,会在选择文件时过滤,可以两者结合使用
"maxSize": undefined,
//文件大小限制,单位 kb
"maxLength": 4,
//上传文件最大数
"beforeUpload": () => {},
//上传文件之前的钩子,参数为上传的文件,若返回 false 或者 Promise 则停止上传
"onProgress": () => {},
//文件上传时的钩子,返回字段为 event, file, fileList
"onSuccess": function() {
return 'http://img1.touxiang.cn/uploads/20131030/30-075657_191.jpg';
},
//文件上传成功时的钩子,返回字段为 response, file, fileList, 使用$f.uploadPush(field,filePath) 将上传后的路径添加到value中
"onError": (error, file, fileList) => {},
//文件上传失败时的钩子,返回字段为 error, file, fileList
"onPreview": () => {},
//点击已上传的文件链接时的钩子,返回字段为 file, 可以通过 file.response 拿到服务端返回数据
"onRemove": () => {},
//文件列表移除文件时的钩子,返回字段为 file, fileList
"onFormatError": () => {},
//文件格式验证失败时的钩子,返回字段为 file, fileList
"onExceededSize": () => {},
//文件超出指定大小限制时的钩子,返回字段为 file, fileList
//操作按钮的图标 ,设置为false将不显示
handleIcon: 'ios-eye-outline',
//点击操作按钮事件
// onHandle:(src)=>{},
//是否可删除,设置为false是不显示删除按钮
allowRemove: true,
},
validate: [{
required: true,
type: 'array',
min: 1,
message: '请上传3张图片',
trigger: 'change'
}]
},
{
type: "checkbox",
title: "",
//label名称
field: "checked",
//字段名称
value: "0",
//input值,
options: [{
value: "1",
label: "同意****用户协议",
disabled: false
},
],
props: {
"type": undefined,
//可选值为 button 或不填,为 button 时使用按钮样式
"size": "default",
//单选框的尺寸,可选值为 large、small、default 或者不设置
"vertical": false,
//是否垂直排列,按钮样式下无效
},
},
{
type: "frame",
title: "素材",
field: "fodder",
value: ["http://img1.touxiang.cn/uploads/20131030/30-075657_191.jpg"],
props: {
type: "image",
//frame类型,有input,file,image
src: "iframe.html",
//iframe地址
maxLength: 2,
//value的最大数量
icon: 'folder',
//打开弹出框的按钮图标
height: "220px",
//弹出框高度
width: "350px",
//弹出框宽度
spin: false,
//是否显示加载动画
title: "请选择",
//弹出框标题
handleIcon: true,
//操作按钮的图标 ,设置为false将不显示,设置为true为默认的预览图标,类型为file时默认为false,image类型默认为true
allowRemove: true,
//是否可删除,设置为false是不显示删除按钮
onHandle: undefined,
//点击操作按钮事件,默认为图片预览
onRemove: () => {
return false;
} //点击删除按钮事件,返回false将不删除
},
validate: [{
required: true,
type: 'array',
min: 1,
message: '请选择5张图片',
trigger: 'change'
}],
},
]
}
$r = maker.upload('产品主图', 'logo', 'http://img1.touxiang.cn/uploads/20131030/30-075657_191.jpg').props({
"action": "",
"maxLength": 1,
"multiple": false,
"max": 0,
"type": "select",
"uploadType": "image",
"name": "file",
"onSuccess": function() {
return 'http://img1.touxiang.cn/uploads/20131030/30-075657_191.jpg';
}
}).validate({
required: true,
type: 'array',
min: 1,
message: '请上传1张图片',
trigger: 'change'
});
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/iview/dist/iview.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/form-create/dist/form-create.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/form-create@1.4.4/district/province_city_area.js">
</script>
<div id="app">
<form-create v-model="fApi" :rule="rule" :option="option" @goods-name-change="change"
/>
</div>
@import url("//cdn.jsdelivr.net/npm/iview/dist/styles/iview.css");