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

Commit 106fa49

Browse files
committed
feat: 增加插槽 & 右侧属性面板配置
1 parent c2f966f commit 106fa49

File tree

8 files changed

+160
-45
lines changed

8 files changed

+160
-45
lines changed

README.md

+77-7
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@
1515
- [注意](#%E6%B3%A8%E6%84%8F)
1616
- [特性](#%E7%89%B9%E6%80%A7)
1717
- [Demo](#demo)
18-
- [安装 & 注册](#%E5%AE%89%E8%A3%85--%E6%B3%A8%E5%86%8C)
19-
- [使用简介](#%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B)
20-
- [表单设计](#%E8%A1%A8%E5%8D%95%E8%AE%BE%E8%AE%A1)
21-
- [表单使用](#%E8%A1%A8%E5%8D%95%E4%BD%BF%E7%94%A8)
22-
- [基于 f-render 使用](#%E5%9F%BA%E4%BA%8E-f-render-%E4%BD%BF%E7%94%A8)
23-
- [基于 vue-ele-form 使用](#%E5%9F%BA%E4%BA%8E-vue-ele-form-%E4%BD%BF%E7%94%A8)
18+
- [1 分钟快速接入](#1-%E5%88%86%E9%92%9F%E5%BF%AB%E9%80%9F%E6%8E%A5%E5%85%A5)
19+
- [第 1 步:安装](#%E7%AC%AC-1-%E6%AD%A5%E5%AE%89%E8%A3%85)
20+
- [第 2 步:注册](#%E7%AC%AC-2-%E6%AD%A5%E6%B3%A8%E5%86%8C)
21+
- [第 3 步:使用](#%E7%AC%AC-3-%E6%AD%A5%E4%BD%BF%E7%94%A8)
22+
- [用户模式](#%E7%94%A8%E6%88%B7%E6%A8%A1%E5%BC%8F)
23+
- [基于 f-render 的配置](#%E5%9F%BA%E4%BA%8E-f-render-%E7%9A%84%E9%85%8D%E7%BD%AE)
24+
- [基于 vue-ele-form 的配置](#%E5%9F%BA%E4%BA%8E-vue-ele-form-%E7%9A%84%E9%85%8D%E7%BD%AE)
2425
- [定制化](#%E5%AE%9A%E5%88%B6%E5%8C%96)
2526
- [新增官方扩展组件(以富文本扩展为例)](#%E6%96%B0%E5%A2%9E%E5%AE%98%E6%96%B9%E6%89%A9%E5%B1%95%E7%BB%84%E4%BB%B6%E4%BB%A5%E5%AF%8C%E6%96%87%E6%9C%AC%E6%89%A9%E5%B1%95%E4%B8%BA%E4%BE%8B)
2627
- [安装组件](#%E5%AE%89%E8%A3%85%E7%BB%84%E4%BB%B6)
@@ -31,10 +32,12 @@
3132
- [书写配置](#%E4%B9%A6%E5%86%99%E9%85%8D%E7%BD%AE)
3233
- [合并配置并传入](#%E5%90%88%E5%B9%B6%E9%85%8D%E7%BD%AE%E5%B9%B6%E4%BC%A0%E5%85%A5)
3334
- [定制化原组件配置 & 表单配置](#%E5%AE%9A%E5%88%B6%E5%8C%96%E5%8E%9F%E7%BB%84%E4%BB%B6%E9%85%8D%E7%BD%AE--%E8%A1%A8%E5%8D%95%E9%85%8D%E7%BD%AE)
35+
- [定制化右侧 Tabs](#%E5%AE%9A%E5%88%B6%E5%8C%96%E5%8F%B3%E4%BE%A7-tabs)
3436
- [样式定制化](#%E6%A0%B7%E5%BC%8F%E5%AE%9A%E5%88%B6%E5%8C%96)
3537
- [二次开发](#%E4%BA%8C%E6%AC%A1%E5%BC%80%E5%8F%91)
36-
- [f-render 不能做什么?](#f-render-%E4%B8%8D%E8%83%BD%E5%81%9A%E4%BB%80%E4%B9%88)
38+
- [f-render 问答集锦](#f-render-%E9%97%AE%E7%AD%94%E9%9B%86%E9%94%A6)
3739
- [Props 说明](#props-%E8%AF%B4%E6%98%8E)
40+
- [插槽](#%E6%8F%92%E6%A7%BD)
3841
- [生态](#%E7%94%9F%E6%80%81)
3942
- [特别感谢赞助者](#%E7%89%B9%E5%88%AB%E6%84%9F%E8%B0%A2%E8%B5%9E%E5%8A%A9%E8%80%85)
4043
- [Contributors ✨](#contributors-)
@@ -403,6 +406,32 @@ export default {
403406
</script>
404407
```
405408

409+
### 定制化右侧 Tabs
410+
411+
我们可以通过 `isShowRight` 属性来控制右侧面板是否显示,通过 `rightTabs` 来定制具体显示的面板名称,具体如下:
412+
413+
```html
414+
<template>
415+
<!-- 定制化右侧 tabs -->
416+
<f-render :right-tabs="tabs" />
417+
</template>
418+
419+
<script>
420+
export default {
421+
data() {
422+
return {
423+
tabs: [
424+
{ label: "表单项属性配置", name: "form-item-common" },
425+
{ label: "组件属性配置", name: "form-item-attrs" }
426+
// 注释下面的内容,就可以不显示
427+
// { label: "表单配置", name: "form-props" }
428+
]
429+
};
430+
}
431+
};
432+
</script>
433+
```
434+
406435
### 样式定制化
407436

408437
直接进行样式覆盖即可,注意不要加 `scoped`,否则覆盖不成功
@@ -465,6 +494,20 @@ props: {
465494
type: Array,
466495
default: () => ["preview", "data", "code", "batch", "clear", "save"]
467496
},
497+
// 是否显示右侧
498+
isShowRight: {
499+
type: Boolean,
500+
default: true
501+
},
502+
// 右侧属性面板 Tabs
503+
rightTabs: {
504+
type: Array,
505+
default: () => [
506+
{ label: "表单项属性配置", name: "form-item-common" },
507+
{ label: "组件属性配置", name: "form-item-attrs" },
508+
{ label: "表单配置", name: "form-props" }
509+
]
510+
},
468511
// 是否在加载
469512
loading: Boolean,
470513

@@ -477,6 +520,33 @@ props: {
477520
},
478521
```
479522

523+
## 插槽
524+
525+
- left:左侧组件列表
526+
- main: 中间区域
527+
- main-header: 头部操作区
528+
- main-content: 表单设计区
529+
- right: 右侧属性配置区
530+
531+
举例:
532+
533+
```html
534+
<template>
535+
<f-render>
536+
<!-- 左侧插槽 -->
537+
<template v-slot:left="{frender}">
538+
<div>
539+
<div>left</div>
540+
<div>{{frender.comps}}</div>
541+
</div>
542+
</template>
543+
</f-render>
544+
<template></template
545+
></template>
546+
```
547+
548+
其中 `frender` 数据是 `f-render` 组件数据的集合,具体都有哪些数据,可以参考[源码](https://gitee.com/dream2023/f-render/blob/master/src/f-render.vue),其它插槽均有此参数。
549+
480550
## 生态
481551

482552
| Project | Status | Description |

example/App.vue

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
<template>
22
<div>
3-
<app-header />
3+
<app-header
4+
@change="pure = !pure"
5+
:style="{ marginBottom: pure ? '20px' : 0 }"
6+
/>
47
<f-render
58
@save="handleSave"
69
:loading="loading"
7-
height="calc(100vh - 60px)"
10+
height="calc(100vh - 150px)"
811
:config="formConfig"
912
v-model="formData"
13+
:pure="pure"
1014
:options-fn="$axios.get"
1115
/>
1216
</div>
@@ -23,7 +27,8 @@ export default {
2327
return {
2428
loading: false,
2529
formConfig: "",
26-
formData: {}
30+
formData: {},
31+
pure: false
2732
};
2833
},
2934
methods: {

example/AppHeader.vue

+7
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
<h1 class="app-header-title">FRender 表单设计器</h1>
1010
</el-link>
1111
<div class="app-header-right">
12+
<el-button
13+
@click="$emit('change')"
14+
icon="el-icon-view"
15+
type="text"
16+
style="margin-right: 20px"
17+
>切换视图</el-button
18+
>
1219
<el-link
1320
:href="item.url"
1421
target="_blank"

src/components/main/index.vue

+25-7
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,39 @@
1-
<template>
2-
<div>
3-
<main-header @save="$emit('save')" />
4-
<main-content v-loading="loading" />
5-
</div>
6-
</template>
7-
81
<script>
92
import MainHeader from "./main-header";
103
import MainContent from "./main-content";
114
125
export default {
6+
inject: ["frender"],
137
components: {
148
MainHeader,
159
MainContent
1610
},
1711
props: {
1812
loading: Boolean
13+
},
14+
render() {
15+
const slots = this.frender.$scopedSlots;
16+
const directives = [
17+
{
18+
name: "loading",
19+
value: this.loading
20+
}
21+
];
22+
return (
23+
<div>
24+
{slots["main-header"] ? (
25+
slots["main-header"]({ frender: this.frender })
26+
) : (
27+
<main-header onSave={() => this.$emit("save")} />
28+
)}
29+
30+
{slots["main-content"] ? (
31+
slots["main-content"]({ frender: this.frender })
32+
) : (
33+
<main-content {...{ directives }} />
34+
)}
35+
</div>
36+
);
1937
}
2038
};
2139
</script>

src/components/right/index.vue

+7-17
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div class="f-render-right">
33
<el-tabs class="f-render-header" :stretch="true" v-model="activeTab">
44
<el-tab-pane
5-
v-for="tab of tabs"
5+
v-for="tab of frender.rightTabs"
66
:key="tab.name"
77
:label="tab.label"
88
:name="tab.name"
@@ -13,7 +13,7 @@
1313
v-show="activeTab === tab.name"
1414
:is="tab.name"
1515
class="f-render-right-content"
16-
v-for="tab of tabs"
16+
v-for="tab of frender.rightTabs"
1717
:key="tab.name"
1818
/>
1919
</perfect-scrollbar>
@@ -26,35 +26,25 @@ import FormItemAttrs from "./form-item-attrs.vue";
2626
import FormItemCommon from "./form-item-common.vue";
2727
2828
export default {
29+
inject: ["frender"],
2930
components: {
3031
FormProps,
3132
FormItemAttrs,
3233
FormItemCommon
3334
},
3435
data() {
3536
return {
36-
activeTab: "form-item-common",
37-
tabs: [
38-
{
39-
label: "表单项属性配置",
40-
name: "form-item-common"
41-
},
42-
{
43-
label: "组件属性配置",
44-
name: "form-item-attrs"
45-
},
46-
{
47-
label: "表单配置",
48-
name: "form-props"
49-
}
50-
]
37+
activeTab: ""
5138
};
5239
},
5340
watch: {
5441
// 切换Tab滚动到顶部
5542
activeTab() {
5643
this.$refs.scroll.$el.scrollTop = 0;
5744
}
45+
},
46+
mounted() {
47+
this.activeTab = this.frender.rightTabs[0].name;
5848
}
5949
};
6050
</script>

src/f-render.vue

+34-9
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,25 @@
22
<!-- 1.设计阶段 -->
33
<multipane v-if="!pure" :style="{ height }" class="f-render">
44
<!-- 左侧 -->
5-
<f-render-left class="f-render-left" />
5+
<slot name="left" :comps="sortedComps" :frender="this">
6+
<f-render-left />
7+
</slot>
68
<multipane-resizer></multipane-resizer>
79
<!-- 中间 -->
8-
<f-render-main
9-
:loading="loading"
10-
@save="handleSave"
11-
class="f-render-main"
12-
/>
13-
<multipane-resizer></multipane-resizer>
14-
<!-- 右侧 -->
15-
<f-render-right class="f-render-right" />
10+
<slot name="main" :frender="this">
11+
<f-render-main
12+
:loading="loading"
13+
@save="handleSave"
14+
class="f-render-main"
15+
/>
16+
</slot>
17+
<template v-if="isShowRight && rightTabs.length">
18+
<multipane-resizer></multipane-resizer>
19+
<!-- 右侧 -->
20+
<slot name="right" :frender="this">
21+
<f-render-right class="f-render-right" />
22+
</slot>
23+
</template>
1624
</multipane>
1725

1826
<!-- 2.使用 -->
@@ -109,6 +117,23 @@ export default {
109117
type: Array,
110118
default: () => ["preview", "data", "code", "batch", "clear", "save"]
111119
},
120+
// 是否显示右侧
121+
isShowRight: {
122+
type: Boolean,
123+
default: true
124+
},
125+
// 右侧属性面板 Tabs
126+
rightTabs: {
127+
type: Array,
128+
default: () => [
129+
{ label: "表单项属性配置", name: "form-item-common" },
130+
{ label: "组件属性配置", name: "form-item-attrs" },
131+
{ label: "表单配置", name: "form-props" }
132+
],
133+
validator(tabs) {
134+
return (tabs || []).every(item => item.label && item.name);
135+
}
136+
},
112137
// 是否在加载
113138
loading: Boolean,
114139

src/fixtures/comps.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ export default [
143143
autosize: {
144144
type: data => data.autosizeType,
145145
default: data => {
146-
if (data === "switch") {
146+
if (data.autosizeType === "switch") {
147147
return false;
148148
} else {
149149
return { minRows: 2, maxRows: 6 };

src/fixtures/extends/data-editor.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export default {
4040
autosize: {
4141
type: data => data.autosizeType,
4242
default: data => {
43-
if (data === "switch") {
43+
if (data.autosizeType === "switch") {
4444
return false;
4545
} else {
4646
return { minRows: 2, maxRows: 6 };

0 commit comments

Comments
 (0)