说明
这是一个表单设计器(封装了保存模板)
安装
npm i @icreate/ics-form-builder-save-template
在vue使用
import VForm from '@icreate/ics-basic-form-builder'
import '@icreate/ics-basic-form-builder/styles/form-builder.css'
import IcsUI from '@icreate/ics-ui'
import '@icreate/ics-ui/lib/ics-ui.css'
Vue.use(IcsUI)
Vue.use(VForm)
import VFormTemplate from '@icreate/ics-form-builder-save-template'
Vue.use(VFormTemplate)
<v-form-designer-template
ref="vfDesignerTemplateRef"
:designer-config="designerConfig"
:basicFieldsTransfer="basicFieldsTransfer"
:formJson="formJson"
@getFormId="getFormIdHandler"
@getFormJson="getFormJsonHandler"
></v-form-designer-template>
<v-form-render-template
ref="vFormTemplateRef"
:formId="formId"
:form-json="formJson"
:form-data="formData"
:option-data="optionData"
@appendButtonClick="appendButtonClickHandler"
@formChange="handleFormChange"
></v-form-render-template>
<ics-button type="primary" @click="submitForm">Submit</ics-button>
数据格式:
v-form-designer 表单设计器
designerConfig :表单设计器配置 (必传)
basicFieldsTransfer : 基础字段组件(必传)
formJson: 显示上次编辑的设计器页面 (选传)
getFormIdHandler: 保存模板后的回调函数,可以获取到表单id
getFormJsonHandler :保存模板后的回调函数,可以获取到模板的json数据
v-form-render 表单渲染器
formId: 表单id(必传)
formJson:需要渲染的表单的json数据(选传)
formData:需要渲染的表单数据(选传)
optionData:动态传入的选项数据(例如:多选框的选项)(选传)
appendButtonClickHandler : 输入框后置按钮的回调函数(选传)
handleFormChange: 表单数据改变时触发
submitForm: 可以获取到表单数据formData
export default {
data() {
return {
designerConfig: {
resetFormJson: false,
toolbarMaxWidth: 490,
},
basicFieldsTransfer: [
{
type: "input",
options: {
label: "输入框",
name: "inputtext",
type: "text",
defaultValue:"",
required: true,
requiredHint:'',
validation: "/^[\u4e00-\u9fa5]+$/",
validationHint: "只能输入中文哦",
reverseValidation:'/[^\u4e00-\u9fa5]/g',
max:""
},
},
{
type: "input",
options: {
label: "输入框",
name: "inputpsw",
type: "password",
},
},
{
type: "textarea",
options: {
label: "文本域",
name: "textarea",
},
},
{
type: "radio",
options: {
name: "radio",
label: "单选项",
optionItems: [
{
label: "选项1",
value: "1",
},
{
label: "选项2",
value: "2",
},
],
},
},
{
type: "checkbox",
options: {
name: "checkbox",
label: "多选框",
max: 1,
optionItems: [
{
label: "选项1",
value: "1",
},
{
label: "选项2",
value: "2",
},
{
label: "选项3",
value: "3",
},
],
},
},
{
type: "number",
options: {
name: "number",
label: "计数器",
min: 0,
max: 100000,
precision: 0,
step: 1,
},
},
{
type: "select",
options: {
name: "select",
label: "下拉框",
labelAndValue: true,
optionItems: [
{
id:"",
label: "select 1",
value: 1,
},
{
label: "select 2",
value: 2,
},
{
label: "select 3",
value: 3,
},
],
},
},
{
type: "select-plus",
options: {
name: "select-plus",
label: "下拉框加强版",
optionItems: [
{
label: "select 1",
value: 1,
},
{
label: "select 2",
value: 2,
},
{
label: "select 3",
value: 3,
},
],
},
},
{
type: "time",
options: {
name: "time",
label: "时间",
format: "HH:mm:ss",
},
},
{
type: "time-range",
options: {
name: "time-range",
label: "时间范围",
format: "HH:mm:ss",
},
},
{
type: "date",
options: {
name: "date",
label: "日期",
format: "yyyy-MM-dd",
valueFormat: "yyyy-MM-dd",
},
},
{
type: "date-range",
options: {
name: "date-range",
label: "日期范围",
format: "yyyy-MM-dd",
valueFormat: "yyyy-MM-dd",
},
},
{
type: "datetime",
options: {
name: "datetime",
label: "日期时间",
format: "yyyy-MM-dd HH:mm:ss",
valueFormat: "yyyy-MM-dd HH:mm:ss",
},
},
{
type: "switch",
options: {
name: "switch",
label: "开关",
},
},
{
type: "rate",
options: {
name: "rate",
label: "评分",
},
},
{
type: "button",
options: {
name: "button",
label: "按钮",
},
},
{
type: "cascader",
options: {
name: "cascader",
label: "级联选择",
optionItems: [
{
label: "select 1",
value: 1,
children: [{ label: "child 1", value: 11 }],
},
{ label: "select 2", value: 2 },
{ label: "select 3", value: 3 },
],
},
},
{
type: "combo-grid",
options: {
name: "comboGrid",
label: "组合网格",
labelColumn: "name",
valueColumn: "id",
valueKey:"",
labelAndValue: true,
customFilter: ["id", "name"],
optionItems: {
thOptions: [
{
label: "日期",
value: "date",
width: "180",
},
{
label: "姓名",
value: "name",
width: "180",
},
{
label: "地址",
value: "address",
width: "260",
},
],
tbodyOptions: [
{
id: "111111",
date: "2016-05-02",
name: "王小虎1",
address: "上海市普陀区金沙江路 1518 弄",
},
{
id: "111112",
date: "2016-05-04",
name: "王小虎2",
address: "上海市普陀区金沙江路 1517 弄",
},
{
id: "111113",
date: "2016-05-01",
name: "王小虎3",
address: "上海市普陀区金沙江路 1519 弄",
},
],
},
},
},
],
formTemplateJson:
JSON.parse(localStorage.getItem("saveFormTemplateJson")) || null,
formJson: {
widgetList: [
{
type: "input",
options: {
labelAlign: "",
defaultValue: "",
placeholder: "",
columnWidth: "200px",
size: "",
labelWidth: null,
labelHidden: false,
readonly: false,
disabled: false,
hidden: false,
clearable: true,
showPassword: false,
required: true,
requiredHint: "",
validation: "/^[一-龥]+$/",
validationHint: "只能输入中文哦",
minLength: null,
maxLength: null,
showWordLimit: false,
appendButton: true,
appendButtonDisabled: false,
buttonIcon: "el-icon-search",
label: "用户名",
name: "username",
type: "text",
},
icon: "text-field",
formItemFlag: true,
id: "username",
},
{
type: "input",
options: {
labelAlign: "",
defaultValue: "",
placeholder: "",
columnWidth: "200px",
size: "",
labelWidth: null,
labelHidden: false,
readonly: false,
disabled: false,
hidden: false,
clearable: true,
showPassword: false,
required: false,
requiredHint: "",
validation: "",
validationHint: "",
minLength: null,
maxLength: null,
showWordLimit: false,
appendButton: false,
appendButtonDisabled: false,
buttonIcon: "el-icon-search",
label: "密码",
name: "password",
type: "password",
},
icon: "text-field",
formItemFlag: true,
id: "password",
},
{
type: "textarea",
options: {
labelAlign: "",
defaultValue: "",
placeholder: "",
columnWidth: "200px",
size: "",
labelWidth: null,
labelHidden: false,
readonly: false,
disabled: false,
hidden: false,
clearable: true,
showPassword: false,
required: false,
requiredHint: "",
validation: "",
validationHint: "",
minLength: null,
maxLength: null,
showWordLimit: false,
appendButton: false,
appendButtonDisabled: false,
buttonIcon: "el-icon-search",
label: "留言板",
name: "message",
rows: 3,
},
icon: "text-field",
formItemFlag: true,
id: "message",
},
],
formConfig: {
labelWidth: 80,
labelPosition: "left",
size: "",
labelAlign: "label-left-align",
cssCode: "",
customClass: "",
functions: "",
layoutType: "PC",
modelName: "formData",
refName: "vForm",
rulesName: "rules",
onFormCreated: "",
onFormMounted: "",
onFormDataChange: "",
},
},
formData: {},
optionData: {
checkbox: [
{
label: "动态选项1",
value: "1",
},
{
label: "动态选项2",
value: "2",
},
{
label: "动态选项3",
value: "3",
},
],
},
};
},
methods: {
getFormIdHandler(id) {
this.formId = id;
console.log(id, "表单id------------------");
},
getFormJsonHandler(data) {
console.log(data, "表单json");
},
submitForm() {
this.$refs.vFormTemplateRef.$refs.vFormRef
.getFormData()
.then((formData) => {
alert(JSON.stringify(formData));
})
.catch((error) => {
this.$message.error(error);
});
},
appendButtonClickHandler(data) {
console.log("appendButtonClickHandler=======", data.$data.fieldModel);
},
handleFormChange(
fieldName,
newValue,
oldValue,
formDataModel,
subFormName,
subFormRowIndex,
comboGridItem
) {
console.log(this.$refs['vFormTemplateRef'].$refs["vFormRef"].widgetRefList)
this.$refs['vFormTemplateRef'].$refs["vFormRef"].widgetRefList["select"].setRequired(true);
this.$refs['vFormTemplateRef'].$refs["vFormRef"].widgetRefList["select"].setValue("1");
this.$refs['vFormTemplateRef'].$refs["vFormRef"].widgetRefList["input"].setWidgetOption("max",newValue)
this.$refs['vFormTemplateRef'].$refs["vFormRef"].widgetRefList["comboGrid"].setValueNotEmitHandler(newValue);
this.$refs['vFormTemplateRef'].$refs["vFormRef"].widgetRefList["select"].$refs.fieldEditor.toggleMenu();
},
},
}
module.exports = {
devServer: {
proxy: {
'/prod-form-template-api': {
target: `http://192.168.3.73:9010`,
changeOrigin: true,
pathRewrite: {
'^/prod-form-template-api': ''
}
}
}
}