继续完善

This commit is contained in:
Xu Chang 2024-07-22 21:28:40 +08:00
parent 043c05addc
commit e8bd9c527f
7 changed files with 51 additions and 7 deletions

View File

@ -17,4 +17,4 @@
- [编写更新组件](./chapter2/2-3-2.md)
- [编写列表组件](./chapter2/2-3-3.md)
- [组织组件](./chapter2/2-4.md)
- [组件上的数据和方法](./chapter2/2-5.md)
- [定义组件对象](./chapter2/2-5.md)

View File

@ -1,6 +1,6 @@
# 三层架构
在Oak框架中台组织可以由高到低分为三个层次,如下图所示:
在Oak框架中端部分的结构可以由高到低分为三个层次,如下图所示:
![层次结构](./components.png)
#### namespace

View File

@ -22,7 +22,7 @@ render.android.tsx | android渲染
将前端各平台的渲染语法强行统一到一个框架之下如taro, uniapp的前景固然美好但这会带来兼容性和扩展性的严重问题同时也会造成与开源社区的割裂。这显然与Oak框架的设计目标背道而驰。因此Oak框架借鉴了微信小程序和React的设计思想将页面的各种与渲染无关的逻辑部分抽象到index.ts当中而将各个平台的渲染代码分割到各个文件之中在对应平台下运行的时候进行加载从而达到一致性和兼容性的较好平衡。
## index.ts
在index.ts中定义了本页面/组件的逻辑代码此文件中应当避免引用任何平台相关的特性内容而只关注于页面的逻辑能力。关于index.ts的编写,请参见[页面逻辑层](2-3.md)。
在index.ts中定义了本页面/组件的逻辑代码此文件中应当避免引用任何平台相关的特性内容而只关注于页面的逻辑能力。关于index.ts如何编写,请参见[编写组件](2-3.md);而组件逻辑上的方法和数据项,可以参见[定义组件对象](2-5.md)。
如果确实需要引用平台相关的特性内容可以通过process.env.OAK_PLATFORM环境变量加以区别。例如在支付时如果需要唤起平台的支付接口可以像下面这样编写代码引用自oak-pay-business/src/components/pay/detail/index.ts
```typescript

View File

@ -6,7 +6,7 @@
* **Detail**:详情页,查询并显示此*Entity*的指定id的某条数据
* **Upsert**:更新页,查询并对此*Entity*的指定id的某条数据进行更新或者创建一条新的数据。
> 当然,也可以编写一个不关联任何Entity的组件,我们称之为**Virtual组件**。关于Virtual组件的作用和规范我们在[组织组件章节](2-4.md)中会加以描述。
> 当然,也允许用户编写一个不关联在任何Entity上的组件,我们称之为**Virtual组件**。关于Virtual组件的作用和规范我们在[组织组件章节](2-4.md)中会加以描述。
下面将以*oak-general-business*包当中的*System*和*Application*这两个*Entity*作为示例介绍如何编写Entity组件。

View File

@ -53,10 +53,20 @@ oakPath={oakFullpath}
##### 子组件是抽象组件
有些子组件是抽象组件,并不限定在某一具体*Entity*上。这类组件在使用时,和其父组件可以通过共享路径来实现这种抽象逻辑。例如,在*oak-frontend-base*库中,提供了诸如*list/detail/filter*等抽象类组件,像*list*组件可以渲染出一个对象列表,在使用时就要声明其*oakPath*和当前List结点的*oakFullpath*一致。
##### 几个子组件是对同一对象的更新
##### 多个子组件是对同一行对象的更新
在有些设计中由于对某一对象的某类操作需要涉及更新大量的属性在设计时会采用共享路径的方式使他们的更新被缓存在同一个组件树结点之上。像下面这样的步骤条设计中多个步骤条下的子组件如果是更新同行数据它们的oakPath可以设置成一致。
![步骤条](steps.jpg)
这种情况要注意第一个渲染的子组件应负责取数而后续渲染的子组件的projection会被忽略。
### 子组件的相对路径重复
有的时候,需要在同一个相对路径下渲染多个不同的子组件,这种情况在一对多的关系中最常见。例如,假设在一个*System*的detail组件中我们希望用两个子组件来分别渲染
* 第一个子组件渲染所有类型为Web的*Application*list
* 第二个子组件渲染所有类型为小程序的*Application*list
因为两个组件都是*Application*对象的list且它们相对*System*父结点的相对路径都是*application$system*但它们并不是上面所描述的共享结点的情况因为两个组件渲染的数据并不一样filter会有区别
这种情况可以分别定义两个组件的oakPath为```${oakFullpath}.application$system:1``` 和```${oakFullpath}.application$system:2 ```,通过冒号和后面的字符来进行区分。
### 绝对路径
在有的情况下,某个组件的渲染需要引用另一个对象的组件,而它们(所属的对象)之间并没有直接的关联关系(请注意,这种情况你应该首先检查一下,你的设计是否合理),此时无法通过相对路径来标定两者之间的绝对关系,此时我们可以为该子组件设置一条绝对路径:

View File

@ -1 +1,31 @@
# 组件上的数据和方法
# 定义组件对象
通过OakComponent接口可以定义一个组件对象。在前几章我们已经看到部分重要的定义配置项完整的配置项及格式可以参见```oak-frontend-base/src/types/Page.ts```文件。在编写代码时typescript也会给出有效的提示。在本章节我们将归纳并进一步介绍部分配置项以及组件本身可引用的数据项和方法。
## 配置项
配置项 | 类型 | 作用
------------|-----------------------|---------
entity | string \| () => string | 组件关联的*Entity*
isList | boolean | 组件是否为列表页
projection | object \| () => object| 组件所取的*Entity*属性
filters | array | 组件取*Entity*的过滤条件仅对list组件有效
sorters | array | 组件取*Entity*的排序仅对list组件有效
pagination | object | 组件取*Entity*的分页设置仅对list组件有效
getTotal | number \| object | 组件取*Entity*时取满足条件的行总数设置仅对list组件有效
properties | object | 组件接受的props
data | object | 组件自身的data(React中的state)
features | array | 组件需要监听哪些features的变化
actions | array | 组件需要检查哪些actions的许可
singleton | boolean | 组件是否单实例
formData | function | 组件处理取到的*Entity*数据
methods | Record<string, function> | 组件自身定义的方法
关于projection/filters/sorters的格式请了解*Entity*相关章节todo在这里不再展开讨论。一些通过typescript定义很容易理解其语义的配置也不再展开解释。

View File

@ -1,6 +1,10 @@
# 编写组件/页面
设计完Entity后您可立即进入应用页面的编写Oak框架会自动处理发请求、取数据、缓存等一系列工作不需要你再编写任何一行相关代码了😁
编写组件/页面可以认为是应用编写最复杂的部分,因此这部分内容也较为繁重。直接编写完组件/页面,您就已经拥有一个可以演示的应用了。
- [三层架构](./2-1.md)
- [目录文件结构](2-2.md)
- [编写组件](2-3.md)
- [编写组件](2-3.md)
- [组织组件](2-4.md)
- [定义组件规范](2-5.md)