diff --git a/docs-old/advanced.md b/docs-old/advanced.md
deleted file mode 100644
index bd737de7..00000000
--- a/docs-old/advanced.md
+++ /dev/null
@@ -1,285 +0,0 @@
----
-title: 高级用法
-shortname: advanced
----
-
-在开始阅读之前,希望你已经阅读 [基本用法](./basic.md) 。
-
-## 数据作用域
-
-配置中很多地方都可以用变量如: [tpl](./renderers/Tpl.md) 类型的渲染器、API 中的 Url、FormItem 中的 source 配置、visibleOn、disabledOn 以及 Form 中的 `redirect` 配置等等。
-
-那么都有哪些数据可以用?这取决于在哪个容器,关于容器中的数据说明如下:
-
-- `page` 等价于全局变量,因为顶级渲染器就是它,所以下面的所有组件都能用到这个里面的数据。
- - `amisPage` 当前页面的数据信息,包含标题,id,key 之类的信息。`注意:平台中使用才有此变量。`
- - `amisUser` 当前用户信息,包含邮箱和用户名信息。`注意:平台中使用才有此变量。`
- - `params 中的数据` 如果地址栏中也携带了参数,也会 merge 到该层的数据中。
- - `initApi 返回的数据` 如果 page 设置了 `initApi` 那么初始化的时候会从 API 中拉取数据,拉取到的数据可以用于整个页面。
-- `crud`
-
- - 父级 容器中的数据可以直接使用,如 page 容器
- - `api` 返回的数据,crud 的 api 除了可以返回 `rows` 和 `count` 数据外,其他的数据会被 merge 到数据中,供容器使用。
-
-- `form`
-
- - 父级 容器中的数据可以直接使用,如 page 容器
- - `initApi` 返回的数据。
- - FormItem 的数据直接会存入到数据中,而且每次修改都会及时更新。通过 FormItem 设置的 `name` 值获取。
-
-- `formItem` 表单项中,所在的表单中的数据都能用。
-- `wizard` 同 form
-- `dialog` dialog 由 button 触发弹出,携带的数据根据按钮所在的位置来决定。
- - form 中弹出则会把 form 中的数据复制份传给 dialog。
- - crud 中的批量操作按钮。把整个列表数据复制给 dialog。
- - crud 中的某一项中的按钮,则只会把对应的那一条数据拷贝给 dialog。
-- `service`
- - 父级 容器中的数据可以直接使用,如 page 容器
- - 如果配置了 `api`, `api` 返回的数据可以用。
-
-取值过程,也跟 JS 作用域中取值一样,当前作用域中有,则直接返回当前作用域中,如果没有当前作用域没有,会一直往上找,直到找到了为止。如果存在同名变量,则返回就近作用域中数据。
-
-需要注意的是,要取到值一定是在自己所在的作用域,或者上级作用域里面,同级的是取不到的,如果需要怎么办?可以往下看联动,比如:FormA 的数据发送给 formB, 另外一种方式,可以把接口拉取换到父级组件去操作,没有可拉取数据的组件,就一起包在一个 service 控件里面。
-
-## 联动
-
-### 简单的显隐联动
-
-主要通过 `visibleOn`、`hiddenOn` 和 `disabledOn` 来配置。
-
-```schema:height="300" scope="form"
-[
- {
- "type": "radios",
- "name": "foo",
- "inline": true,
- "label": " ",
- "options": [
- {
- "label": "类型1",
- "value": 1
- },
- {
- "label": "类型2",
- "value": 2
- },
- {
- "label": "类型3",
- "value": 3
- }
- ]
- },
-
- {
- "type": "text",
- "name": "text",
- "placeholder": "类型1 可见",
- "visibleOn": "data.foo == 1"
- },
-
- {
- "type": "text",
- "name": "text2",
- "placeholder": "类型2 不可点",
- "disabledOn": "data.foo == 2"
- },
-
- {
- "type": "button",
- "label": "类型三不能提交",
- "level": "primary",
- "disabledOn": "data.foo == 3"
- }
-
-]
-```
-
-### 数据联动
-
-比如 select 中 options 可能根据某个值不同而不同。
-
-```schema:height="300" scope="form"
-[
- {
- "label": "选项1",
- "type": "radios",
- "labelClassName": "text-muted",
- "name": "a",
- "inline": true,
- "options": [
- {
- "label": "选项1",
- "value": 1
- },
- {
- "label": "选项2",
- "value": 2
- },
- {
- "label": "选项3",
- "value": 3
- }
- ]
- },
- {
- "label": "选项2",
- "type": "select",
- "labelClassName": "text-muted",
- "name": "b",
- "inline": true,
- "source": "/api/mock2/options/level2?a=${a}",
- "initFetchOn": "data.a"
- }
-]
-```
-
-他们是怎么关联的呢?注意看 select 的 source 配置 `"/api/mock/getOptions?waitSeconds=1&type=$foo"` 这里用了变量 `$foo` 这个 foo 正好是第一个表单的 name 值。只要这个值发生变化,source 就会重新获取一次。
-
-这里有个问题就是,数据一旦变化就会出发重新拉取,如果是输入框岂不是拉取得很频繁?没关系,也可以主动拉取如:
-
-```schema:height="300" scope="body"
-{
- "type": "form",
- "name": "lidong",
- "controls": [
- {
- "type": "text",
- "name": "foo",
- "addOn": {
- "label": "搜索",
- "className": "btn-info",
- "type": "button",
- "actionType": "reload",
- "disabledOn": "!data.foo",
- "target": "lidong.select"
- }
- },
-
- {
- "type": "select",
- "name": "select",
- "label": "Select",
- "source": {
- "method": "get",
- "url": "/api/mock2/options/level2?waitSeconds=1",
- "data": {
- "a": "$foo"
- }
- },
- "desc": "这里只是演示刷新不会真正的过滤。"
- }
- ]
-}
-```
-
-注意,source 中的传参是通过 source 中的 data 关联的,不能写在 source 的 url 中,因为如果写了,就会自动监控值的变化而自动刷新,写在 data 里面关联则不会。如果对 source 中的配置规则不了解,请前往 [API 说明](./renderers/Types.md#API)
-
-另外注意 button 的 target 值,正好是这个 form 的 name 值 `lidong` 的 formItem 的 name 值 `select`。当按钮的对象是一个 formItem 时,会出发 formItem 的数据重新拉取。
-
-### 组件间通信
-
-CRUD 有个 filter 配置项,里面可以配置表单项,当他提交时 CRUD 自动就会携带接受到的表单数据然后重新获取数据。有个限制,就是 CRUD 和 filter 必须放在一起,不能分开,实际上完全可以分开,只要 Form 的 target 是 CRUD 的 name 值即可。
-
-```schema:height="300"
-{
- "type": "page",
- "aside": {
- "type": "form",
- "target": "doc-crud",
- "wrapWithPanel": false,
- "className": "wrapper-xs",
- "controls": [
- {
- "type": "text",
- "name": "keywords",
- "placeholder": "请输入关键字",
- "clearable": true,
- "addOn": {
- "label": "搜索",
- "className": "btn-info",
- "type": "submit"
- }
- }
- ]
- },
- "body": {
- "name": "doc-crud",
- "type": "crud",
- "api": "/api/sample",
- "syncLocation": false,
- "title": null,
- "perPageField":"rn",
- "defaultParams":{
- "rn": 10
- },
- "columns": [
- {
- "name": "id",
- "label": "ID",
- "width": 20,
- "sortable": true
- },
- {
- "name": "engine",
- "label": "Rendering engine",
- "sortable": true,
- "toggled": false
- },
- {
- "name": "browser",
- "label": "Browser",
- "sortable": true
- },
- {
- "name": "platform",
- "label": "Platform(s)",
- "sortable": true
- },
- {
- "name": "version",
- "label": "Engine version"
- }
- ]
- }
-}
-```
-
-Form 的 target 还可以是另外一个 Form,当 A Form 把自己的数据提交给 B Form 时,A 的数据会被合并到 B Form 中,同时,B Form 会再次初始化,如:拉取 initApi, 重新拉取 formItem 上的 source 等等。 比如用户管理中的加入用户操作就是用这种方式实现的。
-
-```schema:height="300"
-{
- "type": "page",
- "aside": {
- "type": "form",
- "target": "doc-form",
- "wrapWithPanel": false,
- "className": "wrapper-xs",
- "controls": [
- {
- "type": "text",
- "name": "keywords",
- "clearable": true,
- "placeholder": "请输入关键字",
- "addOn": {
- "label": "提交",
- "className": "btn-info",
- "type": "submit"
- }
- }
- ]
- },
- "body": {
- "name": "doc-form",
- "type": "form",
- "api": "/api/sample",
- "submitText": null,
- "controls": [
- {
- "type": "static",
- "name": "keywords",
- "label": "你刚刚输入的是:"
- }
- ]
- }
-}
-```
diff --git a/docs-old/api.md b/docs-old/api.md
deleted file mode 100644
index c77a7da7..00000000
--- a/docs-old/api.md
+++ /dev/null
@@ -1,111 +0,0 @@
----
-title: 动态数据
----
-
-除了渲染静态页面及表单,amis 还能渲染动态数据,比如下面这个表格数据是来自 api 这个接口的请求
-
-```json
-{
- "type": "crud",
- "api": " http://xxx/api/sample",
- "columns": [
- {
- "name": "engine",
- "label": "引擎"
- },
- {
- "name": "browser",
- "label": "浏览器"
- }
- ]
-}
-```
-
-amis 期望这个 api 接口返回的是如下的格式:
-
-```json
-{
- "status": 0,
- "msg": "",
- "data": {
- "items": [
- {
- "engine": "Trident",
- "browser": "IE 9"
- },
- {
- "engine": "Gecko",
- "browser": "Firefox 70"
- }
- ]
- }
-}
-```
-
-下面是具体介绍
-
-### 整体格式
-
-要求每个接口都返回 `status` 字段用来表示成功还是失败,如果失败了,通过 `msg` 字段来说明失败原因。当然如果成功 `msg` 也可以用来设置提示信息。
-
-```json
-{
- "status": 0, // 0 表示成功,非0 表示失败
- "msg": "", // 提示信息 包括失败和成功
- "data": {
- // ...
- // 具体的数据
- }
-}
-```
-
-如果你的系统有自己的规范,可以在 fetcher 统一进行适配,如:
-
-```js
-{
- renderAmis(
- {
- // 这里是 amis 的 Json 配置。
- type: 'page',
- title: '简单页面',
- body: '内容'
- },
- {
- // props
- },
- {
- // 忽略别的设置项
- fetcher: function (api) {
- // 适配这种格式 {"code": 0, "message": "", "result": {}}
- return axios(config).then(response => {
- let payload = {
- status: response.data.code,
- msg: response.data.message,
- data: response.data.result
- };
-
- return {
- ...response,
- data: payload
- };
- });
- }
- }
- );
-}
-```
-
-### 具体要求
-
-每个渲染的接口返回都有自己的格式要求,主要体现在 data 字段内部,具体请参考每个渲染的接口说明。
-
-- [Page](./renderers/Page.md#接口说明)
-- [CRUD](./renderers/CRUD.md#接口说明)
-- [Form](./renderers/Form/Form.md#接口说明)
- - [Select](./renderers/Form/Select.md#接口说明)
- - [Checkboxes](./renderers/Form/Checkboxes.md#接口说明)
- - [Radios](./renderers/Form/Radios.md#接口说明)
- - [List](./renderers/Form/List.md#接口说明)
-- [Wizard](./renderers/Wizard.md#接口说明)
-
-`TBD`
diff --git a/docs-old/basic.md b/docs-old/basic.md
deleted file mode 100644
index b4cfccbc..00000000
--- a/docs-old/basic.md
+++ /dev/null
@@ -1,406 +0,0 @@
----
-title: 基本用法
----
-
-先来看个简单的例子。
-
-```schema:height="300"
-{
- "$schema": "https://houtai.baidu.com/v2/schemas/page.json#",
- "type": "page",
- "title": "这是标题部分",
- "subTitle": "这是子标题",
- "remark": "这是小提示信息",
- "aside": "这是侧边栏部分",
- "body": "这是内容区",
- "toolbar": "这是工具栏部分"
-}
-```
-
-> 可以通过编辑器实时修改预览
-
-通过使用上面的例子就能配出一个基本页面框架,这是 amis 渲染器配置的入口。从 `page` 渲染器开始出发,通过在容器中放置不同的渲染器来配置不同性质的页面。
-
-简单说明以上配置信息。
-
-- `$schema` 这个字段可以忽略,他是指定当前 JSON 配置是符合指定路径 https://houtai.baidu.com/v2/schemas/page.json 的 JSON SCHEMA 文件描述的。PS: 编辑器就是靠这个描述文件提示的,可以 hover 到字段上看效果。
-- `type` 指定渲染器类型,这里指定的类型为 `page`。 更多渲染器类型可以去[这里面查看](./renderers.md)。
-- `title` 从 title 开始就是对应的渲染模型上的属性了。这里用来指定标题内容。
-- `subTitle` 副标题.
-- `remark` 标题上面的提示信息
-- `aside` 边栏区域内容
-- `body` 内容区域的内容
-- `toolbar` 工具栏部分的内容
-
-这里有三个配置都是容器类型的。`aside`、`body` 和 `toolbar`。什么是容器类型?容器类型表示,他能够把其他渲染类型放进来。以上的例子为了简单,直接放了个字符串。字符串类型内部是把他当成了 [tpl](./renderers/Tpl.md) 渲染器来处理,在这里也可以通过对象的形式指定,如以下的例子的 body 区域是完全等价的。
-
-```schema:height="100"
-{
- "$schema": "https://houtai.baidu.com/v2/schemas/page.json",
- "type": "page",
- "body": {
- "type": "tpl",
- "tpl": "这是内容区"
- }
-}
-```
-
-容器内可以直接放一个渲染器,也可以放多个,用数组包起来即可如:
-
-```schema:height="130"
-{
- "$schema": "https://houtai.baidu.com/v2/schemas/page.json",
- "type": "page",
- "body": [
- {
- "type": "tpl",
- "tpl": "
段落1
"
- },
-
- {
- "type": "tpl",
- "tpl": "段落2
"
- },
-
- "段落3
"
- ]
-}
-```
-
-再来看一个表单页面的列子
-
-```schema:height="440"
-{
- "$schema": "https://houtai.baidu.com/v2/schemas/page.json#",
- "type": "page",
- "body": {
- "api": "/api/mock2/form/saveForm",
- "type": "form",
- "title": "联系我们",
- "controls": [
- {
- "type": "text",
- "label": "姓名",
- "name": "name"
- },
-
- {
- "type": "email",
- "label": "邮箱",
- "name": "email",
- "required": true
- },
-
- {
- "type": "textarea",
- "label": "内容",
- "name": "content",
- "required": true
- }
- ],
- "actions": [
- {
- "label": "发送",
- "type": "submit",
- "primary": true
- }
- ]
- }
-}
-```
-
-这个例子就是在 body 容器内,放置一个 `form` 类型的渲染器,它就成了一个简单的表单提交页面了,controls 中可以决定放哪些表单项目,actions 中可以放置操作按钮。
-
-如果 body 区域放置一个 `crud` 渲染器,它就是列表页面了,再来看个栗子:
-
-```schema:height="600"
-{
- "$schema": "https://houtai.baidu.com/v2/schemas/page.json#",
- "type": "page",
- "title": "增删改查示例",
- "toolbar": [
- {
- "type": "button",
- "actionType": "dialog",
- "label": "新增",
- "icon": "fa fa-plus pull-left",
- "primary": true,
- "dialog": {
- "title": "新增",
- "body": {
- "type": "form",
- "name": "sample-edit-form",
- "api": "",
- "controls": [
- {
- "type": "alert",
- "level": "info",
- "body": "因为没有配置 api 接口,不能真正的提交哈!"
- },
- {
- "type": "text",
- "name": "text",
- "label": "文本",
- "required": true
- },
- {
- "type": "divider"
- },
- {
- "type": "image",
- "name": "image",
- "label": "图片",
- "required": true
- },
- {
- "type": "divider"
- },
- {
- "type": "date",
- "name": "date",
- "label": "日期",
- "required": true
- },
- {
- "type": "divider"
- },
- {
- "type": "select",
- "name": "type",
- "label": "选项",
- "options": [
- {
- "label": "漂亮",
- "value": "1"
- },
- {
- "label": "开心",
- "value": "2"
- },
- {
- "label": "惊吓",
- "value": "3"
- },
- {
- "label": "紧张",
- "value": "4"
- }
- ]
- }
- ]
- }
- }
- }
- ],
- "body": [
- {
- "type": "crud",
- "api": "/api/mock2/crud/list",
- "defaultParams": {
- "perPage": 5
- },
- "columns": [
- {
- "name": "id",
- "label": "ID",
- "type": "text"
- },
- {
- "name": "text",
- "label": "文本",
- "type": "text"
- },
- {
- "type": "image",
- "label": "图片",
- "multiple": false,
- "name": "image",
- "popOver": {
- "title": "查看大图",
- "body": ""
- }
- },
- {
- "name": "date",
- "type": "date",
- "label": "日期"
- },
- {
- "name": "type",
- "label": "映射",
- "type": "mapping",
- "map": {
- "1": "漂亮",
- "2": "开心",
- "3": "惊吓",
- "4": "紧张",
- "*": "其他:${type}"
- }
- },
- {
- "type": "container",
- "label": "操作",
- "body": [
- {
- "type": "button",
- "icon": "fa fa-eye",
- "level": "link",
- "actionType": "dialog",
- "tooltip": "查看",
- "dialog": {
- "title": "查看",
- "body": {
- "type": "form",
- "controls": [
- {
- "type": "static",
- "name": "id",
- "label": "ID"
- },
- {
- "type": "divider"
- },
- {
- "type": "static",
- "name": "text",
- "label": "文本"
- },
- {
- "type": "divider"
- },
- {
- "type": "static-image",
- "label": "图片",
- "name": "image",
- "popOver": {
- "title": "查看大图",
- "body": ""
- }
- },
- {
- "type": "divider"
- },
- {
- "name": "date",
- "type": "static-date",
- "label": "日期"
- },
- {
- "type": "divider"
- },
- {
- "name": "type",
- "label": "映射",
- "type": "static-mapping",
- "map": {
- "1": "漂亮",
- "2": "开心",
- "3": "惊吓",
- "4": "紧张",
- "*": "其他:${type}"
- }
- }
- ]
- }
- }
- },
- {
- "type": "button",
- "icon": "fa fa-pencil",
- "tooltip": "编辑",
- "level": "link",
- "actionType": "drawer",
- "drawer": {
- "position": "left",
- "size": "lg",
- "title": "编辑",
- "body": {
- "type": "form",
- "name": "sample-edit-form",
- "controls": [
- {
- "type": "alert",
- "level": "info",
- "body": "因为没有配置 api 接口,不能真正的提交哈!"
- },
- {
- "type": "hidden",
- "name": "id"
- },
- {
- "type": "text",
- "name": "text",
- "label": "文本",
- "required": true
- },
- {
- "type": "divider"
- },
- {
- "type": "image",
- "name": "image",
- "multiple": false,
- "label": "图片",
- "required": true
- },
- {
- "type": "divider"
- },
- {
- "type": "date",
- "name": "date",
- "label": "日期",
- "required": true
- },
- {
- "type": "divider"
- },
- {
- "type": "select",
- "name": "type",
- "label": "选项",
- "options": [
- {
- "label": "漂亮",
- "value": "1"
- },
- {
- "label": "开心",
- "value": "2"
- },
- {
- "label": "惊吓",
- "value": "3"
- },
- {
- "label": "漂亮",
- "value": "紧张"
- }
- ]
- }
- ]
- }
- }
- },
- {
- "type": "button",
- "level": "link",
- "icon": "fa fa-times text-danger",
- "actionType": "ajax",
- "tooltip": "删除",
- "confirmText": "您确认要删除? 没有配置 api 确定了也没用,还是不要确定了",
- "api": ""
- }
- ]
- }
- ]
- }
- ]
-}
-```
-
-这个栗子最主要的渲染器就是 CRUD 渲染器了,他的作用是配置了个 API,把数据拉取过来后,根据配置 columns 信息完成列表展示,列类型可以是静态文本、图片、映射或者日期等等。 `columns` 通过 `name` 与行数据关联。除了展示外还可以放置操作按钮。
-
-这里相对复杂一点配置就是按钮了,按钮主要是通过 `actionType`来决定用户点下的行为。可以配置成 弹框、发送 ajax、页面跳转、复制内容到剪切板、刷新目标组件等等。具体请参考:[Action 渲染器说明](./renderers/Action.md)
-
-更多用法请参考[渲染器手册](./renderers.md)和示例。
diff --git a/docs-old/custom.md b/docs-old/custom.md
deleted file mode 100644
index 67ea5fb2..00000000
--- a/docs-old/custom.md
+++ /dev/null
@@ -1,433 +0,0 @@
----
-title: 定制功能
----
-
-如果默认的组件不能满足需求,可以通过定制组件来进行扩展,在 amis 中有两种方法:
-
-1. 临时扩展,适合无需复用的组件。
-2. 注册自定义类型,适合需要在很多地方复用的组件。
-
-> 注意,扩展只支持使用 React 组件方式引入的 amis,使用 JSSDK 无法支持
-
-## 临时扩展
-
-amis 的 JSON 配置最终会转成 React 组件来执行,所以如果只是想在某个配置中加入定制功能,可以直接在这个 JSON 配置里写 React 代码,比如下面这个例子:
-
-```jsx
-{
- "type": "page",
- "title": "自定义组件示例",
- "body": {
- "type": "form",
- "controls": [
- {
- "type": "text",
- "label": "用户名",
- "name": "usename"
- },
- {
- "name": "mycustom",
- "children": ({
- value,
- onChange
- }) => (
-
- )
- }
- ]
- }
-}
-```
-
-其中的 `mycustom` 就是一个临时扩展,它的 `children` 属性是一个函数,它的返回内容和 React 的 Render 方法一样,即 jsx,在这个方法里你可以写任意 JavaScript 来实现自己的定制需求,这个函数有两个参数 `value` 和 `onChange`,`value` 就是组件的值,`onChange` 方法用来改变这个值,比如上面的例子中,点击链接后就会修改 `mycustom` 为一个随机数,在提交表单的时候就变成了这个随机数。
-
-与之类似的还有个 `component` 属性,这个属性可以传入 React Component,如果想用 React Hooks,请通过 `component` 传递,而不是 `children`。
-
-这种扩展方式既简单又灵活,但它是写在配置中的,如果需要在很多地方,可以使用下面的「注册自定义类型」方式:
-
-## 注册自定义类型
-
-注册自定义类型需要了解 amis 的工作原理。
-
-### 工作原理
-
-amis 的渲染过程是将 `json` 转成对应的 React 组件。先通过 `json` 的 type 找到对应的 `Component` 然后,然后把其他属性作为 `props` 传递过去完成渲染。
-
-拿一个表单页面来说,如果用 React 组件开发一般长这样。
-
-```jsx
-
-
-
-```
-
-把以上配置方式换成 amis JSON, 则是:
-
-```json
-{
- "type": "page",
- "title": "页面标题",
- "subTitle": "副标题",
- "body": {
- "type": "form",
- "title": "用户登录",
- "controls": [
- {
- "type": "text",
- "name": "username",
- "label": "用户名"
- }
- ]
- }
-}
-```
-
-那么,amis 是如何将 JSON 转成组件的呢?直接根据节点的 type 去跟组件一一对应?这样会重名,比如在表格里面展示的类型 `text` 跟表单里面的 `text` 是完全不一样的,一个负责展示,一个却负责输入。所以说一个节点要被什么组件渲染,还需要携带上下文(context)信息。
-
-如何携带上下文(context)信息?amis 中是用节点的路径(path)来作为上下文信息。从上面的例子来看,一共有三个节点,path 信息分别是。
-
-- `page` 页面节点
-- `page/body/form` 表单节点
-- `page/body/form/controls/0/text` 文本框节点。
-
-根据 path 的信息就能很容易注册组件跟节点对应了。
-
-Page 组件的示例代码
-
-```jsx
-@Renderer({
- test: /^page$/
- // ... 其他信息隐藏了
-})
-export class PageRenderer extends React.Component {
- // ... 其他信息隐藏了
- render() {
- const {
- title,
- body,
- render // 用来渲染孩子节点,如果当前是叶子节点则可以忽略。
- } = this.props;
- return (
-
-
{title}
-
- {render('body', body) /*渲染孩子节点*/}
-
-
- );
- }
-}
-```
-
-Form 组件的示例代码
-
-```jsx
-@Renderer({
- test: /(^|\/)form$/
- // ... 其他信息隐藏了
-})
-export class FormRenderer extends React.Component {
- // ... 其他信息隐藏了
- render() {
- const {
- title,
- controls,
- render // 用来渲染孩子节点,如果当前是叶子节点则可以忽略。
- } = this.props;
- return (
-
- );
- }
-}
-```
-
-Text 组件的示例代码
-
-```jsx
-@Renderer({
- test: /(^|\/)form(?:\/\d+)?\/control(?\/\d+)?\/text$/
- // ... 其他信息隐藏了
-})
-export class FormItemTextRenderer extends React.Component {
- // ... 其他信息隐藏了
- render() {
- const {
- label,
- name,
- onChange
- } = this.props;
- return (
-
-
- );
- }
-}
-```
-
-那么渲染过程就是根据节点 path 信息,跟组件池中的组件 `test` (检测) 信息做匹配,如果命中,则把当前节点转给对应组件渲染,节点中其他属性将作为目标组件的 props。需要注意的是,如果是容器组件,比如以上例子中的 `page` 组件,从 props 中拿到的 `body` 是一个子节点,由于节点类型是不固定,由使用者决定,所以不能直接完成渲染,所以交给属性中下发的 `render` 方法去完成渲染,`{render('body', body)}`,他的工作就是拿子节点的 path 信息去组件池里面找到对应的渲染器,然后交给对应组件去完成渲染。
-
-### 编写自定义组件
-
-了解了基本原理后,来看个简单的例子:
-
-```jsx
-import * as React from 'react';
-import {Renderer} from 'amis';
-
-@Renderer({
- test: /(^|\/)my\-renderer$/
-})
-class CustomRenderer extends React.Component {
- render() {
- const {tip} = this.props;
- return 这是自定义组件:{tip}
;
- }
-}
-```
-
-有了以上这段代码后,就可以这样使用了。
-
-```json
-{
- "type": "page",
- "title": "自定义组件示例",
- "body": {
- "type": "my-renderer",
- "tip": "简单示例"
- }
-}
-```
-
-看了前面[amis 工作原理](#工作原理)应该不难理解,这里注册一个 React 组件,当节点的 path 信息是 `my-renderer` 结尾时,交给当前组件来完成渲染。
-
-如果这个组件还能通过 `children` 属性添加子节点,则需要使用下面这种写法:
-
-```jsx
-import * as React from 'react';
-import {Renderer} from 'amis';
-
-@Renderer({
- test: /(^|\/)my\-renderer2$/
-})
-class CustomRenderer extends React.Component {
- render() {
- const {tip, body, render} = this.props;
- return (
-
-
这是自定义组件:{tip}
- {body ? (
-
- {render('body', body, {
- // 这里的信息会作为 props 传递给子组件,一般情况下都不需要这个
- })}
-
- ) : null}
-
- );
- }
-}
-```
-
-有了以上这段代码后,就可以这样使用了。
-
-```json
-{
- "type": "page",
- "title": "自定义组件示例",
- "body": {
- "type": "my-renderer2",
- "tip": "简单示例",
- "body": {
- "type": "form",
- "controls": [
- {
- "type": "text",
- "label": "用户名",
- "name": "usename"
- }
- ]
- }
- }
-}
-```
-
-跟第一个列子不同的地方是,这里多了个 `render` 方法,这个方法就是专门用来渲染子节点的。来看下参数说明:
-
-- `region` 区域名称,你有可能有多个区域可以作为容器,请不要重复。
-- `node` 子节点。
-- `props` 可选,可以通过此对象跟子节点通信等。
-
-### 表单项的扩展
-
-以上是普通渲染器的注册方式,如果是表单项,为了更简单的扩充,请使用 `FormItem` 注解,而不是 `Renderer`。 原因是如果用 `FormItem` 是不用关心:label 怎么摆,表单验证器怎么实现,如何适配表单的 3 中展现方式(水平、上下和内联模式),而只用关心:有了值后如何回显,响应用户交互设置新值。
-
-```jsx
-import * as React from 'react';
-import {FormItem} from 'amis';
-
-@FormItem({
- type: 'custom'
-})
-class MyFormItem extends React.Component {
- render() {
- const {value, onChange} = this.props;
-
- return (
-
- );
- }
-}
-```
-
-有了以上这段代码后,就可以这样使用了。
-
-```json
-{
- "type": "page",
- "title": "自定义组件示例",
- "body": {
- "type": "form",
- "controls": [
- {
- "type": "text",
- "label": "用户名",
- "name": "usename"
- },
-
- {
- "type": "custom",
- "label": "随机值",
- "name": "random"
- }
- ]
- }
-}
-```
-
-> 注意: 使用 FormItem 默认是严格模式,即只有必要的属性变化才会重新渲染,有可能满足不了你的需求,如果忽略性能问题,可以传入 `strictMode`: `false` 来关闭。
-
-表单项开发主要关心两件事。
-
-1. 呈现当前值。如以上例子,通过 `this.props.value` 判定如果勾选了则显示`已勾选`,否则显示`请勾选`。
-2. 接收用户交互,通过 `this.props.onChange` 修改表单项值。如以上例子,当用户点击按钮时,切换当前选中的值。
-
-至于其他功能如:label/description 的展示、表单验证功能、表单布局(常规、左右或者内联)等等,只要是通过 FormItem 注册进去的都无需自己实现。
-
-需要注意,获取或者修改的是什么值跟配置中 `type` 并列的 `name` 属性有关,也就是说直接关联某个变量,自定义中直接通过 props 下发了某个指定变量的值和修改的方法。如果你想获取其他数据,或者设置其他数据可以看下以下说明:
-
-- `获取其他数据` 可以通过 `this.props.data` 查看,作用域中所有的数据都在这了。
-- `设置其他数据` 可以通过 `this.props.onBulkChange`, 比如: `this.props.onBulkChange({a: 1, b: 2})` 等于同时设置了两个值。当做数据填充的时候,这个方法很有用。
-
-### 其它高级定制
-
-下面是一些不太常用的 amis 扩展方式及技巧。
-
-#### 自定义验证器
-
-如果 amis [自带的验证](./renderers/Form/FormItem.md#)能满足需求了,则不需要关心。组件可以有自己的验证逻辑。
-
-```jsx
-import * as React from 'react';
-import {FormItem} from 'amis';
-import * as cx from 'classnames';
-
-@FormItem({
- type: 'custom-checkbox'
-})
-export default class CustomCheckbox extends React.Component {
- validate() {
- // 通过 this.props.value 可以知道当前值。
-
- return isValid ? '' : '不合法,说明不合法原因。';
- }
- // ... 其他省略了
-}
-```
-
-上面的栗子只是简单说明,另外可以做`异步验证`,validate 方法可以返回一个 promise。
-
-#### OptionsControl
-
-如果你的表单组件性质和 amis 的 Select、Checkboxes、List 差不多,用户配置配置 source 可通过 API 拉取选项,你可以用 OptionsControl 取代 FormItem 这个注解。
-
-用法是一样,功能方面主要多了以下功能。
-
-- 可以配置 options,options 支持配置 visibleOn hiddenOn 等表达式
-- 可以配置 `source` 换成动态拉取 options 的功能,source 中有变量依赖会自动重新拉取。
-- 下发了这些 props,可以更方便选项。
- - `options` 不管是用户配置的静态 options 还是配置 source 拉取的,下发到组件已经是最终的选项了。
- - `selectedOptions` 数组类型,当前用户选中的选项。
- - `loading` 当前选项是否在加载
- - `onToggle` 切换一个选项的值
- - `onToggleAll` 切换所有选项的值,类似于全选。
-
-#### 组件间通信
-
-关于组件间通信,amis 中有个机制就是,把需要被引用的组件设置一个 name 值,然后其他组件就可以通过这个 name 与其通信,比如这个[栗子](./advanced.md#组件间通信)。其实内部是依赖于内部的一个 Scoped Context。你的组件希望可以被别的组件引用,你需要把自己注册进去,默认自定义的非表单类组件并没有把自己注册进去,可以参考以下代码做添加。
-
-```js
-import * as React from 'react';
-import {Renderer, ScopedContext} from 'amis';
-@Renderer({
- test: /(?:^|\/)my\-renderer$/
-})
-export class CustomRenderer extends React.Component {
- static contextType = ScopedContext;
-
- componentWillMount() {
- const scoped = this.context;
- scoped.registerComponent(this);
- }
-
- componentWillUnmount() {
- const scoped = this.context;
- scoped.unRegisterComponent(this);
- }
-
- // 其他部分省略了。
-}
-```
-
-把自己注册进去了,其他组件就能引用到了。同时,如果你想找别的组件,也同样是通过 scoped 这个 context,如: `scoped.getComponentByName("xxxName")` 这样就能拿到目标组件的实例了(前提是目标组件已经配置了 name 为 `xxxName`)。
-
-#### 其他功能方法
-
-自定义的渲染器 props 会下发一个非常有用的 env 对象。这个 env 有以下功能方法。
-
-- `env.fetcher` 可以用来做 ajax 请求如: `this.props.env.fetcher('xxxAPi', this.props.data).then((result) => console.log(result))`
-- `env.confirm` 确认框,返回一个 promise 等待用户确认如: `this.props.env.confirm('你确定要这么做?').then((confirmed) => console.log(confirmed))`
-- `env.alert` 用 Modal 实现的弹框,个人觉得更美观。
-- `env.notify` toast 某个消息 如: `this.props.env.notify("error", "出错了")`
-- `env.jumpTo` 页面跳转。
diff --git a/docs-old/getting_started.md b/docs-old/getting_started.md
deleted file mode 100644
index 7e6e37ab..00000000
--- a/docs-old/getting_started.md
+++ /dev/null
@@ -1,282 +0,0 @@
----
-title: 快速开始
----
-
-有两种方式使用 amis:
-
-1. [React 组件](#React 组件),可以整合到 React 项目中,适合熟悉 React 的开发者,可以[开发自定义组件进行扩展](../custom)。
-2. [JSSDK](#JSSDK),可以放到任意页面中使用,能使用 amis 内置的渲染组件,但无法开发自定义组件,适合不使用 React 的项目或不熟悉前端的开发者。
-
-## React 组件
-
-### 安装依赖
-
-直接通过 npm 安装即可。
-
-```
-npm i amis
-```
-
-### 整合到 React 组件中
-
-可以在 React Component 这么使用(TypeScript)。
-
-```tsx
-import * as React from 'react';
-import {
- render as renderAmis
-} from 'amis';
-
-class MyComponent extends React.Component {
- render() {
- return (
-
-
通过 amis 渲染页面
- {renderAmis({
- // schema
- // 这里是 amis 的 Json 配置。
- type: 'page',
- title: '简单页面',
- body: '内容'
- }, {
- // props
- }, {
- // env
- // 这些是 amis 需要的一些接口实现
- // 可以参考本项目里面的 Demo 部分代码。
-
- updateLocation: (location:string/*目标地址*/, replace:boolean/*是replace,还是push?*/) => {
- // 用来更新地址栏
- },
-
- jumpTo: (location:string/*目标地址*/) => {
- // 页面跳转, actionType: link、url 都会进来。
- },
-
- fetcher: ({
- url,
- method,
- data,
- config
- }:{
- url:string/*目标地址*/,
- method:'get' | 'post' | 'put' | 'delete'/*发送方式*/,
- data: object | void/*数据*/,
- config: object/*其他配置*/
- }) => {
- // 用来发送 Ajax 请求,建议使用 axios
- },
- notify: (type:'error'|'success'/**/, msg:string/*提示内容*/) => {
- // 用来提示用户
- },
- alert: (content:string/*提示信息*/) => {
- // 另外一种提示,可以直接用系统框
- },
- confirm: (content:string/*提示信息*/) => {
- // 确认框。
- }
- });}
-
- );
- }
-}
-```
-
-`(schema:Schema, props?:any, env?: any) => JSX.Element`
-
-参数说明:
-
-- `schema` 即页面配置,请前往[基本用法](./basic.md)了解.
-- `props` 一般都用不上,如果你想传递一些数据给渲染器内部使用,可以传递 data 数据进去。如:
-
- ```jsx
- () =>
- renderAmis(schema, {
- data: {
- username: 'amis'
- }
- });
- ```
-
- 这样,内部所有组件都能拿到 `username` 这个变量的值。
-
-- `env` 环境变量,可以理解为这个渲染器工具的配置项,需要调用者实现部分接口。
-
- - `session: string` 默认为 'global',决定 store 是否为全局共用的,如果想单占一个 store,请设置不同的值。
- - `fetcher: (config: fetcherConfig) => Promise` 用来实现 ajax 发送。
-
- 示例
-
- ```js
- fetcher: ({
- url,
- method,
- data,
- responseType,
- config,
- headers
- }: any) => {
- config = config || {};
- config.withCredentials = true;
- responseType && (config.responseType = responseType);
-
- if (config.cancelExecutor) {
- config.cancelToken = new (axios as any).CancelToken(config.cancelExecutor);
- }
-
- config.headers = headers || {};
-
- if (method !== 'post' && method !== 'put' && method !== 'patch') {
- if (data) {
- config.params = data;
- }
-
- return (axios as any)[method](url, config);
- } else if (data && data instanceof FormData) {
- // config.headers = config.headers || {};
- // config.headers['Content-Type'] = 'multipart/form-data';
- } else if (data
- && typeof data !== 'string'
- && !(data instanceof Blob)
- && !(data instanceof ArrayBuffer)
- ) {
- data = JSON.stringify(data);
- // config.headers = config.headers || {};
- config.headers['Content-Type'] = 'application/json';
- }
-
- return (axios as any)[method](url, data, config);
- }
- ```
-
- - `isCancel: (e:error) => boolean` 判断 ajax 异常是否为一个 cancel 请求。
-
- 示例
-
- ```js
- isCancel: (value: any) => (axios as any).isCancel(value)
- ```
-
- - `notify: (type:string, msg: string) => void` 用来实现消息提示。
- - `alert: (msg:string) => void` 用来实现警告提示。
- - `confirm: (msg:string) => boolean | Promise` 用来实现确认框。
- - `jumpTo: (to:string, action?: Action, ctx?: object) => void` 用来实现页面跳转,因为不清楚所在环境中是否使用了 spa 模式,所以用户自己实现吧。
- - `updateLocation: (location:any, replace?:boolean) => void` 地址替换,跟 jumpTo 类似。
- - `isCurrentUrl: (link:string) => boolean` 判断目标地址是否为当前页面。
- - `theme: 'default' | 'cxd'` 目前支持两种主题。
- - `copy: (contents:string, options?: {shutup: boolean}) => void` 用来实现,内容复制。
- - `getModalContainer: () => HTMLElement` 用来决定弹框容器。
- - `loadRenderer: (chema:any, path:string) => Promise` 可以通过它懒加载自定义组件,比如: https://github.com/baidu/amis/blob/master/__tests__/factory.test.tsx#L64-L91。
- - `affixOffsetTop: number` 固顶间距,当你的有其他固顶元素时,需要设置一定的偏移量,否则会重叠。
- - `affixOffsetBottom: number` 固底间距,当你的有其他固底元素时,需要设置一定的偏移量,否则会重叠。
- - `richTextToken: string` 内置 rich-text 为 frolaEditor,想要使用,请自行购买,或者自己实现 rich-text 渲染器。
-
-## JSSDK
-
-JSSDK 适合对前端或 React 不了解的开发者,它不依赖 npm 及 webpack,直接引入代码就能使用,但需要注意这种方式不支持[定制组件](../sdk),只能使用 amis 内置的组件。
-
-JSSDK 的代码从以下地址获取:
-
-- JS: https://houtai.baidu.com/v2/jssdk
-- CSS: https://houtai.baidu.com/v2/csssdk
-
-然后在页面中插入下面的代码就能渲染出来了:
-
-```js
-(function () {
- var amis = amisRequire('amis/embed');
- amis.embed(
- '#container',
- {
- type: 'page',
- title: 'AMIS Demo',
- body: 'This is a simple amis page.'
- },
- {
- // props 一般不用传。
- },
- {
- // env
- fetcher: () => {
- // 可以不传,用来实现 ajax 请求
- },
-
- jumpTo: () => {
- // 可以不传,用来实现页面跳转
- },
-
- updateLocation: () => {
- // 可以不传,用来实现地址栏更新
- },
-
- isCurrentUrl: () => {
- // 可以不传,用来判断是否目标地址当前地址。
- },
-
- copy: () => {
- // 可以不传,用来实现复制到剪切板
- },
-
- notify: () => {
- // 可以不传,用来实现通知
- },
-
- alert: () => {
- // 可以不传,用来实现提示
- },
-
- confirm: () => {
- // 可以不传,用来实现确认框。
- }
- }
- );
-})();
-```
-
-注意:以上的 SDK 地址是一个页面跳转,会跳转到一个 CDN 地址,而且每次跳转都是最新的版本,随着 amis 的升级这个地址会一直变动,如果你的页面已经完成功能回归,请直接使用某个固定地址,这样才不会因为 amis 升级而导致你的页面不可用。
-
-另外,sdk 代码也伴随 npm 一起发布了,不使用 CDN 版本,直接替换成 npm 包里面的 `amis/sdk.js` 和 `amis/sdk.css` 即可。
-
-完整示例:
-
-```html
-
-
-
-
- AMIS Demo
-
-
-
-
-
-
-
-
-
-
-
-
-```
diff --git a/docs-old/intro.md b/docs-old/intro.md
deleted file mode 100644
index 640b6676..00000000
--- a/docs-old/intro.md
+++ /dev/null
@@ -1,198 +0,0 @@
----
-title: AMIS 是什么?
-shortname: intro
----
-
-amis 是一个前端低代码框架,它使用 JSON 配置来生成页面,可以极大节省页面开发工作量,极大提升开发前端界面的效率。
-
-## 为什么要做 amis?
-
-在经历了十几年的发展后,前端开发变得越来越复杂,门槛也越来越高,要使用当下流行的 UI 组件库,你必须懂 npm、webpack、react/vue,必须熟悉 ES 6 语法,最好还了解状态管理,比如 Redux,如果没接触过函数式编程,一开始入门就很困难,而它还有巨大的[生态](https://github.com/markerikson/redux-ecosystem-links),相关的库有 2347 个,然而前端技术的发展不会停滞,等学完这些后可能会发现大家都用 Hooks 了、某个打包工具取代 WebPack 了。。。
-
-而有时候你只是为了做个普通的增删改查界面,用于系统管理,类似下面这种:
-
-```schema:height="500"
-{
- "$schema": "https://houtai.baidu.com/v2/schemas/page.json#",
- "title": "浏览器内核对 CSS 的支持情况",
- "remark": "嘿,不保证数据准确性",
- "type": "page",
- "body": {
- "type": "crud",
- "draggable": true,
- "api": "/api/sample",
- "keepItemSelectionOnPageChange": true,
- "filter": {
- "title": "筛选",
- "submitText": "",
- "controls": [
- {
- "type": "text",
- "name": "keywords",
- "placeholder": "关键字",
- "addOn": {
- "label": "搜索",
- "type": "submit"
- }
- }
- ]
- },
- "bulkActions": [
- {
- "label": "批量删除",
- "actionType": "ajax",
- "api": "delete:/api/sample/${ids|raw}",
- "confirmText": "确定要批量删除?"
- },
- {
- "label": "批量修改",
- "actionType": "dialog",
- "dialog": {
- "title": "批量编辑",
- "name": "sample-bulk-edit",
- "body": {
- "type": "form",
- "api": "/api/sample/bulkUpdate2",
- "controls": [
- {
- "type": "hidden",
- "name": "ids"
- },
- {
- "type": "text",
- "name": "engine",
- "label": "Engine"
- }
- ]
- }
- }
- }
- ],
- "quickSaveApi": "/api/sample/bulkUpdate",
- "quickSaveItemApi": "/api/sample/$id",
- "filterTogglable": true,
- "headerToolbar": [
- "filter-toggler",
- "bulkActions",
- {
- "type": "tpl",
- "tpl": "一共有 ${count} 行数据。",
- "className": "v-middle"
- },
- {
- "type": "columns-toggler",
- "align": "right"
- },
- {
- "type": "drag-toggler",
- "align": "right"
- },
- {
- "type": "pagination",
- "align": "right"
- }
- ],
- "footerToolbar": [
- "statistics",
- "switch-per-page",
- "pagination"
- ],
- "columns": [
- {
- "name": "id",
- "label": "ID",
- "width": 20,
- "sortable": true,
- "type": "text"
- },
- {
- "name": "engine",
- "label": "Rendering engine",
- "sortable": true,
- "searchable": true,
- "type": "text",
- "remark": "Trident 就是 IE,Gecko 就是 Firefox"
- },
- {
- "name": "platform",
- "label": "Platform(s)",
- "popOver": {
- "body": {
- "type": "tpl",
- "tpl": "就是为了演示有个叫 popOver 的功能"
- },
- "offset": {
- "y": 50
- }
- },
- "sortable": true,
- "type": "text"
- },
- {
- "name": "grade",
- "label": "CSS grade",
- "quickEdit": {
- "mode": "inline",
- "type": "select",
- "options": [
- "A",
- "B",
- "C",
- "D",
- "X"
- ]
- },
- "type": "text"
- },
- {
- "type": "operation",
- "label": "操作",
- "width": 100,
- "buttons": [
- {
- "type": "button",
- "icon": "fa fa-times text-danger",
- "actionType": "ajax",
- "tooltip": "删除",
- "confirmText": "您确认要删除?",
- "api": "delete:/api/sample/$id"
- }
- ]
- }
- ]
- }
-}
-```
-
-这个界面虽然用 Bootstrap 也能快速搭起来,但要想体验好就需要加很多细节功能,比如数据动态加载、编辑单行数据、批量删除和修改、查询某列、按某列排序、隐藏某列、开启整页内容拖拽排序、表格有分页(页数还会同步到地址栏,刷新页面试试)、如果往下拖动还有首行冻结来方便查看表头等,全部实现这些需要大量的代码。
-
-然而上面也看到了,在 amis 里只需要 150 行 JSON 配置(嘿,其中 40 多行只有一个括号),你不需要了解 React/Vue、Webpack,甚至不需要了解 JavaScript,即便没学过 amis 也能猜到大部分配置的作用,只需要简单配置就能完成所有页面开发,这正是建立 amis 的初衷,我们认为**对于大部分常用页面,应该使用最简单的方法来实现**,而不是越来越复杂。
-
-## 用 JSON 写页面有什么好处?
-
-为了实现用最简单方式来生成大部分页面,amis 的解决方案是基于 JSON 来配置,它的独特好处是:
-
-- **不需要懂前端**就能做出专业且复杂的后台界面,这是所有其他前端 UI 库都无法做到的。在百度内部,大部分 amis 用户之前从来没写过前端页面,也不会 JavaScript。
-- **不受前端技术更新的影响**,同时还能享受 amis 升级带来的界面改进,百度内部最老的 amis 页面是 4 年多前创建的,至今还在使用,而当年的 Angular/Vue/React 版本现在都废弃了,当年流行的 Gulp 也被 Webpack 取代了,如果这些页面不是用 amis,现在的维护成本会很高。
-- 可以**完全**使用[可视化页面编辑器](https://fex-team.github.io/amis-editor/#/edit/0)来制作页面,一般前端可视化编辑器只能用来做静态原型,而 amis 可视化编辑器做出的页面是可以直接上线的。
-
-## amis 的其它亮点
-
-- **提供完整的界面解决方案**,其它 UI 框架必须使用 JavaScript 来组装业务逻辑,而 amis 只需 JSON 配置就能完成完整功能开发,包括数据获取、表单提交及验证等功能。
-- 内置 **92** 种 UI 组件,包括其它 UI 框架都会不提供的富文本编辑器、代码编辑器等,能满足各种页面组件展现的需求,而且对于特殊的展现形式还可以通过[自定义组件](./custom.md)来扩充。
-- 容器组件支持**无限层级嵌套**,可以通过组合来满足各种布局需求。
-- 经历了长时间的实战考验,amis 在百度内部得到了广泛使用,在 4 年多的时间里创建了 3w 多页面,从内容审核到机器管理,从数据分析到模型训练,amis 满足了各种各样的页面需求。
-
-## amis 不适合做什么?
-
-使用 JSON 有优点但也有明显缺点,在以下场合并不适合 amis:
-
-- 大量定制 UI,尤其是面向普通客户(toC)的产品页面
- - JSON 配置使得 amis 更适合做有大量常见 UI 组件的页面,但对于面向普通客户的页面,往往追求个性化的视觉效果,这种情况下用 amis 就不合适,实际上绝大部分前端 UI 组件库也都不适合,只能定制开发。
-- 有极为复杂的交互,或者对交互有很特殊的要求
- - 有些复杂的前端功能,比如可视化编辑器,其中有大量定制的拖拽操作,这种需要依赖原生 DOM 实现的功能无法使用 amis。
- - 但对于某些交互固定的领域,比如图连线,amis 后续会有专门的组件来实现。
-
-## 接下来
-
-请阅读[快速开始](./getting-started.md)来学习如何使用 amis。
diff --git a/docs-old/renderers.md b/docs-old/renderers.md
deleted file mode 100644
index e558adcd..00000000
--- a/docs-old/renderers.md
+++ /dev/null
@@ -1,101 +0,0 @@
----
-title: 渲染器手册
----
-
-amis 页面是由一个个渲染模型组成的,并且支持无限层级嵌套,掌握他们规则,就能灵活配置出各种页面。
-
-开始之前,请您一定要先阅读[基本用法](./basic.md)。
-
-- [Page](./renderers/Page.md): JSON 配置最外层的 Page 渲染器
-- [Form](./renderers/Form/Form.md): 表单渲染器
- - [FormItem](./renderers/Form/FormItem.md): 所有表单项都有的通用配置
- - [Array](./renderers/Form/Array.md): 数组输入框配置
- - [Button-Group](./renderers/Form/Button-Group.md): 按钮集合
- - [Button-Toolbar](./renderers/Form/Button-Toolbar.md): 让多个按钮在一起放置
- - [Button](./renderers/Form/Button.md): 按钮, 包含 button、submit 和 reset
- - [Chained-Select](./renderers/Form/Chained-Select.md): 无限级别下拉
- - [Checkbox](./renderers/Form/Checkbox.md): 勾选框
- - [Checkboxes](./renderers/Form/Checkboxes.md): 复选框
- - [City](./renderers/Form/City.md): 城市选择
- - [Color](./renderers/Form/Color.md): 颜色选择器
- - [Combo](./renderers/Form/Combo.md): 组合模式
- - [Date-Range](./renderers/Form/Date-Range.md): 日期范围类型
- - [Date](./renderers/Form/Date.md): 日期类型
- - [Datetime](./renderers/Form/Datetime.md): 日期时间类型
- - [Editor](./renderers/Form/Editor.md): 编辑器
- - [Email](./renderers/Form/Email.md): Email 输入框
- - [FieldSet](./renderers/Form/FieldSet.md): 多个输入框可以通过 fieldSet 捆绑在一起
- - [File](./renderers/Form/File.md): 文件输入
- - [Formula](./renderers/Form/Formula.md): 公式类型
- - [Grid](./renderers/Form/Grid.md): 支持 form 内部再用 grid 布局
- - [Group](./renderers/Form/Group.md): 表单项集合
- - [HBox](./renderers/Form/HBox.md): 支持 form 内部再用 HBox 布局
- - [Hidden](./renderers/Form/Hidden.md): 隐藏字段类型
- - [Image](./renderers/Form/Image.md): 图片输入
- - [List](./renderers/Form/List.md): 简单的列表选择框
- - [Matrix](./renderers/Form/Matrix.md): 矩阵类型的输入框
- - [NestedSelect](./renderers/Form/NestedSelect.md): 树形结构选择框
- - [Number](./renderers/Form/Number.md): 数字输入框
- - [Panel](./renderers/Form/Panel.md): 还是为了布局,可以把一部分 FormItem 合并到一个 panel 里面单独展示
- - [Password](./renderers/Form/Password.md): 密码输入框
- - [Picker](./renderers/Form/Picker.md): 列表选取
- - [Radios](./renderers/Form/Radios.md): 单选框
- - [Range](./renderers/Form/Range.md): 范围输入框
- - [Rating](./renderers/Form/Rating.md): 评分
- - [Repeat](./renderers/Form/Repeat.md): 可用来设置重复频率
- - [Rich-Text](./renderers/Form/Rich-Text.md): 富文本编辑器
- - [Select](./renderers/Form/Select.md): 选项表单
- - [Service](./renderers/Form/Service.md): 动态配置,配置项由接口决定
- - [Static](./renderers/Static.md): 纯用来展现数据的
- - [SubForm](./renderers/Form/SubForm.md): formItem 还可以是子表单类型
- - [Switch](./renderers/Form/Switch.md): 可选框,和 checkbox 完全等价
- - [Table](./renderers/Form/Table.md): 可以用来展示数组类型的数据
- - [Tabs](./renderers/Form/Tabs.md): 多个输入框通过选项卡来分组
- - [TabsTransfer](./renderers/Form/TabsTransfer.md): 组合穿梭器,用来勾选选项。
- - [Tag](./renderers/Form/Tag.md): 标签输入框
- - [Text](./renderers/Form/Text.md): 普通的文本输入框
- - [Textarea](./renderers/Form/Textarea.md): 多行文本输入框
- - [Time](./renderers/Form/Time.md): 时间类型
- - [Transfer](./renderers/Form/Transfer.md): 穿梭器,用来勾选选项。
- - [Tree](./renderers/Form/Tree.md): 树形结构输入框
- - [TreeSelect](./renderers/Form/TreeSelect.md): 树形结构选择框
- - [Url](./renderers/Form/Url.md): URL 输入框
-- [Action](./renderers/Action.md): 一种特殊的渲染器,它本身是一个按钮,同时它能触发事件
-- [Alert](./renderers/Alert.md): 提示框
-- [Audio](./renderers/Audio.md): 音频播放器
-- [Button-Group](./renderers/Button-Group.md): 按钮集合
-- [Card](./renderers/Card.md): 卡片的展示形式
-- [Cards](./renderers/Cards.md): 卡片集合
-- [Carousel](./renderers/Carousel.md): 轮播图
-- [Chart](./renderers/Chart.md): Echarts 图表渲染器
-- [Collapse](./renderers/Collapse.md): 折叠器
-- [CRUD](./renderers/CRUD.md): 增删改查模型,主要用来展现列表
- - [CRUD-Table](./renderers/CRUD-Table.md): 请参考 Table
- - [CRUD-Cards](./renderers/CRUD-Cards.md): 请参考 Cards
- - [CRUD-List](./renderers/CRUD-List.md): 请参考 List
-- [Definitions](./renderers/Definitions.md): 建立当前页面公共的配置项
-- [Dialog](./renderers/Dialog.md): Dialog 由 Action 触发。他是一个类似于 Page 的容器模型
-- [Divider](./renderers/Divider.md): 分割线
-- [Drawer](./renderers/Drawer.md): Drawer 由 Action 触发
-- [Each](./renderers/Each.md): 基于现有变量循环输出渲染器
-- [Field](./renderers/Field.md): 主要用在 Table 的列配置 Column、List 的内容、Card 卡片的内容和表单的 Static-XXX 中
-- [Grid](./renderers/Grid.md): Grid 布局
-- [HBox](./renderers/HBox.md): HBox 布局
-- [Html](./renderers/Html.md): html, 当需要用到变量时,请用 Tpl 代替
-- [iFrame](./renderers/iFrame.md): 如果需要内嵌外部站点,可用 iframe 来实现
-- [JSON](./renderers/JSON.md): JSON 数据展现
-- [List](./renderers/List.md): 列表展示
-- [Nav](./renderers/Nav.md): 菜单栏
-- [Panel](./renderers/Panel.md): 可以把相关信息以盒子的形式展示到一块。
-- [Plain](./renderers/Plain.md): 单纯的文字输出
-- [QRCode](./renderers/QRCode.md): 二维码显示组件
-- [Service](./renderers/Service.md): 功能型容器,自身不负责展示内容,主要职责在于通过配置的 api 拉取数据
-- [Table](./renderers/Table.md): 表格展示
- - [Column](./renderers/Column.md): 表格中的列配置
-- [Tabs](./renderers/Tabs.md): 标签页
-- [Tasks](./renderers/Tasks.md): 任务操作集合,适用于一步步操作
-- [Tpl](./renderers/Tpl.md): 支持用 JS 模板引擎来组织输出
-- [Types](./renderers/Types.md): 类型说明文档
-- [Video](./renderers/Video.md): 视频播放器
-- [Wizard](./renderers/Wizard.md): 表单向导
-- [Wrapper](./renderers/Wrapper.md): 简单的一个容器
diff --git a/docs-old/renderers/Action.md b/docs-old/renderers/Action.md
deleted file mode 100644
index 1114f62f..00000000
--- a/docs-old/renderers/Action.md
+++ /dev/null
@@ -1,204 +0,0 @@
-## Action
-
-Action 是一种特殊的渲染器,它本身是一个按钮,同时它能触发事件。
-
-```schema:height="100" scope="body"
-{
- "label": "弹个框",
- "type": "action",
- "level": "dark",
- "actionType": "dialog",
- "dialog": {
- "title": "弹框",
- "body": "这是个简单的弹框。"
- }
-}
-```
-
-除了能弹框,它还能设定很多行为比如:提交表单、发送 ajax、页面跳转、关闭弹框、复制文本等等。
-
-### 通用配置项
-
-所有`actionType`都支持的通用配置项
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------------- | ------------------- | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| type | `string` | `action` | 指定为 Action 渲染器,也可以是 `button`、`submit`、`reset`。 |
-| actionType | `string` | - | 【必填】这是 action 最核心的配置,来指定该 action 的作用类型,支持:`ajax`、`link`、`url`、`drawer`、`dialog`、`confirm`、`cancel`、`prev`、`next`、`copy`、`close`。 |
-| label | `string` | - | 按钮文本。可用 `${xxx}` 取值。 |
-| level | `string` | `default` | 按钮样式,支持:`link`、`primary`、`secondary`、`info`、`success`、`warning`、`danger`、`light`、`dark`、`default`。 |
-| size | `string` | - | 按钮大小,支持:`xs`、`sm`、`md`、`lg`。 |
-| icon | `string` | - | 设置图标,例如`fa fa-plus`。 |
-| iconClassName | `string` | - | 给图标上添加类名。 |
-| active | `boolean` | - | 按钮是否高亮。 |
-| activeLevel | `string` | - | 按钮高亮时的样式,配置支持同`level`。 |
-| activeClassName | `string` | `is-active` | 给按钮高亮添加类名。 |
-| block | `boolean` | - | 用`display:"block"`来显示按钮。 |
-| confirmText | `string` | - | 当设置后,操作在开始前会询问用户。可用 `${xxx}` 取值。 |
-| reload | `string` | - | 指定此次操作完后,需要刷新的目标组件名字(组件的`name`值,自己配置的),多个请用 `,` 号隔开。 |
-| tooltip | `string` | - | 鼠标停留时弹出该段文字,也可以配置对象类型:字段为`title`和`content`。可用 `${xxx}` 取值。 |
-| disabledTip | `string` | - | 被禁用后鼠标停留时弹出该段文字,也可以配置对象类型:字段为`title`和`content`。可用 `${xxx}` 取值。 |
-| tooltipPlacement | `string` | `top` | 如果配置了`tooltip`或者`disabledTip`,指定提示信息位置,可配置`top`、`bottom`、`left`、`right`。 |
-| close | `boolean`或`string` | - | 当`action`配置在`dialog`或`drawer`的`actions`中时,配置为`true`指定此次操作完后关闭当前`dialog`或`drawer`。 也可以配置字符串,指定此次操作完后需要关闭的`dialog`或者`drawer`的`name`值(在弹框或抽屉上配置 name 属性),多个请用`,`号隔开 |
-| required | `Array` | - | 配置字符串数组,指定在`form`中进行操作之前,需要指定的字段名的表单项通过验证 |
-
-下面会分别介绍每种类型的 Action 配置项
-
-### ajax
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ------------------------- | ----------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
-| actionType | `string` | `ajax` | 发送请求 |
-| api | `string` 或 `ApiObject` | - | 请求地址,参考 [api](./Types.md#api) 格式说明。 |
-| redirect | `string` | - | 指定当前请求结束后跳转的路径,可用 `${xxx}` 取值。 |
-| feedback | `DialogObject` | - | 如果 ajax 类型的,当 ajax 返回正常后,还能接着弹出一个 dialog 做其他交互。返回的数据可用于这个 dialog 中。格式可参考[Dialog](./Dialog.md) |
-| feedback.visibleOn | `string` | - | 可以用来配置 feedback 弹框出现的条件。 |
-| feedback.skipRestOnCancel | `boolean` | - | 如果配置了,在 feedback 弹窗里面,如果用户点了取消,那么这个按钮的其他动作也不做了。 |
-| messages | `object` | - | `success`:ajax 操作成功后提示,可以不指定,不指定时以 api 返回为准。`failed`:ajax 操作失败提示。 |
-
-```schema:height="200"
-{
- "data": {
- "user": "no one"
- },
- "body": {
- "label": "Post",
- "type": "button",
- "actionType": "ajax",
- "confirmText": "确定?",
- "api": "/api/mock2/form/saveForm",
- "messages": {
- "success": "发送成功"
- }
- }
-}
-```
-
-### link
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------- | -------- | ------ | ------------------------------------------------------------------------------------------------------------------- |
-| actionType | `string` | `link` | 单页跳转 |
-| link | `string` | `link` | 用来指定跳转地址,跟 url 不同的是,这是单页跳转方式,不会渲染浏览器,请指定 amis 平台内的页面。可用 `${xxx}` 取值。 |
-
-```schema:height="200"
-{
- "body": {
- "label": "进入简介页面",
- "type": "button",
- "level": "info",
- "actionType": "link",
- "link": "/docs/index"
- }
-}
-```
-
-### url
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------- | --------- | ------- | ------------------------------------------------ |
-| actionType | `string` | `url` | 页面跳转 |
-| url | `string` | - | 按钮点击后,会打开指定页面。可用 `${xxx}` 取值。 |
-| blank | `boolean` | `false` | 如果为 `true` 将在新 tab 页面打开。 |
-
-```schema:height="200"
-{
- "body": {
- "label": "打开 Baidu",
- "type": "button",
- "level": "success",
- "actionType": "url",
- "url": "raw:http://www.baidu.com"
- }
-}
-```
-
-`注意:由于 amis 平台内 http 地址会被替换成 proxy 地址,所以在 amis 平台内使用请加上 raw: 作为前缀。 比如:raw:http://www.baidu.com`
-
-### dialog
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ------------- | -------------------------- | -------- | --------------------------------------------- |
-| actionType | `string` | `dialog` | 点击后显示一个弹出框 |
-| dialog | `string` 或 `DialogObject` | - | 指定弹框内容,格式可参考[Dialog](./Dialog.md) |
-| nextCondition | `boolean` | - | 可以用来设置下一条数据的条件,默认为 `true`。 |
-
-```schema:height="200"
-{
- "body": {
- "label": "Dialog Form",
- "type": "button",
- "level": "primary",
- "actionType": "dialog",
- "dialog": {
- "title": "表单设置",
- "body": {
- "type": "form",
- "api": "/api/mock2/form/saveForm?waitSeconds=1",
- "controls": [
- {
- "type": "text",
- "name": "text",
- "label": "文本"
- }
- ]
- }
- }
- }
-}
-```
-
-### drawer
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------- | -------------------------- | -------- | --------------------------------------------- |
-| actionType | `string` | `drawer` | 点击后显示一个侧边栏 |
-| drawer | `string` 或 `DrawerObject` | - | 指定弹框内容,格式可参考[Drawer](./Drawer.md) |
-
-```schema:height="200"
- {
- "body": {
- "label": "Drawer Form",
- "type": "button",
- "level": "primary",
- "actionType": "drawer",
- "drawer": {
- "title": "表单设置",
- "body": {
- "type": "form",
- "api": "/api/mock2/form/saveForm?waitSeconds=1",
- "controls": [
- {
- "type": "text",
- "name": "text",
- "label": "文本"
- }
- ]
- }
- }
- }
- }
-```
-
-### copy
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------- | -------- | ------ | ------------------------------------ |
-| actionType | `string` | `copy` | 复制一段内容到粘贴板 |
-| content | `string` | - | 指定复制的内容。可用 `${xxx}` 取值。 |
-
-### reload
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------- | -------- | -------- | --------------------------------------------------------------------------- |
-| actionType | `string` | `reload` | 刷新目标组件 |
-| target | `string` | - | 需要刷新的目标组件名字(组件的`name`值,自己配置的),多个请用 `,` 号隔开。 |
-
-### add
-
-该 actionType 为[FormItem-Table](./FormItem-Table.md)专用
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ---------- | -------- | ------ | ---------------------------------------------------------------------- |
-| actionType | `string` | `add` | 给指定`FormItem-Table`添加一条数据, |
-| target | `string` | - | 指定`FormItem-Table`的名字(`Table`的`name`值),多个请用 `,` 号隔开。 |
diff --git a/docs-old/renderers/Alert.md b/docs-old/renderers/Alert.md
deleted file mode 100644
index 5305c5e5..00000000
--- a/docs-old/renderers/Alert.md
+++ /dev/null
@@ -1,37 +0,0 @@
-## Alert
-
-用来做文字特殊提示,分为四类:提示类、成功类、警告类和危险类。
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| --------- | --------- | ------------------------------------------------ | ------------------- |
-| type | `string` | `"alert"` | 指定为 alert 渲染器 |
-| className | `string` | | 外层 Dom 的类名 |
-| level | `string` | `info` | 级别,可以是:`info`、`success`、`warning` 或者 `danger` |
-| showCloseButton | `boolean` | false | 是否显示关闭按钮 |
-
-```schema:height="120" scope="body"
-{
- "type": "alert",
- "body": "这是一段提示",
- "level": "warning"
-}
-```
-
-可结合 `visibleOn` 用来做错误信息提示。
-
-
-```schema:height="120"
-{
- "type": "page",
- "data": {
- "errMsg": "这是错误提示详情"
- },
- "body": {
- "type": "alert",
- "visibleOn": "this.errMsg",
- "body": "${errMsg}",
- "level": "danger",
- "showCloseButton": true
- }
-}
-```
\ No newline at end of file
diff --git a/docs-old/renderers/Audio.md b/docs-old/renderers/Audio.md
deleted file mode 100644
index fc03b83f..00000000
--- a/docs-old/renderers/Audio.md
+++ /dev/null
@@ -1,22 +0,0 @@
-## Audio
-
-音频播放器
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| --------- | --------- | ------------------------------------------------ | ------------------- |
-| type | `string` | `"audio"` | 指定为 audio 渲染器 |
-| className | `string` | | 外层 Dom 的类名 |
-| inline | `boolean` | true | 是否是内联模式 |
-| src | `string` | | 音频地址 |
-| loop | `boolean` | false | 是否循环播放 |
-| autoPlay | `boolean` | false | 是否自动播放 |
-| rates | `array` | `[]` | 可配置音频播放倍速如:`[1.0, 1.5, 2.0]` |
-| controls | `array` | `['rates', 'play', 'time', 'process', 'volume']` | 内部模块定制化 |
-
-```schema:height="200" scope="body"
-{
- "type": "audio",
- "autoPlay": false,
- "src": "https://amis.bj.bcebos.com/amis/2019-7/1562137295708/chicane-poppiholla-original-radio-edit%20(1).mp3"
-}
-```
diff --git a/docs-old/renderers/ButtonGroup.md b/docs-old/renderers/ButtonGroup.md
deleted file mode 100644
index f1ab0082..00000000
--- a/docs-old/renderers/ButtonGroup.md
+++ /dev/null
@@ -1,49 +0,0 @@
-## ButtonGroup
-
-按钮集合。
-
-- `type` 请设置成 `button-group`
-- `buttons` 配置按钮集合。
-
-```schema:height="200" scope="body"
-{
- "type": "button-toolbar",
- "buttons": [
- {
- "type": "button-group",
- "buttons": [
- {
- "type": "button",
- "label": "Button",
- "actionType": "dialog",
- "dialog": {
- "confirmMode": false,
- "title": "提示",
- "body": "对,你刚点击了!"
- }
- },
-
- {
- "type": "submit",
- "label": "Submit"
- },
-
- {
- "type": "reset",
- "label": "Reset"
- }
- ]
- },
-
- {
- "type": "submit",
- "icon": "fa fa-check text-success"
- },
-
- {
- "type": "reset",
- "icon": "fa fa-times text-danger"
- }
- ]
-}
-```
diff --git a/docs-old/renderers/CRUD-Cards.md b/docs-old/renderers/CRUD-Cards.md
deleted file mode 100644
index e82fb864..00000000
--- a/docs-old/renderers/CRUD-Cards.md
+++ /dev/null
@@ -1,97 +0,0 @@
-### Cards(CRUD)
-
-请参考[Cards](./Cards.md)
-
-```schema:height="800" scope="body"
-{
-"type": "crud",
-"api": "/api/mock2/crud/users",
-"syncLocation": false,
-"mode": "cards",
-"defaultParams": {
- "perPage": 6
-},
-"switchPerPage": false,
-"placeholder": "没有用户信息",
-"columnsCount": 2,
-"card": {
- "header": {
- "className": "bg-white",
- "title": "$name",
- "subTitle": "$realName",
- "description": "$email",
- "avatar": "${avatar | raw}",
- "highlight": "$isSuperAdmin",
- "avatarClassName": "pull-left thumb-md avatar b-3x m-r"
- },
- "bodyClassName": "padder",
- "body": "\n <% if (data.roles && data.roles.length) { %>\n <% data.roles.map(function(role) { %>\n <%- role.name %>\n <% }) %>\n <% } else { %>\n 没有分配角色
\n <% } %>\n ",
- "actions": [
- {
- "label": "编辑",
- "actionType": "dialog",
- "dialog": {
- "title": null,
- "body": {
- "api": "",
- "type": "form",
- "tabs": [
- {
- "title": "基本信息",
- "controls": [
- {
- "type": "hidden",
- "name": "id"
- },
- {
- "name": "name",
- "label": "帐号",
- "disabled": true,
- "type": "text"
- },
- {
- "type": "divider"
- },
- {
- "name": "email",
- "label": "邮箱",
- "type": "text",
- "disabled": true
- },
- {
- "type": "divider"
- },
- {
- "name": "isAmisOwner",
- "label": "管理员",
- "description": "设置是否为超级管理",
- "type": "switch"
- }
- ]
- },
- {
- "title": "角色信息",
- "controls": [
-
- ]
- },
- {
- "title": "设置权限",
- "controls": [
-
- ]
- }
- ]
- }
- }
- },
- {
- "label": "移除",
- "confirmText": "您确定要移除该用户?",
- "actionType": "ajax",
- "api": "delete:/api/mock2/notFound"
- }
- ]
-}
-}
-```
diff --git a/docs-old/renderers/CRUD-List.md b/docs-old/renderers/CRUD-List.md
deleted file mode 100644
index b05ed2f6..00000000
--- a/docs-old/renderers/CRUD-List.md
+++ /dev/null
@@ -1,59 +0,0 @@
-### List(CRUD)
-
-请参考[List](./List.md)
-
-```schema:height="800" scope="body"
-{
-"type": "crud",
-"api": "/api/mock2/crud/permissions",
-"mode": "list",
-"placeholder": "当前组内, 还没有配置任何权限.",
-"syncLocation": false,
-"title": null,
-"listItem": {
- "title": "$name",
- "subTitle": "$description",
- "actions": [
- {
- "icon": "fa fa-edit",
- "tooltip": "编辑",
- "actionType": "dialog",
- "dialog": {
- "title": "编辑能力(权限)",
- "body": {
- "type": "form",
- "controls": [
- {
- "type": "hidden",
- "name": "id"
- },
- {
- "name": "name",
- "label": "权限名称",
- "type": "text",
- "disabled": true
- },
- {
- "type": "divider"
- },
- {
- "name": "description",
- "label": "描述",
- "type": "textarea"
- }
- ]
- }
- }
- },
- {
- "tooltip": "删除",
- "disabledOn": "~[\"admin:permission\", \"admin:user\", \"admin:role\", \"admin:acl\", \"admin:page\", \"page:readAll\", \"admin:settings\"].indexOf(name)",
- "icon": "fa fa-times",
- "confirmText": "您确定要移除该权限?",
- "actionType": "ajax",
- "api": "delete:/api/mock2/notFound"
- }
- ]
-}
-}
-```
diff --git a/docs-old/renderers/CRUD-Table.md b/docs-old/renderers/CRUD-Table.md
deleted file mode 100644
index a55f7e0c..00000000
--- a/docs-old/renderers/CRUD-Table.md
+++ /dev/null
@@ -1,46 +0,0 @@
-### Table(CRUD)
-
-在 CRUD 中的 Table 主要增加了 Column 里面的以下配置功能,更多参数,请参考[Table](./Table.md)
-
-- `sortable` 开启后可以根据当前列排序(后端排序)。
-
-```schema:height="800" scope="body"
-{
- "type": "crud",
- "api": "/api/sample",
- "syncLocation": false,
- "title": null,
- "perPageField":"rn",
- "defaultParams":{
- "rn": 10
- },
- "columns": [
- {
- "name": "id",
- "label": "ID",
- "width": 20,
- "sortable": true
- },
- {
- "name": "engine",
- "label": "Rendering engine",
- "sortable": true,
- "toggled": false
- },
- {
- "name": "browser",
- "label": "Browser",
- "sortable": true
- },
- {
- "name": "platform",
- "label": "Platform(s)",
- "sortable": true
- },
- {
- "name": "version",
- "label": "Engine version"
- }
- ]
-}
-```
diff --git a/docs-old/renderers/CRUD.md b/docs-old/renderers/CRUD.md
deleted file mode 100644
index 699d773c..00000000
--- a/docs-old/renderers/CRUD.md
+++ /dev/null
@@ -1,251 +0,0 @@
-## CRUD
-
-增删改查模型,主要用来展现列表,并支持各类【增】【删】【改】【查】的操作。
-
-CRUD 支持三种模式:`table`、`cards`、`list`,默认为 `table`。
-
-| 属性名 | 类型 | 默认值 | 说明 |
-| ------------------------------------- | ------------------------------ | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| type | `string` | | `type` 指定为 CRUD 渲染器 |
-| mode | `string` | `"table"` | `"table" 、 "cards" 或者 "list"` |
-| title | `string` | `""` | 可设置成空,当设置成空时,没有标题栏 |
-| className | `string` | | 表格外层 Dom 的类名 |
-| [api](#api) | [Api](./Types.md#Api) | | CRUD 用来获取列表数据的 api。 |
-| loadDataOnce | `boolean` | | 是否一次性加载所有数据(前端分页) |
-| loadDataOnceFetchOnFilter | `boolean` | `true` | 在开启 loadDataOnce 时,filter 时是否去重新请求 api |
-| source | `string` | | 数据映射接口返回某字段的值,不设置会默认把接口返回的`items`或者`rows`填充进`mode`区域 |
-| filter | [Form](./Form/Form.md) | | 设置过滤器,当该表单提交后,会把数据带给当前 `mode` 刷新列表。 |
-| filterTogglable | `boolean` | `false` | 是否可显隐过滤器 |
-| filterDefaultVisible | `boolean` | `true` | 设置过滤器默认是否可见。 |
-| initFetch | `boolean` | `true` | 是否初始化的时候拉取数据, 只针对有 filter 的情况, 没有 filter 初始都会拉取数据 |
-| interval | `number` | `3000` | 刷新时间(最低 3000),单位是毫秒 |
-| silentPolling | `boolean` | `false` | 配置刷新时是否隐藏加载动画 |
-| stopAutoRefreshWhen | `string` | `""` | 通过[表达式](./Types.md#表达式)来配置停止刷新的条件 |
-| stopAutoRefreshWhenModalIsOpen | `boolean` | `false` | 当有弹框时关闭自动刷新,关闭弹框又恢复 |
-| syncLocation | `boolean` | `true` | 是否将过滤条件的参数同步到地址栏 |
-| draggable | `boolean` | `false` | 是否可通过拖拽排序 |
-| itemDraggableOn | `boolean` | | 用[表达式](./Types.md#表达式)来配置是否可拖拽排序 |
-| [saveOrderApi](#saveOrderApi) | [Api](./Types.md#Api) | | 保存排序的 api。 |
-| [quickSaveApi](#quickSaveApi) | [Api](./Types.md#Api) | | 快速编辑后用来批量保存的 API。 |
-| [quickSaveItemApi](#quickSaveItemApi) | [Api](./Types.md#Api) | | 快速编辑配置成及时保存时使用的 API。 |
-| bulkActions | Array Of [Action](./Action.md) | | 批量操作列表,配置后,表格可进行选中操作。 |
-| defaultChecked | `boolean` | `false` | 当可批量操作时,默认是否全部勾选。 |
-| messages | `Object` | | 覆盖消息提示,如果不指定,将采用 api 返回的 message |
-| messages.fetchFailed | `string` | | 获取失败时提示 |
-| messages.saveOrderFailed | `string` | | 保存顺序失败提示 |
-| messages.saveOrderSuccess | `string` | | 保存顺序成功提示 |
-| messages.quickSaveFailed | `string` | | 快速保存失败提示 |
-| messages.quickSaveSuccess | `string` | | 快速保存成功提示 |
-| primaryField | `string` | `"id"` | 设置 ID 字段名。 |
-| defaultParams | `Object` | | 设置默认 filter 默认参数,会在查询的时候一起发给后端 |
-| pageField | `string` | `"page"` | 设置分页页码字段名。 |
-| perPageField | `string` | `"perPage"` | 设置分页一页显示的多少条数据的字段名。注意:最好与 defaultParams 一起使用,请看下面例子。 |
-| perPageAvailable | `Array` | `[5, 10, 20, 50, 100]` | 设置一页显示多少条数据下拉框可选条数。 |
-| orderField | `string` | | 设置用来确定位置的字段名,设置后新的顺序将被赋值到该字段中。 |
-| hideQuickSaveBtn | `boolean` | `false` | 隐藏顶部快速保存提示 |
-| autoJumpToTopOnPagerChange | `boolean` | `false` | 当切分页的时候,是否自动跳顶部。 |
-| syncResponse2Query | `boolean` | `true` | 将返回数据同步到过滤器上。 |
-| keepItemSelectionOnPageChange | `boolean` | `true` | 保留条目选择,默认分页、搜素后,用户选择条目会被清空,开启此选项后会保留用户选择,可以实现跨页面批量操作。 |
-| labelTpl | `string` | | 单条描述模板,`keepItemSelectionOnPageChange`设置为`true`后会把所有已选择条目列出来,此选项可以用来定制条目展示文案。 |
-| headerToolbar | Array | `['bulk-actions', 'pagination']` | 顶部工具栏配置, 可用控件: `bulk-actions`、`paginatnion` 、`statistics`、`switch-per-page`、`filter-toggler` 或者放 tpl 或者 button 之类的渲染器控件。 |
-| footerToolbar | Array | `['statistics', 'pagination']` | 底部工具栏配置 , 可用控件: `bulk-actions`、`paginatnion` 、`statistics`、`switch-per-page`、`filter-toggler` 或者放 tpl 或者 button 之类的渲染器控件。 |
-
-### 接口说明
-
-开始之前请你先阅读[整体要求](../api.md)。
-
-#### api
-
-用来返回列表数据。
-
-**发送:**
-
-可能会包含以下信息。
-
-- `page` 页码,从 `1` 开始, 表示当前请求第几页的信息。 字段名对应 `pageField` 如果配成这样 `{pageField: "pn"}` 发送的时候字段名会变成类似 `/api/xxx?pn=1`。
-- `perPage` 每页多少条数据,默认假定是 10. 如果想修改请配置 `defaultParams: {perPage: 20}`。 另外字段名对应 `perPageField` 的配置。
-- `orderBy` 用来告知以什么方式排序。字段名对应 `orderField`
-- `orderDir` 不是 `asc` 就是 `desc`。分别表示正序还是倒序。
-
-另外如果 CRUD 配置了 Filter,即过滤器表单,表单里面的数据也会自动 merge 到这个请求里面。前提是:你没有干预接口参数。
-
-什么意思?来个对比 `/api/xxxx` 和 `/api/xxxx?a=${a}`。第二个配置方式就是干预了,如果你配置接口的时候有明确指定要发送什么参数,那么 amis 则不再默认把所有你可能要的参数都发过去了。这个时候如果想要接收原来的那些参数,你需要进一步配置 api,把你需要的参数写上如:`/api/xxxx?a=${a}&page=${page}&perPage=${perPage}`
-
-**响应:**
-
-常规返回格式如下:
-
-```json
-{
- "status": 0,
- "msg": "",
- "data": {
- "items": [
- {
- // 每个成员的数据。
- "id": 1,
- "xxx": "xxxx"
- }
- ],
-
- "total": 200 // 注意这里不是当前请求返回的 items 的长度,而是一共有多少条数据,用于生成分页,
- // 如果你不想要分页,把这个不返回就可以了。
- }
-}
-```
-
-如果无法知道数据总条数,只能知道是否有下一页,请返回如下格式,AMIS 会简单生成一个简单版本的分页控件。
-
-```json
-{
- "status": 0,
- "msg": "",
- "data": {
- "items": [
- {
- // 每个成员的数据。
- "id": 1,
- "xxx": "xxxx"
- }
- ],
-
- "hasNext": true // 是否有下一页。
- }
-}
-```
-
-如果不需要分页,或者配置了 loadDataOnce 则可以忽略掉 `total` 和 `hasNext` 参数。
-
-#### saveOrderApi
-
-用来保存新的顺序,配置了 draggable 后会通过这个接口保存结果。
-
-**发送:**
-
-发送方式默认为 `POST` 会包含以下信息。
-
-- `ids` 字符串如: `2,3,1,4,5,6` 用 id 来记录新的顺序。 前提是你的列表接口返回了 id 字段。另外如果你的 primaryField 不是 `id`,则需要配置如: `primaryField: "order_id"`。注意:无论你配置成什么 primayField,这个字段名始终是 ids。
-- `rows` `Array- ` 数组格式,新的顺序,数组里面包含所有原始信息。
-- `insertAfter` 或者 `insertBefore` 这是 amis 生成的 diff 信息,对象格式,key 为目标成员的 primaryField 值,即 id,value 为数组,数组中存放成员 primaryField 值。如:
-
- ```json
- {
- "insertAfter": {
- "2": ["1", "3"],
- "6": ["4", "5"]
- }
- }
- ```
-
- 表示:成员 1 和成员 3 插入到了成员 2 的后面。成员 4 和 成员 5 插入到了 成员 6 的后面。
-
-发送数据多了?amis 只能猜你可能需要什么格式化的数据,api 不是可以配置数据映射吗?你可以通过 data 指定只发送什么如:
-
-```json
-{
- "saveOrderApi": {
- "url": "/api/xxxx",
- "data": {
- "ids": "${ids}"
- }
- }
-}
-```
-
-这样就只会发送 ids 了。
-
-**响应:**
-
-响应没有什么特殊要求,只关注 status 状态。data 中返回了数据也不会影响结果集。默认调用完保存顺序接口会自动再调用一次 api 接口用来刷新数据。
-
-#### quickSaveApi
-
-用来保存快速编辑结果,当 crud 的列配置快速保存时会调用进来。
-
-**发送:**
-
-发送方式默认为 `POST` 会包含以下信息。
-
-- `ids` `String` 如: `"1,2"` 用来说明这次快速保存涉及了哪些成员。
-- `indexes` `Array` 通过序号的方式告知更新了哪些成员。
-- `rows` `Array