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 @@
-->
-
+
-
+
@@ -52,6 +52,10 @@
+
+
+
+
@@ -66,29 +70,31 @@
{{_item.label}}
+
+
+
+
+
+
+
+
+
+
+
+
未匹配到相应组件 {{item.component}}
+ {{item.message}}
-
-
-
- 提交
- 取消
+
+ 提交
+
@@ -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 @@
-
-
- {{item.label}}
-
-
-
-
-
-
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 @@
-
-
- {{item.message}}
-
-
-
-
-
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()
}
}
}