Skip to content
This repository was archived by the owner on May 11, 2021. It is now read-only.

Commit 919e3c2

Browse files
committed
refactor: 重构逻辑
1 parent 4a140df commit 919e3c2

36 files changed

+647
-1056
lines changed

README.md

+48-23
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949

5050
f-render 是基于 [vue-ele-form](https://github.com/dream2023/vue-ele-form) 开发的可视化表单设计工具, 适用于 各种流程引擎和动态表单项目,大大节省你的开发时间;
5151

52-
[![f-render 演示图](https://s1.ax1x.com/2020/08/23/d0T976.gif)](https://dream2023.gitee.io/f-render/)
52+
[![f-render 演示图](./demo.webp)](https://dream2023.gitee.io/f-render/)
5353

5454
## 注意
5555

@@ -58,21 +58,25 @@ f-render 是基于 [vue-ele-form](https://github.com/dream2023/vue-ele-form) 开
5858
## 特性
5959

6060
- 组件方式:以组件方式接入,1 分钟轻松接入;
61-
- 体积小:Gzip 压缩后 `200k` 以内
61+
- 体积小:Gzip 压缩后 `100k` 左右
6262
- 易扩展:可以在`不更改源码`的情况下增删改属性、组件;
6363

6464
## Demo
6565

6666
[https://dream2023.gitee.io/f-render/](https://dream2023.gitee.io/f-render/)
6767

68-
## 安装 & 注册
68+
## 1 分钟快速接入
69+
70+
#### 第 1 步:安装
6971

7072
```bash
7173
yarn add element-ui # npm install element-ui
7274
yarn add vue-ele-form # npm install vue-ele-form
7375
yarn add f-render # npm install f-render
7476
```
7577

78+
#### 第 2 步:注册
79+
7680
```js
7781
// vue-ele-form 的注册可参考:https://www.yuque.com/chaojie-vjiel/vbwzgu/xl46cd
7882
import EleForm from "vue-ele-form";
@@ -85,11 +89,7 @@ Vue.use(EleForm);
8589
Vue.component("f-render", FRender);
8690
```
8791

88-
## 使用简介
89-
90-
使用分为两个部分,首先是进行表单拖拽设计,然后再已纯表单的形式使用
91-
92-
### 表单设计
92+
#### 第 3 步:使用
9393

9494
```html
9595
<template>
@@ -128,9 +128,16 @@ Vue.component("f-render", FRender);
128128
</script>
129129
```
130130

131-
### 表单使用
131+
## 用户模式
132+
133+
我们把动态表单分为两个阶段:
134+
135+
- 首先是设计阶段:通过拖拽设计表单;
136+
- 然后是用户阶段:将设计好的表单以纯表单的形式让用户填写。
137+
138+
我们别分称这两个阶段的表单为设计模式和用户模式。设计模式的表单配置我们已经讲了,下面看用户模式下的表单配置:
132139

133-
#### 基于 f-render 使用
140+
#### 基于 f-render 的配置
134141

135142
通过属性 `pure`, 可以直接做为表单使用,其数据提交方式同 `vue-ele-form` 一样,具体可查看[文档](https://www.yuque.com/chaojie-vjiel/vbwzgu/zbu9mn)
136143

@@ -175,7 +182,7 @@ Vue.component("f-render", FRender);
175182
</script>
176183
```
177184

178-
#### 基于 vue-ele-form 使用
185+
#### 基于 vue-ele-form 的配置
179186

180187
如果你的可视化设计和表单使用,不再一个系统,可以直接使用 `vue-ele-form`,不必安装 `f-render`,具体如下:
181188

@@ -310,14 +317,8 @@ export default {
310317
}
311318
// ....
312319
},
313-
// 默认值
314-
// 如果在保存时,默认值未更改,则会被剔除,保持数据的简洁性
315-
defaultData: {
316-
max: 255
317-
},
318-
// 必须值
319-
// 在保存时,必填值无论是否更改,都会保留,用作一些属性是必填的
320-
requiredData: {
320+
// 默认值,如果在配置文件里设置了,则每个组件都会携带
321+
data: {
321322
name: "url"
322323
}
323324
},
@@ -331,9 +332,7 @@ export default {
331332
label: "默认值"
332333
}
333334
},
334-
// 这两个和上面一个意思,分别是 common 的默认值和必填值
335-
defaultData: {},
336-
requiredData: {}
335+
data: {}
337336
}
338337
}
339338
};
@@ -380,6 +379,32 @@ export default {
380379
/>
381380
```
382381

382+
具体而言,如果想让每个 `input` 组件都携带 `clearable: true` 的属性,我们可以这样操作:
383+
384+
```html
385+
<template>
386+
<!-- 其它属性省略 -->
387+
<!-- 将更改后的 comps 传递过去即可 -->
388+
<f-render :comps="comps" />
389+
</template>
390+
391+
<script>
392+
import comps from "f-render/src/fixtures/comps";
393+
// 查找 input 组件,当然你也可以看源码,直接查看索引
394+
const inputIndex = comps.findIndex(item => item.type === "input");
395+
// 更改 config.attrs.data 值即可
396+
comps[inputIndex].config.attrs.data = { clearable: true };
397+
398+
export default {
399+
data() {
400+
return {
401+
comps
402+
};
403+
}
404+
};
405+
</script>
406+
```
407+
383408
### 样式定制化
384409

385410
直接进行样式覆盖即可,注意不要加 `scoped`,否则覆盖不成功
@@ -440,7 +465,7 @@ props: {
440465
// 操作配置
441466
operations: {
442467
type: Array,
443-
default: () => ["preview", "data", "code", "batch", "clear"]
468+
default: () => ["preview", "data", "code", "batch", "clear", "save"]
444469
},
445470
// 是否在加载
446471
loading: Boolean,

demo.webp

2.5 MB
Binary file not shown.

package.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "f-render",
3-
"version": "4.8.0",
3+
"version": "4.9.0",
44
"private": false,
55
"license": "MIT",
66
"description": "f-render | 基于 ElementUI 的表单设计器",
@@ -17,7 +17,6 @@
1717
"dependencies": {
1818
"clipboard-copy": "^3.1.0",
1919
"clone": "^2.1.2",
20-
"fast-deep-equal": "^3.1.3",
2120
"fuzzy": "^0.1.3",
2221
"indent-string": "^4.0.0",
2322
"lodash": "^4.17.20",
@@ -50,7 +49,7 @@
5049
"prettier": "^1.19.1",
5150
"standard-version": "^9.0.0",
5251
"vue": "^2.6.11",
53-
"vue-ele-form": "^0.8.46",
52+
"vue-ele-form": "^0.8.49",
5453
"vue-template-compiler": "^2.6.11"
5554
},
5655
"repository": {

src/components/left/index.vue

+10-11
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535

3636
<script>
3737
const fuzzy = require("fuzzy");
38-
import { addFormItem } from "../../utils";
3938
4039
export default {
4140
inject: ["frender"],
@@ -54,22 +53,22 @@ export default {
5453
};
5554
},
5655
methods: {
57-
// 获取数据
58-
getFormItem(config) {
59-
return addFormItem({
60-
config,
61-
commonData: this.frender.formItemCommon.data
62-
});
56+
getFormItemByConfig({ type, label }) {
57+
const formItemData = this.frender.getFormItemByType(type);
58+
return {
59+
label,
60+
field: "key_" + Date.now(),
61+
...formItemData
62+
};
6363
},
6464
// 双击添加表单
6565
handleDoubleClick(config) {
66-
this.frender.updateFormItemList(
67-
this.frender.formItemList.concat(this.getFormItem(config))
68-
);
66+
const formItemData = this.getFormItemByConfig(config);
67+
this.frender.formItemList = [...this.frender.formItemList, formItemData];
6968
},
7069
// 拖拽后新增表单项
7170
handleAddFormItem(config) {
72-
return this.getFormItem(config);
71+
return this.getFormItemByConfig(config);
7372
}
7473
}
7574
};

src/components/main/components/batch-dialog.vue

+43-20
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
<template>
22
<ele-form-dialog
33
v-model="formData"
4-
:formDesc="batchFormDesc"
4+
:formDesc="formDesc"
55
labelPosition="left"
66
width="800px"
77
:dialogAttrs="{
88
'close-on-click-modal': false,
99
'append-to-body': true
1010
}"
11-
:request-fn="handleAdd"
11+
@request="handleAdd"
1212
:visible="visible"
13-
@update:visible="$emit('change', $event)"
13+
@update:visible="$emit('change')"
1414
title="批量添加表单项"
1515
></ele-form-dialog>
1616
</template>
1717

1818
<script>
1919
import _ from "lodash";
20-
import { addFormItem } from "../../../utils";
2120
2221
export default {
2322
inject: ["frender"],
@@ -27,12 +26,22 @@ export default {
2726
default: false
2827
}
2928
},
29+
watch: {
30+
visible(val) {
31+
if (val) {
32+
this.formData = {
33+
type: "dynamic",
34+
formItems: []
35+
};
36+
}
37+
}
38+
},
3039
computed: {
3140
// 字段出现的次数
3241
fieldCountObj() {
33-
return _.countBy(this.frender.formItemList, o => o.field);
42+
return _.countBy(this.frender.formItemList, o => String(o.field).trim());
3443
},
35-
batchFormDesc() {
44+
formDesc() {
3645
return {
3746
type: {
3847
type: "radio",
@@ -94,11 +103,26 @@ export default {
94103
validator: (rule, value, callback) => {
95104
let errorArr = [];
96105
if (Array.isArray(value) && value.length) {
106+
// 当前输入表单的字段统计个数
107+
const currentFieldCountObj = _.countBy(value, o =>
108+
String(o.field).trim()
109+
);
110+
111+
// 合并后的字段统计个数
112+
const mergedCountObj = Object.assign(
113+
{},
114+
currentFieldCountObj,
115+
_.mapValues(this.fieldCountObj, (val, field) => {
116+
return currentFieldCountObj[field]
117+
? val + currentFieldCountObj[field]
118+
: val;
119+
})
120+
);
121+
97122
// 字段不可重复
98123
errorArr = value
99124
.map((item, index) =>
100-
this.frender.formDesc[item.field] ||
101-
this.fieldCountObj[item.field] > 1
125+
mergedCountObj[item.field] > 1
102126
? `${index + 1}行的 field 重复`
103127
: null
104128
)
@@ -140,23 +164,22 @@ export default {
140164
methods: {
141165
handleAdd({ formItems }) {
142166
try {
143-
const newFormItems = formItems.map(item =>
144-
addFormItem({
145-
...item,
146-
config: this.frender.compsMap.get(item.type),
147-
commonData: this.frender.formItemCommon.data
148-
})
149-
);
167+
const newFormItems = formItems.map(({ field, label, type }) => ({
168+
...this.frender.getFormItemByType(type),
169+
field: String(field).trim(),
170+
label: String(label).trim()
171+
}));
150172
151-
this.frender.updateFormItemList(
152-
this.frender.formItemList.concat(newFormItems)
153-
);
173+
this.frender.formItemList = [
174+
...this.frender.formItemList,
175+
...newFormItems
176+
];
154177
155-
// 回复数据
156178
this.$message.success("添加成功");
179+
// 回复数据
157180
this.formData = {
158181
type: "dynamic",
159-
data: []
182+
formItems: []
160183
};
161184
162185
this.$emit("change", false);

0 commit comments

Comments
 (0)