Skip to content

Commit 1808170

Browse files
committed
v0.2.0 新增 varlet、tree(web components)渲染器🎉
1 parent 9530f46 commit 1808170

File tree

21 files changed

+121
-146
lines changed

21 files changed

+121
-146
lines changed

README.md

Lines changed: 9 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
此工具仅适用于布局简单纯粹的表单场景 😄
1313

14-
在线文档及演示:👉[Github Pages](https://0604hx.github.io/grid-form/)[Gitee Pages(国内推荐](https://0604hx.gitee.io/grid-form/)👈
14+
在线文档及演示:👉[Github Pages](https://0604hx.github.io/grid-form/)[Gitee Pages(暂无法访问](https://0604hx.gitee.io/grid-form/)👈
1515

1616
包名|说明|进度|版本
1717
-|-|-|-
@@ -23,11 +23,14 @@ render-vant|基于[Vant4](https://vant-ui.github.io)实现的渲染器|✅|![ren
2323
render-varlet|基于[varlet](https://github.com/varletjs/varlet)实现的渲染器|✅|![render-vant](https://img.shields.io/npm/v/%40grid-form%2Frender-varlet?color=6750a4)
2424
render-tree|简单树形结构渲染器(Web Components)|✅|![render-tree](https://img.shields.io/npm/v/%40grid-form%2Frender-varlet?color=gray)
2525

26+
**说明:** Web Components 渲染器可以在任何 web 项目中使用(不限于 vue 环境)😄
27+
2628
**相关博文**
2729

2830
* [基于 VUE3 可视化低代码表单设计器](https://blog.csdn.net/ssrc0604hx/article/details/128825163)
2931
* [嵌套子表单与自定义脚本交互](https://blog.csdn.net/ssrc0604hx/article/details/135828101)
30-
32+
* [文档网站搭建(VitePress)与部署(Github Pages)](https://blog.csdn.net/ssrc0604hx/article/details/135970166)
33+
* [必填项检验 BUG 修复实录](https://blog.csdn.net/ssrc0604hx/article/details/136617743)
3134

3235
## 1. 总览 / OVERVIEW
3336

@@ -38,6 +41,7 @@ render-tree|简单树形结构渲染器(Web Components)|✅|![render-tree](h
3841
## 2. 开始使用 / GETTING STARTED
3942

4043
### 2.1 仅使用渲染器
44+
> 详细文档见:[render.md](packages/site/guide/render.md)
4145
4246
1. 安装依赖
4347

@@ -60,21 +64,6 @@ import { FormRender, RenderFuncs } from "@grid-form/render-naive"
6064
let form = reactive({})
6165
```
6266

63-
**Props**
64-
65-
名称|类型|默认值|说明
66-
-|-|-|-
67-
renders|Object|{}|组件渲染函数
68-
gridGap|Number|10|可视化区域栅栏间隔,单位 px
69-
form|Object|undefined|表单对象
70-
review|Boolean|false|是否在提交前对表单项做校验
71-
debug|Boolean|false|开启debug 模式后,会在控制台输入各种信息
72-
placeholder|String|`^\\${(.*)}$`|默认值占位符检测正则表达式
73-
valueProvider|Object|{}|占位符内容计算函数,详见下一节的说明
74-
on-inited|()=>void|undefined|
75-
on-submit|(formObj:Object,action="post")=>void|undefined|用户点击提交按钮后触发(如设置了 `review` 则自检成功后方触发)
76-
on-failed|(fails:Array[String])=>void|undefined|设置`review`后自检失败触发
77-
7867
#### 2.1.1 表单项默认值
7968
> 我们可以通过`${xxxx}`的格式设置(注意,前后不能有其他字符)表单项的默认值,渲染过程中会将占位符替换为计算后的值
8069
@@ -142,83 +131,11 @@ import { createForm } from "@grid-form/common"
142131
let form = reactive(createForm())
143132
```
144133

145-
**Props**
146-
147-
名称|类型|默认值|说明
148-
-|-|-|-
149-
components|Array|[]|组件库
150-
renders|Object|{}|组件渲染函数
151-
siderWidth|Number,String|360|左右侧边栏的宽度,支持 px、% 单位,建议直接传递数值
152-
gridGap|Number|10|可视化区域栅栏间隔,单位 px
153-
review|Boolean|false|是否对表单项做校验(如id、名称不能为空,不允许重复 id),校验不通过则抛出异常
154-
form|Object|undefined|表单对象
155-
compact|Boolean|false|紧凑的布局,如果设置为true,则左右两侧的属性编辑行距缩短
156-
headerHeight|Number|55|设计器头部高度
157-
showFooter|Boolean|false|是否显示设计器底部
158-
footerHeight|Number|50|设计器底部高度,单位 px
159-
contextMenu|Boolean|false|`SINCE 0.0.6`是否启用右键菜单(方便操控表单项)
160-
enableCtrlS|Boolean|false|`SINCE 0.0.8`是否启用 CTRL+S 保存快捷键
161-
debug|Boolean|false|开启debug 模式后,会在控制台输入各种信息
162-
163-
**Slots**
164-
165-
名称|说明
166-
-|-
167-
title|设计器头部标题内容
168-
footer|设计器底部内容(需要设置 `show-footer` 为 true)
169-
170-
效果如下
171-
172134
![设计器](docs/screenshot/designer.png)
173135

174136
## 3. 数据结构 / DATA STRUCTURE
175137

176-
### 3.1 表单
177-
178-
属性|类型|默认值|说明
179-
-|-|-|-
180-
id|String|undefined|表单ID(由业务系统自行填充)
181-
size|String|medium|整体表单尺寸,其他值:`small``large`
182-
width|String,Number|100%|表单宽度(支持 px、% 格式)
183-
grid|Number|3|栅栏格数(1 到 24 之间)
184-
labelWidth|Number|120|标签宽度(单位 px)
185-
labelShow|Boolean|true|全局设置标签是否显示
186-
labelPlacement|String|top|标签位置,其他值:`left`(左边),`Vant`渲染器不适用
187-
labelAlign|String|left|标签对齐方式,其他值:`right`(靠右)
188-
submitText|String|提交数据|默认按钮的文本(若为空,则不显示该按钮)
189-
okText|String||提交完成后回显文案(由业务系统进行回显)
190-
url|String||后端接口地址(由业务系统完成数据提交)
191-
onLoad|String|undefined|`JS 代码`表单初始化后调用
192-
onSubmit|String|undefined|`JS 代码`表单提交前调用钩子,用于进行数据预处理,也可以中断表单(返回 Promise)
193-
onChange|String|undefined|`JS 代码`表单值变动时调用钩子,通常用于表单联动(`since v0.0.4`
194-
afterSubmit|String|undefined|`JS 代码`表单提交完成后调用钩子(注意:需要由业务系统自行调用)
195-
hides|Array|[]|表单默认值(隐藏项),包含`id``value`两个属性
196-
items|Array|[]|表单项
197-
buttons|Array|[]|自定义按钮
198-
199-
### 3.2 表单项
200-
> 表单项属性分两类:控件属性、基本信息(以`_`开头),分别对应了组件渲染函数的两个参数:`props``attrs`
201-
202-
属性|类型|默认值|说明
203-
-|-|-|-
204-
_uuid|String||表单项ID(对于显示类组件不存在该属性)
205-
_text|String||标签内容
206-
_widget|String||组件编号(按此定位渲染函数)
207-
_col|Number|1|组件所占格子数
208-
_value|String||默认值(支持占位符)
209-
_required|Boolean|false|是否必填
210-
_regex|String||检验正则表达式
211-
_message|String||校验不通过时回显的文字
212-
213-
### 3.3 额外按钮
214-
215-
属性|类型|默认值|说明
216-
-|-|-|-
217-
text|String|按钮|文本信息
218-
theme|String|default|按钮配色,其他值:`success`(绿色)、`warning`(橙色)、`error`(红色)
219-
type|String|post|触发事件类型,`post`(与`默认按钮`一致,表单提交)、`download`(下载操作)、`script`(仅执行代码)
220-
code|String|undefined|若脚本返回`false`则中断后续流程
221-
138+
详见:[data-structure.md](packages/site/guide/data-structure.md)
222139

223140
## 4. 开发 / DEVELOPMENT
224141
> 本项目采用 `pnpm` 进行管理,请确保相应环境已安装
@@ -229,6 +146,8 @@ git clone https://github.com/0604hx/grid-form
229146

230147
# 安装依赖
231148
pnpm i
149+
# 如果网络卡顿,可以使用镜像
150+
pnpm i --registry https://registry.npmmirror.com/
232151

233152
# 运行示例(基于 VitePress)
234153
pnpm site

docs/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,16 @@
33
在线文档及演示请看:[Document & Demo](https://0604hx.github.io/grid-form/)
44

55
或者移步 `packages/site` 包查看 😄
6+
7+
8+
## 开发说明
9+
10+
### 检测依赖更新
11+
> 使用[ncu](https://github.com/raineorshine/npm-check-updates)工具
12+
13+
```shell
14+
# 检测是否有更新
15+
ncu -ws
16+
# 使用更新
17+
ncu -ws -u
18+
```

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
"scripts": {
88
"site": "pnpm -F site dev",
99
"site:build": "pnpm -F site build",
10-
"build:tree": "pnpm -F @grid-form/render-tree build",
10+
"tree:build": "pnpm -F @grid-form/render-tree build",
1111
"release": "pnpm publish -r"
1212
},
1313
"keywords": [
@@ -18,8 +18,8 @@
1818
"author": "0604hx <zxingming@foxmail.com>",
1919
"license": "MIT",
2020
"devDependencies": {
21-
"@vitejs/plugin-vue": "^5.0.4",
22-
"vite": "^5.2.8",
23-
"vue": "^3.4.21"
21+
"@vitejs/plugin-vue": "^5.1.4",
22+
"vite": "^5.4.10",
23+
"vue": "^3.5.12"
2424
}
2525
}

packages/common/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grid-form/common",
3-
"version": "0.1.4",
3+
"version": "0.2.0",
44
"description": "",
55
"homepage": "https://github.com/0604hx/grid-form",
66
"repository": "https://github.com/0604hx/grid-form",

packages/designer/components/editor.code.vue

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@
33
更多配置请参考 https://github.com/surmon-china/vue-codemirror
44
-->
55
<template>
6-
<codemirror
7-
v-model="code"
8-
:placeholder="placeholder"
9-
:style="{ height }"
10-
:autofocus="autofocus"
11-
:indent-with-tab="true"
12-
:tab-size="tabSize"
13-
:extensions="extensions"
14-
@change="v=>emits('update:value', v)"
15-
/>
6+
<div :style="{ height, width:'100%'}">
7+
<codemirror
8+
v-model="code"
9+
:placeholder="placeholder"
10+
:style="{ height }"
11+
:autofocus="autofocus"
12+
:indent-with-tab="true"
13+
:tab-size="tabSize"
14+
:extensions="extensions"
15+
@change="v=>emits('update:value', v)"
16+
/>
17+
</div>
1618
</template>
1719

1820
<script setup>
@@ -26,11 +28,12 @@
2628
value:{type:String, default:""},
2729
autofocus: {type:Boolean, default:false},
2830
tabSize:{type:Number, default:4},
29-
height: {type:String, default:"300px"},
30-
placeholder:{type:String, default:"请输入代码"}
31+
height: {type:String, default:"200px"},
32+
placeholder:{type:String, default:"请输入代码"},
33+
codeExtensions: {type:[Array, Object], default:[]}
3134
})
3235
33-
const extensions = [javascript()]
36+
const extensions = [javascript(), ...(Array.isArray(props.codeExtensions)?props.codeExtensions:[props.codeExtensions])]
3437
// if(window.DARD === true) extensions.push(oneDark)
3538
3639
let code = ref(props.value)

packages/designer/form-designer.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<n-layout position="absolute" :style="{top: headerHeight + 'px', bottom: showFooter?(footerHeight + 'px'):'0px'}" has-sider>
2424
<!--左侧表单配置面板-->
2525
<n-layout-sider collapse-mode="transform" :collapsed-width="collapsedWidth" :width="siderWidth" show-trigger="arrow-circle" content-style="padding: 12px;" :native-scrollbar="false" bordered>
26-
<FormSetting :form :compact :paneHook :paneHide :paneButton />
26+
<FormSetting :form :compact :paneHook :paneHide :paneButton :codeExtensions />
2727
</n-layout-sider>
2828

2929
<!--设计器主体-->
@@ -107,6 +107,7 @@
107107
footerHeight: {type:Number, default: 50 },
108108
contextMenu: {type:Boolean, default: false}, //开启右键菜单
109109
enableCtrlS: {type:Boolean, default: false}, //是否开启 CTRL+S 保存快捷键
110+
codeExtensions: {type:[Array, Object], default:[]}, //代码编辑器扩展
110111
111112
paneHook: {type:Boolean, default: true}, //是否显示左侧的回调函数面板
112113
paneHide: {type:Boolean, default: true}, //是否显示左侧的默认值面板

packages/designer/form-setting.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
</template>
145145

146146
<n-alert :title="hooker.func.summary" type="info" :bordered="false"/>
147-
<CodeEditor v-model:value="form[hooker.func.name]" height="360px" style="margin-top: 8px;"/>
147+
<CodeEditor v-model:value="form[hooker.func.name]" height="360px" style="margin-top: 8px;" :codeExtensions/>
148148
</n-modal>
149149

150150
<n-modal v-model:show="btner.show" preset="card" :style="{width: '1000px'}" :title="'⌈'+btner.item.text+'⌋的脚本'" :mask-closable="false">
@@ -176,7 +176,7 @@
176176
</n-table>
177177
</n-alert>
178178

179-
<CodeEditor v-model:value="btner.item.code" height="360px" style="margin-top: 8px;"/>
179+
<CodeEditor v-model:value="btner.item.code" height="360px" style="margin-top: 8px;" />
180180
</n-modal>
181181
</template>
182182

@@ -198,6 +198,7 @@
198198
const props = defineProps({
199199
form: {type:Object},
200200
compact: {type:Boolean, default:false },
201+
codeExtensions: {type:[Array, Object], default:[]},
201202
paneHook: {type:Boolean, default: true}, //是否显示左侧的回调函数面板
202203
paneHide: {type:Boolean, default: true}, //是否显示左侧的默认值面板
203204
paneButton: {type: Boolean, default: true}, //是否显示左侧的额外按钮面板

packages/designer/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grid-form/designer",
3-
"version": "0.1.4",
3+
"version": "0.2.0",
44
"description": "基于 naive-ui 组件库的表单设计器",
55
"homepage": "https://github.com/0604hx/grid-form",
66
"repository": "https://github.com/0604hx/grid-form",
@@ -17,7 +17,7 @@
1717
"@grid-form/common": "workspace:*",
1818
"@vicons/fa": "^0.12.0",
1919
"codemirror": "^6.0.1",
20-
"naive-ui": "^2.38.1",
20+
"naive-ui": "^2.40.1",
2121
"vue-codemirror": "^6.1.1"
2222
}
2323
}

packages/render-data/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
"access": "public"
1414
},
1515
"devDependencies": {
16-
"naive-ui": "^2.35.0"
16+
"naive-ui": "^2.40.1"
1717
},
1818
"dependencies": {
19-
"marked": "^4.2.12"
19+
"marked": "^14.1.3"
2020
}
2121
}

packages/render-element/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grid-form/render-element",
3-
"version": "0.1.4",
3+
"version": "0.2.0",
44
"description": "基于 element-plus 的渲染器",
55
"homepage": "https://github.com/0604hx/grid-form",
66
"repository": "https://github.com/0604hx/grid-form",
@@ -16,6 +16,6 @@
1616
"@grid-form/common": "workspace:*"
1717
},
1818
"devDependencies": {
19-
"element-plus": "^2.6.3"
19+
"element-plus": "^2.8.7"
2020
}
2121
}

packages/render-naive/container.vue

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
</NPopconfirm>
1212
</td>
1313
<td>
14+
<!--此处其实与下方的代码一致,可以通过 @vueuse/core 进行组件复用,但是考虑到不增加额外依赖,不落实😄-->
1415
<n-grid :x-gap="gridGap" :y-gap="gridGap" :cols="form.grid" :style="{width: form.width, margin:'0px auto' }">
1516
<template v-for="(item, index) in form.items" :key="index">
1617
<NFormItemGridItem v-if="item._hide!=true" :span="item._col" :show-feedback="false" :show-label="!(item._hideLabel === true || !form.labelShow)"
@@ -36,21 +37,21 @@
3637
</template>
3738
<template v-else>
3839
<n-grid :x-gap="gridGap" :y-gap="gridGap" :cols="form.grid" :style="{width: form.width, margin:'0px auto' }">
39-
<template v-for="(item, index) in form.items" :key="index">
40-
<NFormItemGridItem v-if="item._hide!=true" :span="item._col" :show-feedback="false" :show-label="!(item._hideLabel === true || !form.labelShow)"
41-
:label-placement="form.labelPlacement" :label-align="form.labelAlign" :label-width="form.labelWidth">
42-
<template #label>
43-
{{item._text}}<span v-if="item._required" style="color: red;"> *</span>
44-
</template>
40+
<template v-for="(item, index) in form.items" :key="index">
41+
<NFormItemGridItem v-if="item._hide!=true" :span="item._col" :show-feedback="false" :show-label="!(item._hideLabel === true || !form.labelShow)"
42+
:label-placement="form.labelPlacement" :label-align="form.labelAlign" :label-width="form.labelWidth">
43+
<template #label>
44+
{{item._text}}<span v-if="item._required" style="color: red;"> *</span>
45+
</template>
4546

46-
<component v-if="item._container && item.items" :is="buildComponent(item, renders, false)">
47-
<render-container :gridGap="gridGap" :renders="renders" :form="item" :formData="childForm(item)" :labelPlacement="item.labelPlacement" :labelAlign="item.labelAlign" />
48-
</component>
49-
<component v-else-if="item._widget=='DATE'" v-model:formatted-value="formData[item._uuid]" :is="buildComponent(item, renders, false)" />
50-
<component v-else v-model:value="formData[item._uuid]" :is="buildComponent(item, renders, false)" />
51-
</NFormItemGridItem>
52-
</template>
53-
</n-grid>
47+
<component v-if="item._container && item.items" :is="buildComponent(item, renders, false)">
48+
<render-container :gridGap="gridGap" :renders="renders" :form="item" :formData="childForm(item)" :labelPlacement="item.labelPlacement" :labelAlign="item.labelAlign" />
49+
</component>
50+
<component v-else-if="item._widget=='DATE'" v-model:formatted-value="formData[item._uuid]" :is="buildComponent(item, renders, false)" />
51+
<component v-else v-model:value="formData[item._uuid]" :is="buildComponent(item, renders, false)" />
52+
</NFormItemGridItem>
53+
</template>
54+
</n-grid>
5455
</template>
5556
</template>
5657

packages/render-naive/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@grid-form/render-naive",
3-
"version": "0.1.4",
3+
"version": "0.2.0",
44
"description": "基于 naive-ui 的渲染器",
55
"homepage": "https://github.com/0604hx/grid-form",
66
"repository": "https://github.com/0604hx/grid-form",
@@ -16,6 +16,6 @@
1616
"@grid-form/common": "workspace:*"
1717
},
1818
"devDependencies": {
19-
"naive-ui": "^2.38.2"
19+
"naive-ui": "^2.40.1"
2020
}
2121
}

0 commit comments

Comments
 (0)