继续完善
This commit is contained in:
parent
043c05addc
commit
e8bd9c527f
|
|
@ -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)
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
# 三层架构
|
||||
|
||||
在Oak框架中,前台组织可以由高到低分为三个层次,如下图所示:
|
||||
在Oak框架中,前端部分的结构可以由高到低分为三个层次,如下图所示:
|
||||

|
||||
|
||||
#### namespace
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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组件。
|
||||
|
||||
|
|
|
|||
|
|
@ -53,10 +53,20 @@ oakPath={oakFullpath}
|
|||
##### 子组件是抽象组件
|
||||
有些子组件是抽象组件,并不限定在某一具体*Entity*上。这类组件在使用时,和其父组件可以通过共享路径来实现这种抽象逻辑。例如,在*oak-frontend-base*库中,提供了诸如*list/detail/filter*等抽象类组件,像*list*组件可以渲染出一个对象列表,在使用时就要声明其*oakPath*和当前(List)结点的*oakFullpath*一致。
|
||||
|
||||
##### 几个子组件是对同一对象的更新
|
||||
##### 多个子组件是对同一行对象的更新
|
||||
在有些设计中,由于对某一对象的某类操作需要涉及更新大量的属性,在设计时会采用共享路径的方式,使他们的更新被缓存在同一个组件树结点之上。像下面这样的步骤条设计中,多个步骤条下的子组件如果是更新同行数据,它们的oakPath可以设置成一致。
|
||||
|
||||

|
||||
这种情况要注意,第一个渲染的子组件应负责取数,而后续渲染的子组件的projection会被忽略。
|
||||
|
||||
|
||||
### 子组件的相对路径重复
|
||||
有的时候,需要在同一个相对路径下渲染多个不同的子组件,这种情况在一对多的关系中最常见。例如,假设在一个*System*的detail组件中,我们希望用两个子组件来分别渲染:
|
||||
* 第一个子组件渲染所有类型为Web的*Application*(list)
|
||||
* 第二个子组件渲染所有类型为小程序的*Application*(list)
|
||||
因为两个组件都是*Application*对象的list,且它们相对*System*父结点的相对路径都是*application$system*,但它们并不是上面所描述的共享结点的情况,因为两个组件渲染的数据并不一样(filter会有区别)
|
||||
|
||||
这种情况,可以分别定义两个组件的oakPath为```${oakFullpath}.application$system:1``` 和```${oakFullpath}.application$system:2 ```,通过冒号和后面的字符来进行区分。
|
||||
|
||||
### 绝对路径
|
||||
在有的情况下,某个组件的渲染需要引用另一个对象的组件,而它们(所属的对象)之间并没有直接的关联关系(请注意,这种情况你应该首先检查一下,你的设计是否合理),此时无法通过相对路径来标定两者之间的绝对关系,此时我们可以为该子组件设置一条绝对路径:
|
||||
|
|
|
|||
|
|
@ -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定义很容易理解其语义的配置也不再展开解释。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
# 编写组件/页面
|
||||
设计完Entity后,您可立即进入应用页面的编写(Oak框架会自动处理发请求、取数据、缓存等一系列工作,不需要你再编写任何一行相关代码了😁)。
|
||||
|
||||
编写组件/页面可以认为是应用编写最复杂的部分,因此这部分内容也较为繁重。直接编写完组件/页面,您就已经拥有一个可以演示的应用了。
|
||||
|
||||
- [三层架构](./2-1.md)
|
||||
- [目录文件结构](2-2.md)
|
||||
- [编写组件](2-3.md)
|
||||
- [编写组件](2-3.md)
|
||||
- [组织组件](2-4.md)
|
||||
- [定义组件规范](2-5.md)
|
||||
Loading…
Reference in New Issue