diff --git a/src/components/scForm/index.vue b/src/components/scForm/index.vue index a83498d0..777d2030 100644 --- a/src/components/scForm/index.vue +++ b/src/components/scForm/index.vue @@ -8,9 +8,9 @@ --> - - - - 提交 - 取消 + + 提交 + @@ -99,49 +105,58 @@ import http from "@/utils/request" import { defineAsyncComponent } from 'vue'; - const inputRender = defineAsyncComponent(() => import('./items/input')); - - //import inputRender from './items/input' - import selectRender from './items/select' - import checkboxRender from './items/checkbox' - import checkboxGroupRender from './items/checkboxGroup' - import switchRender from './items/switch' - import uploadRender from './items/upload' + const uploadRender = defineAsyncComponent(() => import('./items/upload')); export default { props: { modelValue: { type: Object, default: () => {} }, - config: { type: Object, default: () => {} } + config: { type: Object, default: () => {} }, + loading: { type: Boolean, default: false }, }, components: { - inputRender, - selectRender, - checkboxRender, - checkboxGroupRender, - switchRender, uploadRender }, data() { return { form: {}, - loading: false + renderLoading: false } }, watch:{ - form(val){ - this.$emit("update:modelValue", val) + modelValue(){ + if(this.hasConfig){ + this.deepMerge(this.form, this.modelValue) + } + }, + config(){ + this.render() + }, + form:{ + handler(val){ + this.$emit("update:modelValue", val) + }, + deep: true + } + }, + computed: { + hasConfig(){ + return Object.keys(this.config).length>0 + }, + hasValue(){ + return Object.keys(this.modelValue).length>0 } }, created() { }, mounted() { - this.setForm() - this.getData() + if(this.hasConfig){ + this.render() + } }, methods: { //构建form对象 - setForm(){ + render() { this.config.formItems.forEach((item) => { if(item.component == 'checkbox'){ if(item.name){ @@ -163,11 +178,14 @@ this.form[item.name] = item.value } }) - this.form = this.deepMerge(this.form, this.modelValue) - //this.form = Object.assign({}, this.form, this.modelValue) + if(this.hasValue){ + this.form = this.deepMerge(this.form, this.modelValue) + } + this.getData() }, + //处理远程选项数据 getData() { - this.loading = true + this.renderLoading = true var remoteData = [] this.config.formItems.forEach((item) => { if(item.options && item.options.remote){ @@ -178,19 +196,19 @@ } }) Promise.all(remoteData).then(()=>{ - this.loading = false + this.renderLoading = false }) }, + //合并深结构对象 deepMerge(obj1, obj2) { let key; for (key in obj2) { obj1[key] = obj1[key] && obj1[key].toString() === "[object Object]" && (obj2[key] && obj2[key].toString() === "[object Object]") ? this.deepMerge(obj1[key], obj2[key]) : (obj1[key] = obj2[key]) } - return {...obj1}; - }, - updata(val, item){ - console.log(val, item) + return obj1 + //return JSON.parse(JSON.stringify(obj1)) }, + //处理动态隐藏 hideHandle(item){ if(item.hideHandle){ const exp = eval(item.hideHandle.replace(/\$/g,"this.form")) @@ -198,6 +216,7 @@ } return false }, + //处理动态必填 rulesHandle(item){ if(item.requiredHandle){ const exp = eval(item.requiredHandle.replace(/\$/g,"this.form")) @@ -206,15 +225,16 @@ } return item.rules }, + //数据验证 + validate(valid, obj){ + return this.$refs.form.validate(valid, obj) + }, + resetFields(){ + return this.$refs.form.resetFields() + }, + //提交 submit(){ - this.$refs.form.validate((valid) => { - if (valid) { - console.log(this.form) - alert('submit!') - }else{ - return false - } - }) + this.$emit("submit", this.form) } } } diff --git a/src/components/scForm/items/checkbox.vue b/src/components/scForm/items/checkbox.vue deleted file mode 100644 index 7029b9ea..00000000 --- a/src/components/scForm/items/checkbox.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/src/components/scForm/items/checkboxGroup.vue b/src/components/scForm/items/checkboxGroup.vue deleted file mode 100644 index 75d13003..00000000 --- a/src/components/scForm/items/checkboxGroup.vue +++ /dev/null @@ -1,37 +0,0 @@ - - - - - diff --git a/src/components/scForm/items/input.vue b/src/components/scForm/items/input.vue deleted file mode 100644 index 7ca7462d..00000000 --- a/src/components/scForm/items/input.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/src/components/scForm/items/select.vue b/src/components/scForm/items/select.vue deleted file mode 100644 index 95a79ddd..00000000 --- a/src/components/scForm/items/select.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - - - diff --git a/src/components/scForm/items/switch.vue b/src/components/scForm/items/switch.vue deleted file mode 100644 index f3b1590e..00000000 --- a/src/components/scForm/items/switch.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/src/views/vab/form.vue b/src/views/vab/form.vue index e211d241..62be36ca 100644 --- a/src/views/vab/form.vue +++ b/src/views/vab/form.vue @@ -2,34 +2,30 @@ - -
{{config3}}
+ + + 1.远程获取表单配置参数和表单的值 + 2.根据配置构建表单组件 + 3.给表单赋值 + + + + + 改变输入框的值 + 改变配置labelPosition
- - - - - -

基础信息

- - - -

扩展信息

- - - - - 立即创建 - 取消 - -
+ + + 保 存 + 重 置 +
- -
{{data2}}
+ +
{{form}}
@@ -46,372 +42,322 @@ }, data() { return { - d: { - name: "", - name2: "" - }, - rules: { - name2: [ - { required: true, message: '请输入活动名称', trigger: 'blur' } - ] - }, - data: {}, - data2: { - name: "Activity name", - checkbox: { - option1: true - }, - checkboxGroup: ["option1"], - select: ["1"], - select2: "1" - }, - config2: {}, - config3: { - labelWidth: '130px', - labelPosition: 'right', - size: 'medium', - formItems: [ - { - label: "Activity name", - message: "123", - name: "name", - value: "123", - component: "input", - options: { - maxlength: "20", - placeholder: "Activity name", - }, - rules: [ - {required: true, message: "Please input Activity name", trigger: "blur"} - ], - requiredHandle: "$.required==true", - }, - { - label: "Select", - name: "select", - value: "", - component: "select", - span: 12, - options: { - remote: { - api: '/api/system/dic/get', - data: {name: 'a'} - }, - multiple: true, - items:[ - { - label: "选项1", - value: "1" - }, - { - label: "选项2", - value: "2" - } - ] - }, - rules: [ - {required: true, message: "Please input Activity name", trigger: "change"} - ], - requiredHandle: "$.required==true", - }, - { - label: "Select2", - name: "select2", - value: "", - component: "select", - span: 12, - options: { - remote: { - api: '/api/system/dic/get', - data: {name: 'b'} - }, - items:[ - { - label: "选项1", - value: "1" - }, - { - label: "选项2", - value: "2" - } - ] - } - }, - { - label: "Checkbox", - name: "checkbox", - component: "checkbox", - span: 12, - options: { - items:[ - { - label: "选项1", - name: "option1", - value: false - }, - { - label: "选项2", - name: "option2", - value: false - } - ] - } - }, - { - label: "Checkbox group", - name: "checkboxGroup", - value: [], - component: "checkboxGroup", - span: 12, - options: { - items:[ - { - label: "选项1", - value: "option1" - }, - { - label: "选项2", - value: "option2" - } - ] - } - }, - { - label: "Required handle", - name: "required", - value: false, - component: "switch", - }, - { - label: "Upload", - component: "upload", - options: { - items:[ - { - label: "图像1", - name: "img1", - value: "" - }, - { - label: "图像2", - name: "img2", - value: "" - } - ] - }, - hideHandle: "$.required==true" - }, - { - label: "Date", - name: "date", - value: "", - component: "date", - options: { - type: "datetime", - valueFormat: "YYYY-MM-DD HH:mm:ss", - defaultTime: new Date(2000, 1, 1, 12, 0, 0), - shortcuts: [ - { - text: '今天', - value: new Date(), - } - ] - }, - rules: [ - {required: true, message: "Please input Data", trigger: "change"} - ], - }, - { - label: "Number", - name: "number", - value: 0, - component: "number", - }, - { - label: "Radio", - name: "radio", - value: "1", - component: "radio", - options: { - items:[ - { - label: "选项1", - value: "1" - }, - { - label: "选项2", - value: "2" - } - ] - } - }, - ] - }, - config: { - labelWidth: '130px', - labelPosition: 'right', - size: 'medium', - items: [ - { - label: "Required handle", - name: "required", - component: "switch", - span: 24, - }, - { - label: "Hide handle", - name: "hide", - component: "switch", - span: 24, - }, - { - label: "Activity name", - name: "name", - component: "input", - span: 24, - options: { - placeholder: "Activity name", - }, - rules: [ - {required: true, message: "Please input Activity name", trigger: "blur"} - ], - requiredHandle: "$.required==true", - hideHandle: "$.hide==true" - }, - { - label: "Checkbox", - name: "checkbox", - component: "checkbox", - span: 24, - options: { - items:[ - { - label: "选项1", - value: "option1" - }, - { - label: "选项2", - value: "option2" - } - ] - } - }, - { - label: "Checkbox group", - name: "checkboxGroup", - component: "checkboxGroup", - span: 24, - options: { - items:[ - { - label: "选项1", - value: "option1" - }, - { - label: "选项2", - value: "option2" - } - ] - } - }, - // { - // label: "下拉选择", - // name: "type", - // component: "select", - // span: 12, - // options: { - // defaultValue: "", - // placeholder: "请选择", - // options: [ - // { - // label: '黄金糕', - // value: '1', - // }, - // { - // label: '双皮奶', - // value: '2', - // } - // ], - // rules: [ - // { - // required: true, - // message: "请输入名称", - // trigger: "blur" - // } - // ] - // }, - // dynamicHide: "$.switch==true" - // }, - // { - // label: "下拉多选", - // name: "type2", - // component: "select", - // span: 12, - // options: { - // multiple: true, - // defaultValue: "", - // placeholder: "请选择", - // options: [ - // { - // label: '黄金糕', - // value: '1', - // }, - // { - // label: '双皮奶', - // value: '2', - // } - // ], - // rules: [ - // { - // required: true, - // message: "请输入名称", - // trigger: "blur" - // } - // ] - // }, - // dynamicHide: "$.switch==true", - // }, - // { - // label: "多选组", - // name: "checkbox", - // component: "checkbox", - // span: 12, - // options: { - // items: [ - // { - // label: "选项1", - // value: "1" - // }, - // { - // label: "选项2", - // value: "2" - // } - // ] - // }, - // dynamicHide: "$.switch==true" - // } - ] - } + loading: false, + config: {}, + form: {} } }, mounted() { - // setTimeout(()=>{ - // this.config2 = this.config3 - // },1000) - // setTimeout(()=>{ - // this.data = this.data2 - // },1500) + //模拟请求延迟, 配置参数和form值并无顺序要求,可同时请求 + const config = { + labelWidth: '130px', + labelPosition: 'right', + size: 'medium', + formItems: [ + { + label: "输入框", + name: "name", + value: "", + component: "input", + options: { + maxlength: "20", + placeholder: "Activity name", + }, + rules: [ + {required: true, message: "Please input Activity name", trigger: "blur"} + ], + requiredHandle: "$.required==true", + }, + { + label: "栅格(12/24)", + name: "name2", + value: "", + component: "input", + span: 12, + options: { + placeholder: "span: 12", + } + }, + { + label: "栅格(12/24)", + name: "name3", + value: "", + component: "input", + span: 12, + options: { + placeholder: "span: 12", + } + }, + { + label: "选择器(多选)", + name: "select", + value: "", + component: "select", + span: 24, + options: { + remote: { + api: '/api/system/dic/get', + data: {name: 'a'} + }, + multiple: true, + items:[ + { + label: "选项1", + value: "1" + }, + { + label: "选项2", + value: "2" + } + ] + }, + rules: [ + {required: true, message: "Please input Activity name", trigger: "change"} + ], + requiredHandle: "$.required==true", + }, + { + label: "选择器(单选)", + name: "select2", + value: "", + component: "select", + span: 24, + options: { + remote: { + api: '/api/system/dic/get', + data: {name: 'b'} + }, + items:[ + { + label: "选项1", + value: "1" + }, + { + label: "选项2", + value: "2" + } + ] + } + }, + { + label: "级联选择器", + name: "cascader", + value: "", + component: "cascader", + span: 24, + options: { + items:[ + { + label: "Guide", + value: "guide", + children: [ + { + label: "Disciplines", + value: "disciplines" + }, + { + label: "Consistency", + value: "consistency" + }, + ] + }, + { + label: "Resource", + value: "resource", + children: [ + { + label: "Axure Components", + value: "axure" + }, + { + label: "Sketch Templates", + value: "sketch" + }, + { + label: "Design Documentation", + value: "docs" + } + ] + }, + { + label: "Component", + value: "component" + }, + ] + } + }, + { + label: "多选框", + name: "checkbox", + component: "checkbox", + span: 24, + options: { + items:[ + { + label: "选项1", + name: "option1", + value: false + }, + { + label: "选项2", + name: "option2", + value: false + } + ] + } + }, + { + label: "多选框组", + name: "checkboxGroup", + value: [], + component: "checkboxGroup", + span: 24, + options: { + items:[ + { + label: "选项1", + value: "option1" + }, + { + label: "选项2", + value: "option2" + } + ] + } + }, + { + label: "单选", + name: "radio", + value: "1", + component: "radio", + options: { + items:[ + { + label: "选项1", + value: "1" + }, + { + label: "选项2", + value: "2" + } + ] + } + }, + { + label: "开关", + name: "required", + message: "演示如何使用表达式动态显隐和必填,试试打开和关闭开关", + value: false, + component: "switch", + }, + { + label: "上传", + component: "upload", + options: { + items:[ + { + label: "图像1", + name: "img1", + value: "" + }, + { + label: "图像2", + name: "img2", + value: "" + } + ] + }, + hideHandle: "$.required==true" + }, + { + label: "日期/时间", + name: "date", + value: "", + component: "date", + options: { + type: "datetime", + valueFormat: "YYYY-MM-DD HH:mm:ss", + }, + rules: [ + {required: true, message: "Please input Data", trigger: "change"} + ], + }, + { + label: "滑块", + name: "slider", + value: 0, + component: "slider", + options: { + marks: { + 0: '0°C', + 8: '8°C', + 37: '37°C' + } + } + }, + { + label: "数值", + name: "number", + value: 0, + component: "number", + }, + { + label: "颜色", + name: "color", + value: "", + component: "color", + }, + { + label: "评分", + name: "rate", + value: 0, + component: "rate", + }, + + ] + } + + const form = { + name: "Activity name", + checkbox: { + option1: true + }, + checkboxGroup: ["option1"], + select: ["1"], + select2: "1", + cascader: ['resource','docs'] + } + + setTimeout(()=>{ + this.config = config + },500) + + this.loading = true + setTimeout(()=>{ + this.form = form + this.loading = false + },1500) }, methods: { - onSubmit(){ - this.$refs.formref.validate((valid, obj) => { - console.log(obj) + setName(){ + this.form.name = "New Title" + }, + setConfig(){ + this.config.formItems[1].span = this.config.formItems[1].span==24?12:24 + this.config.formItems[2].span = this.config.formItems[2].span==24?12:24 + }, + save(){ + this.$refs.formref.validate((valid) => { if (valid) { + console.log(this.form) alert('submit!') }else{ return false } }) + }, + reset(){ + this.$refs.formref.resetFields() } } }