amis2/docs/zh-CN/concepts/schema.md
2021-11-28 11:18:33 +08:00

271 lines
6.1 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 配置与组件
description: 配置与组件
type: 0
group: 💡 概念
menuName: 配置与组件
icon:
order: 9
---
## 最简单的 amis 配置
一个最简单的 amis 配置看起来是这样的:
```json
{
"type": "page",
"body": "Hello World!"
}
```
请观察上面的代码,这是一段 JSON它的含义是
1. `type` 是 amis 节点中最重要的字段,它告诉 amis 当前节点需要渲染的是`Page`组件。
2.`body` 字段会作为 `Page` 组件的属性,`Page` 组件根据这个值来渲染页面内容。
这段配置的效果如下所示:
```schema
{
"type": "page",
"body": "Hello World!"
}
```
上面这个配置是可以**实时修改预览**的,尝试改一下 `Hello World!` 的值。
> 不过这个实时预览功能对于某些属性不生效,如果发现不符合预期,需要复制 JSON打开另一个页面后粘贴。
## 组件
上面提到,`type`字段会告诉 amis 当前节点渲染的组件为`Page`,组件节点的配置永远都是由 **`type`字段** (用于标识当前是哪个组件)和 **属性** 构成的。
```
{
"type": "xxx",
...其它属性
}
```
## 组件树
这次我们看一个稍微复杂一点的配置:
```json
{
"type": "page",
"body": {
"type": "tpl",
"tpl": "Hello World!"
}
}
```
该配置渲染页面如下:
```schema
{
"type": "page",
"body": {
"type": "tpl",
"tpl": "Hello World!"
}
}
```
最终效果和前面的示例一样,但这次 `Page` 组件的 `body` 属性值配置了一个对象,**通过`type`指明`body`内容区内会渲染一个叫`Tpl`的组件**,它是一个模板渲染组件。
`body` 中除了配置对象,还可以是数组,比如下面的例子:
```schema: scope="body"
[
{
"type": "tpl",
"tpl": "Hello World!"
},
{
"type": "divider"
},
{
"type": "form",
"body": [
{
"type": "input-text",
"name": "name",
"label": "姓名"
}
]
}
]
```
可以看到通过数组的形式,增加了 `divider` 和 `form` 组件。
除了 `Page` 之外,还有很多**容器型**的组件都有 `body` 属性通过这种树形结构amis 就能实现复杂页面制作。
> **注意:**
>
> `Page`是 amis 页面配置中 **必须也是唯一的顶级节点**
### 通过树形来实现布局
下面这个页面就是通过树形组合出来的,大体结构是这样:
```
Page
├── Toolbar
│ └─ Form 顶部表单项
├── Grid // 用于水平布局
│ ├─ Panel
│ │ └─ Tabs
│ │ └─ Chart
│ └─ Panel
│ └─ Chart
└── CRUD
```
```schema
{
"type": "page",
"toolbar": [{
"type": "form",
"panelClassName": "mb-0",
"title": "",
"body": [{
"type": "select",
"label": "区域",
"name": "businessLineId",
"selectFirst": true,
"mode": "inline",
"options": ["北京", "上海"],
"checkAll": false
}, {
"label": "时间范围",
"type": "input-date-range",
"name": "dateRange",
"inline": true,
"value": "-1month,+0month",
"inputFormat": "YYYY-MM-DD",
"format": "YYYY-MM-DD",
"closeOnSelect": true,
"clearable": false
}],
"actions": [],
"mode": "inline",
"target": "mainPage",
"submitOnChange": true,
"submitOnInit": true
}],
"body": [{
"type": "grid",
"columns": [
{
"type": "panel",
"className": "h-full",
"body": {
"type": "tabs",
"tabs": [{
"title": "消费趋势",
"tab": [{
"type": "chart",
"config": {
"title": {
"text": "消费趋势"
},
"tooltip": {},
"xAxis": {
"type": "category",
"boundaryGap": false,
"data": ["一月", "二月", "三月", "四月", "五月", "六月"]
},
"yAxis": {},
"series": [{
"name": "销量",
"type": "line",
"areaStyle": {
"color": {
"type": "linear",
"x": 0,
"y": 0,
"x2": 0,
"y2": 1,
"colorStops": [{
"offset": 0,
"color": "rgba(84, 112, 197, 1)"
}, {
"offset": 1,
"color": "rgba(84, 112, 197, 0)"
}],
"global": false
}
},
"data": [5, 20, 36, 10, 10, 20]
}]
}
}]
}, {
"title": "账户余额",
"tab": "0"
}]
}
}, {
"type": "panel",
"className": "h-full",
"body": [{
"type": "chart",
"config": {
"title": {
"text": "使用资源占比"
},
"series": [{
"type": "pie",
"data": [{
"name": "BOS",
"value": 70
}, {
"name": "CDN",
"value": 68
}, {
"name": "BCC",
"value": 48
}, {
"name": "DCC",
"value": 40
}, {
"name": "RDS",
"value": 32
}]
}]
}
}]
}]
}, {
"type": "crud",
"className": "m-t-sm",
"api": "/api/mock2/sample",
"columns": [{
"name": "id",
"label": "ID"
}, {
"name": "engine",
"label": "Rendering engine"
}, {
"name": "browser",
"label": "Browser"
}, {
"name": "platform",
"label": "Platform(s)"
}, {
"name": "version",
"label": "Engine version"
}, {
"name": "grade",
"label": "CSS grade"
}]
}]
}
```
> amis 后续将会实现新的布局模式,将更容易实现复杂布局效果