From 7f7a839aef66baceec025e6b95bfc20f6cc60ddb Mon Sep 17 00:00:00 2001
From: hufeixiong <673632758@qq.com>
Date: Sat, 10 Jul 2021 23:19:56 +0800
Subject: [PATCH] add doc
---
packages/dooringx-doc/src/app.html | 6 +-
packages/dooringx-doc/src/docs/1.2.md | 8 +-
packages/dooringx-doc/src/docs/2.1.md | 6 +-
packages/dooringx-doc/src/docs/2.2.md | 10 +-
packages/dooringx-doc/src/docs/2.3.md | 12 ++
packages/dooringx-doc/src/docs/2.4.md | 15 ++
packages/dooringx-doc/src/docs/2.5.md | 13 ++
packages/dooringx-doc/src/docs/3.1.md | 27 +++
packages/dooringx-doc/src/docs/3.2.md | 29 ++++
packages/dooringx-doc/src/docs/3.3.md | 157 ++++++++++++++++++
packages/dooringx-doc/src/docs/3.4.md | 22 +++
packages/dooringx-doc/src/docs/3.5.md | 101 +++++++++++
packages/dooringx-doc/src/docs/3.6.md | 5 +
packages/dooringx-doc/src/docs/3.7.md | 5 +
packages/dooringx-doc/src/docs/3.8.md | 5 +
.../dooringx-doc/src/lib/DocRender/prism.css | 3 +
.../dooringx-doc/src/lib/Header/index.svelte | 4 +-
.../dooringx-doc/src/routes/__layout.svelte | 1 +
.../src/plugin/registComponents/button.tsx | 7 +-
packages/dooringx-lib/src/config/index.tsx | 3 +-
20 files changed, 418 insertions(+), 21 deletions(-)
create mode 100644 packages/dooringx-doc/src/docs/2.3.md
create mode 100644 packages/dooringx-doc/src/docs/2.4.md
create mode 100644 packages/dooringx-doc/src/docs/2.5.md
create mode 100644 packages/dooringx-doc/src/docs/3.1.md
create mode 100644 packages/dooringx-doc/src/docs/3.2.md
create mode 100644 packages/dooringx-doc/src/docs/3.3.md
create mode 100644 packages/dooringx-doc/src/docs/3.4.md
create mode 100644 packages/dooringx-doc/src/docs/3.5.md
create mode 100644 packages/dooringx-doc/src/docs/3.6.md
create mode 100644 packages/dooringx-doc/src/docs/3.7.md
create mode 100644 packages/dooringx-doc/src/docs/3.8.md
diff --git a/packages/dooringx-doc/src/app.html b/packages/dooringx-doc/src/app.html
index 38ed9b1..6dd56aa 100644
--- a/packages/dooringx-doc/src/app.html
+++ b/packages/dooringx-doc/src/app.html
@@ -2,11 +2,11 @@
* @Author: yehuozhili
* @Date: 2021-06-29 11:14:15
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-01 22:13:09
- * @FilePath: \my-app\src\app.html
+ * @LastEditTime: 2021-07-10 20:30:13
+ * @FilePath: \dooringx\packages\dooringx-doc\src\app.html
-->
-
+
diff --git a/packages/dooringx-doc/src/docs/1.2.md b/packages/dooringx-doc/src/docs/1.2.md
index cb199cc..3090b6e 100644
--- a/packages/dooringx-doc/src/docs/1.2.md
+++ b/packages/dooringx-doc/src/docs/1.2.md
@@ -3,11 +3,9 @@ title: dooringx-lib 如何工作?
sTitle: 介绍
order: 2
---
+
+dooringx-lib 在运行时维护一套数据流,主要分为json数据部分,左侧组件部分,右侧配置项部分,快捷键部分,弹窗部分,事件与函数部分,数据源部分。
-dooringx-lib 在载入后会进行实例化,如果有插件需要传递给 config。
+其除了提供基础的拖拽、移动、缩放、全选等功能外,还可以使用暴露的组件。如果觉得组件不够定制化,可以调整样式或者自己重新写。
-开发者通过调用 api 来获取想要的数据,来开发出自己想要的功能。
-对于概念部分请参考 dooringx-lib 基础,对于 api 部分请参考 api。
-
-建议先学习 dooringx-lib 基础和 dooringx-lib 插件开发注意事项再去看 api
diff --git a/packages/dooringx-doc/src/docs/2.1.md b/packages/dooringx-doc/src/docs/2.1.md
index ec3ea44..e157520 100644
--- a/packages/dooringx-doc/src/docs/2.1.md
+++ b/packages/dooringx-doc/src/docs/2.1.md
@@ -1,7 +1,7 @@
---
title: store
sTitle: dooringx-lib基础
-order: 3
+order: 4
---
store 类似于 redux 的概念,它内部实现了 redo、undo、发布订阅、置换数据、强制刷新等功能。
@@ -10,8 +10,10 @@ store 可以在 config 中获取。
在最开始时,需要通过 useStoreState 与 react 结合,此时可以在任意位置使用 store.forceUpdate 强刷,也可以使用 state 获取 store 中的数据。
-store 的主要数据是保存着每次修改 jsonSchema 队列。
+store 的最重要功能是保存着每次修改 jsonSchema 队列。
如果你需要更新数据,在深拷贝后使用 setData 方法进行更新。
如果你需要更新时不记录在 redo 或 undo 上留下记录,那么请操作队列删除其中保存内容即可。
+
+对于改变数据后想即使看见视图更新,那么使用forceUpdate即可。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/2.2.md b/packages/dooringx-doc/src/docs/2.2.md
index 2f9e103..716aab2 100644
--- a/packages/dooringx-doc/src/docs/2.2.md
+++ b/packages/dooringx-doc/src/docs/2.2.md
@@ -1,5 +1,11 @@
---
-title: functionCenter
+title: 事件
sTitle: dooringx-lib基础
-order: 3
+order: 5
---
+
+dooringx-lib 的事件是在eventCenter上,它上面会集成functionCenter与一个事件链。
+
+在eventCenter中可以获取组件注册的时机。时机类似于组件生命周期一样,可以注册后在对应的时机进行调用。
+
+而functionCenter中的函数则会与时机结合,再由事件链对用户设定的队列进行统一处理。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/2.3.md b/packages/dooringx-doc/src/docs/2.3.md
new file mode 100644
index 0000000..1483717
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/2.3.md
@@ -0,0 +1,12 @@
+---
+title: 命令
+sTitle: dooringx-lib基础
+order: 6
+---
+
+dooringx-lib 的命令是由commander进行管理。
+
+内部默认提供redo与undo的命令,您可以通过插件方式增加commander。
+
+commander内部集成了快捷键配置,使用键盘事件的key进行注册,如果ctrl、alt、meta键,可加对应的加号进行组合键注册,内部忽略大小写(注意!不是忽略注册的键名大小写,而是A和a的key处理时等价)。
+
diff --git a/packages/dooringx-doc/src/docs/2.4.md b/packages/dooringx-doc/src/docs/2.4.md
new file mode 100644
index 0000000..702f79b
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/2.4.md
@@ -0,0 +1,15 @@
+---
+title: 弹窗
+sTitle: dooringx-lib基础
+order: 7
+---
+
+dooringx-lib内置弹窗系统,弹窗系统是通过storeChanger进行转换而成。
+
+所以在某些情景制作时,可能需要考虑是否在弹窗编辑下的情况。
+
+每个弹窗是只保存block中的数据,而事件等数据只会存在主数据内。
+
+在弹窗保存后,弹窗数据会被置换于主数据内存着,需要编辑时重新置换出来。
+
+可以使用storeChanger上的方法进行判断,或者直接获取数据源数据等,具体见API。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/2.5.md b/packages/dooringx-doc/src/docs/2.5.md
new file mode 100644
index 0000000..cc00569
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/2.5.md
@@ -0,0 +1,13 @@
+---
+title: 数据源
+sTitle: dooringx-lib基础
+order: 8
+---
+
+dooringx-lib 的数据源和前面说的store中存储的不是一个东西。
+
+它位于dataCenter中。设计数据源的初衷是为了让不懂代码的人更好理解。
+
+事件的运行完全可以脱离数据源运行,只要使用者知道如何去填写参数。
+
+所以在事件配置时,可以多个选项在数据源中去获得数据转变为参数。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.1.md b/packages/dooringx-doc/src/docs/3.1.md
new file mode 100644
index 0000000..a1058be
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.1.md
@@ -0,0 +1,27 @@
+---
+title: 插件导入
+sTitle: dooringx-lib插件开发
+order: 9
+---
+
+dooringx-lib的插件需要一个类型为`Partial`的对象。
+
+对于多个插件,需要使用dooringx-lib导出的`userConfigMerge`来进行合并。
+
+userConfigMerge不是所有属性都会合并,部分属性会进行覆盖。
+
+```
+ * 部分无法合并属性如果b传了会以b为准
+ * initstore不合并
+ * leftallregistmap合并
+ * leftRenderListCategory合并
+ * rightRenderListCategory合并
+ * rightGlobalCustom 不合并
+ * initComponentCache合并
+ * initFunctionMap合并
+ * initDataCenterMap合并
+ * initCommandModule合并
+ * initFormComponents合并
+```
+
+config支持部分配置异步导入,比如左侧分类等,这个是实验性功能,所以不推荐这么做。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.2.md b/packages/dooringx-doc/src/docs/3.2.md
new file mode 100644
index 0000000..b9e3c61
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.2.md
@@ -0,0 +1,29 @@
+---
+title: 左侧面板
+sTitle: dooringx-lib插件开发
+order: 10
+---
+
+左侧面板传入leftRenderListCategory即可。
+
+```js
+leftRenderListCategory: [
+ {
+ type: 'basic',
+ icon: ,
+ displayName: '基础组件',
+ },
+ {
+ type: 'xxc',
+ icon: ,
+ custom: true,
+ customRender: 我是自定义渲染
,
+ },
+],
+```
+
+type是分类,左侧组件显示在哪个分类由该字段决定。
+
+icon则是左侧分类小图标。
+
+当custom为true时,可以使用customRender自定义渲染。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.3.md b/packages/dooringx-doc/src/docs/3.3.md
new file mode 100644
index 0000000..01dd487
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.3.md
@@ -0,0 +1,157 @@
+---
+title: 左侧组件
+sTitle: dooringx-lib插件开发
+order: 11
+---
+
+## 插件导入
+
+左侧组件要至于对象的LeftRegistMap中。
+
+左侧组件支持同步导入或者异步导入。
+
+```js
+const LeftRegistMap: LeftRegistComponentMapItem[] = [
+ {
+ type: 'basic',
+ component: 'button',
+ img: 'icon-anniu',
+ displayName: '按钮',
+ urlFn: () => import('./registComponents/button'),
+ },
+];
+```
+
+如果需要异步导入组件,则需要填写urlFn,需要一个返回promise的函数。也可以支持远程载入组件,只要webpack配上就行了。
+
+如果需要同步导入组件,则需要将组件放入配置项的initComponentCache中,这样在载入时便会注册进componentRegister里。
+
+```js
+initComponentCache: {
+ modalMask: { component: MmodalMask },
+},
+```
+
+## 组件编写
+
+组件需要导出一个由ComponentItemFactory生成的对象。
+
+```js
+const MButton = new ComponentItemFactory(
+ 'button',
+ '按钮',
+ {
+ style: [
+ createPannelOptions('input', {
+ receive: 'text',
+ label: '文字',
+ text: 'yehuozhili',
+ }),
+ ],
+ animate: [createPannelOptions('animateControl', {})],
+ actions: [createPannelOptions('actionButton', {})],
+ },
+ {
+ props: {
+ ...
+ },
+ },
+ (data, context, store, config) => {
+ return ;
+ },
+ true
+);
+
+export default MButton;
+
+```
+
+其中第一个参数为组件注册名,第二个参数用来展示使用。
+
+
+第三个参数用来配置右侧面板的配置项组件。其中键为右侧面板的分类,值为配置项组件数组。
+
+第四个参数会配置组件的初始值,特别注意的是,制作组件必须要有初始宽度(非由内容撑开),否则会在适配时产生问题。
+
+第五个参数是个函数,你将获得配置项中的receive属性(暂且都默认该配置为receive)传来的配置,比如上例中receive的是text,则该函数中data里会收到该字段。
+
+context一般只有preview和edit,用来进行环境判断。
+
+config可以拿到所有数据,用来制作事件时使用。
+
+第六个参数resize 是为了判断是否能进行缩放,当为false时,无法进行缩放。
+
+第七个参数needPosition,某些组件移入画布后会默认采取拖拽的落点,该配置项默认为true,为false时将使用组件自生top和left定位来放置。
+
+
+
+## 事件注册
+
+### 时机注册
+
+前面说了事件有时机和函数,所以组件内可以使用hook注册时机:
+
+```js
+useDynamicAddEventCenter(pr, `${pr.data.id}-init`, '初始渲染时机'); //注册名必须带id 约定!
+useDynamicAddEventCenter(pr, `${pr.data.id}-click`, '点击执行时机');
+```
+
+useDynamicAddEventCenter第一个参数是render的四个参数组成的对象。第二个参数是注册的时机名,必须跟id相关,这是约定,否则多个组件可能会导致名称冲突,并且方便查找该时机。
+
+注册完时机后,你需要将时机放入对应的触发位置上,比如这个button的点击执行时机就放到onclick中:
+
+```js
+
+```
+
+其中第一个参数则为注册的时机名,第二个为render函数中最后个参数config
+
+
+### 函数注册
+
+函数由组件抛出,可以加载到事件链上。比如,注册个改变文本函数,那么我可以在任意组件的时机中去调用该函数,从而触发该组件改变文本。
+
+函数注册需要放入useEffect中,在组件卸载时需要卸载函数!否则会导致函数越来越多。
+
+```js
+useEffect(() => {
+ const functionCenter = eventCenter.getFunctionCenter();
+ const unregist = functionCenter.register(
+ `${pr.data.id}+改变文本函数`,
+ async (ctx, next, config, args, _eventList, iname) => {
+ const userSelect = iname.data;
+ const ctxVal = changeUserValue(
+ userSelect['改变文本数据源'],
+ args,
+ '_changeval',
+ config,
+ ctx
+ );
+ const text = ctxVal[0];
+ setText(text);
+ next();
+ },
+ [
+ {
+ name: '改变文本数据源',
+ data: ['ctx', 'input', 'dataSource'],
+ options: {
+ receive: '_changeval',
+ multi: false,
+ },
+ },
+ ]
+ );
+ return () => {
+ unregist();
+ };
+}, []);
+```
+
+函数中参数与配置见后面函数开发。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.4.md b/packages/dooringx-doc/src/docs/3.4.md
new file mode 100644
index 0000000..833db98
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.4.md
@@ -0,0 +1,22 @@
+---
+title: 右侧面板
+sTitle: dooringx-lib插件开发
+order: 12
+---
+
+右侧面板的配置和左侧面板一样:
+
+```js
+export interface RightMapRenderListPropsItemCategory {
+ type: string;
+ icon: ReactNode;
+ custom?: boolean;
+ customRender?: (type: string, current: IBlockType) => ReactNode;
+}
+```
+
+type会影响左侧组件在开发时第三个参数的键名。那个键名中即代表该右侧中展示的type。
+
+icon则是可以放文字或者图标用来进行面板切换的。
+
+如果custom为true,该面板下的显示可以通过customRender自定义。
diff --git a/packages/dooringx-doc/src/docs/3.5.md b/packages/dooringx-doc/src/docs/3.5.md
new file mode 100644
index 0000000..7a839ea
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.5.md
@@ -0,0 +1,101 @@
+---
+title: 右侧组件
+sTitle: dooringx-lib插件开发
+order: 13
+---
+
+## 右侧组件导入
+
+导入时,只要将开发的组件配成一个对象放入initFormComponents即可。
+
+```js
+initFormComponents: Formmodules,
+```
+
+## 右侧组件开发
+
+首先为了良好的开发体验,需要定义个formMap类型:
+
+```js
+export interface FormBaseType {
+ receive?: string;
+}
+export interface FormInputType extends FormBaseType {
+ label: string;
+ text: string;
+}
+export interface FormActionButtonType {}
+export interface FormAnimateControlType {}
+export interface FormMap {
+ input: FormInputType;
+ actionButton: FormActionButtonType;
+ animateControl: FormAnimateControlType;
+}
+```
+formMap的键名就是initFormComponents键名,formMap的值对应组件需要收到的值。
+
+以input组件为例,FormInputType此时有3个属性,label,text,receive。
+
+那么在其开发该组件时,props会收到:
+
+```js
+interface MInputProps {
+ data: CreateOptionsRes;
+ current: IBlockType;
+ config: UserConfig;
+}
+```
+也就是其中data是formMap类型,而current是当前点击的组件,config就不用说了。
+
+还记得在左侧组件开发中的第三个参数吗?这样就都关联起来了:
+
+```js
+
+style: [
+ createPannelOptions('input', {
+ receive: 'text',
+ label: '文字',
+ text: 'yehuozhili',
+ }),
+ ],
+
+```
+createPannelOptions 这个函数的泛型里填入对应的组件,将会给收到的配置项良好的提示。
+
+在配置项组件里所要做的就是接收组件传来的配置项,然后去修改current的属性:
+
+
+```js
+function MInput(props: MInputProps) {
+ const option = useMemo(() => {
+ return props.data?.option || {};
+ }, [props.data]);
+ return (
+
+
+ {(option as any)?.label || '文字'}:
+
+
+ {
+ const receive = (option as any).receive;
+ const clonedata = deepCopy(store.getData());
+ const newblock = clonedata.block.map((v: IBlockType) => {
+ if (v.id === props.current.id) {
+ v.props[receive] = e.target.value;
+ }
+ return v;
+ });
+ store.setData({ ...clonedata, block: [...newblock] });
+ }}
+ >
+
+
+ );
+}
+```
+
+由于可以很轻松的拿到store,所以可以在任意地方进行修改数据。
+
+将组件的value关联current的属性,onChange去修改store,这样就完成了个双向绑定。
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.6.md b/packages/dooringx-doc/src/docs/3.6.md
new file mode 100644
index 0000000..91dc83b
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.6.md
@@ -0,0 +1,5 @@
+---
+title: 命令开发
+sTitle: dooringx-lib插件开发
+order: 14
+---
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.7.md b/packages/dooringx-doc/src/docs/3.7.md
new file mode 100644
index 0000000..8470ba4
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.7.md
@@ -0,0 +1,5 @@
+---
+title: 右键菜单
+sTitle: dooringx-lib插件开发
+order: 15
+---
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/docs/3.8.md b/packages/dooringx-doc/src/docs/3.8.md
new file mode 100644
index 0000000..004b1b0
--- /dev/null
+++ b/packages/dooringx-doc/src/docs/3.8.md
@@ -0,0 +1,5 @@
+---
+title: 函数开发
+sTitle: dooringx-lib插件开发
+order: 16
+---
\ No newline at end of file
diff --git a/packages/dooringx-doc/src/lib/DocRender/prism.css b/packages/dooringx-doc/src/lib/DocRender/prism.css
index af9a602..3bf02c3 100644
--- a/packages/dooringx-doc/src/lib/DocRender/prism.css
+++ b/packages/dooringx-doc/src/lib/DocRender/prism.css
@@ -118,3 +118,6 @@ pre[class*='language-'] {
.token.entity {
cursor: help;
}
+p {
+ line-height: 2.5;
+}
diff --git a/packages/dooringx-doc/src/lib/Header/index.svelte b/packages/dooringx-doc/src/lib/Header/index.svelte
index de8d93b..2947efb 100644
--- a/packages/dooringx-doc/src/lib/Header/index.svelte
+++ b/packages/dooringx-doc/src/lib/Header/index.svelte
@@ -36,14 +36,14 @@
- {
lang.update((pre) => {
return pre === 'cn' ? 'en' : 'cn';
});
}}
- />
+ /> -->
diff --git a/packages/dooringx-doc/src/routes/__layout.svelte b/packages/dooringx-doc/src/routes/__layout.svelte
index 9cf3be9..9f40e95 100644
--- a/packages/dooringx-doc/src/routes/__layout.svelte
+++ b/packages/dooringx-doc/src/routes/__layout.svelte
@@ -36,4 +36,5 @@
flex-direction: column;
overflow: hidden;
}
+
diff --git a/packages/dooringx-example/src/plugin/registComponents/button.tsx b/packages/dooringx-example/src/plugin/registComponents/button.tsx
index 878264a..6d44a64 100644
--- a/packages/dooringx-example/src/plugin/registComponents/button.tsx
+++ b/packages/dooringx-example/src/plugin/registComponents/button.tsx
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-07-07 14:35:38
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-10 19:04:05
+ * @LastEditTime: 2021-07-10 23:04:56
* @FilePath: \dooringx\packages\dooringx-example\src\plugin\registComponents\button.tsx
*/
@@ -35,7 +35,6 @@ function ButtonTemp(pr: ComponentRenderConfigProps) {
const [text, setText] = useState('');
useEffect(() => {
- //模拟改变文本
const functionCenter = eventCenter.getFunctionCenter();
const unregist = functionCenter.register(
`${pr.data.id}+改变文本函数`,
@@ -86,8 +85,6 @@ function ButtonTemp(pr: ComponentRenderConfigProps) {
onClick={() => {
eventCenter.runEventQueue(`${pr.data.id}-click`, pr.config);
}}
- // type={props.type}
- // size={props.size}
>
{text ? text : props.text}
@@ -100,7 +97,7 @@ const MButton = new ComponentItemFactory(
{
style: [
createPannelOptions('input', {
- receive: 'text', //用于发送回的props,必传 ,跨组件传递需要指定额外字段
+ receive: 'text',
label: '文字',
text: 'yehuozhili',
}),
diff --git a/packages/dooringx-lib/src/config/index.tsx b/packages/dooringx-lib/src/config/index.tsx
index fe7cb3b..bff1956 100644
--- a/packages/dooringx-lib/src/config/index.tsx
+++ b/packages/dooringx-lib/src/config/index.tsx
@@ -2,7 +2,7 @@
* @Author: yehuozhili
* @Date: 2021-02-25 21:16:58
* @LastEditors: yehuozhili
- * @LastEditTime: 2021-07-10 18:29:07
+ * @LastEditTime: 2021-07-10 21:22:42
* @FilePath: \dooringx\packages\dooringx-lib\src\config\index.tsx
*/
import { IBlockType, IStoreData } from '../core/store/storetype';
@@ -34,7 +34,6 @@ import MmodalMask from '../core/components/defaultFormComponents/modalMask';
* @interface CacheComponentValueType
*/
export interface CacheComponentValueType {
- urlFn?: () => Promise;
component?: ComponentItemFactory;
}
export type CacheComponentType = Record | {};