* feat: Editor 支持插件弹出面板 (#11055) * feat: Editor 支持插件弹出面板 (#11059) * chore: 暴露 RendererThumb * feat: resultBox item项支持点击事件 (#11060) * feat: resultBox item项支持点击事件 * feat: resultBox item项支持点击事件 * feat: resultBox item项点击事件增加testid * feat: resultBox item项点击事件更新jest快照 --------- Co-authored-by: hezhihang <hezhihang@baidu.com> * chore: 调整 Page 渲染器导出方便外部覆盖 * chore: ConfirmBox 支持配置 onEntered 和 onExit 事件 * chore: checkboxes radios 选项 children 必须是数组且有长度才切到分组展示 * feat: 折叠面板,无标题时显示折叠箭头。组件存在于表单中,面板新增切换展示方式按钮 (#11067) * feat: 折叠面板,无标题时显示折叠箭头。组件存在于表单中,面板新增切换展示方式按钮 * feat: 调整面板组件默认值 * feat: 调整无标题时,折叠箭头样式。调整面板配置 * 更新jest快照 * feat: page侧栏支持左右位置 (#11090) Co-authored-by: hezhihang <hezhihang@baidu.com> * chore: checkboxes radios 选项 children 必须是数组且有长度才切到分组展示 * feat: AvailableRenderersPanel 支持外围扩展 * feat: AvailableRenderersPanel 支持外围扩展 * feat: editor 插件 scaffoldForm 支持异步获取 * chore: add cross-env * chore: 避免 Table 数据更新死循环 * chore: 调整 ts 定义 * feat: 给配置面板加些标记方便外围扩充 * chore: checkboxes radios 选项 children 必须是数组且有长度才切到分组展示 * chore: Options 相关逻辑支持外部扩展 * feat: mapping支持接口变量是records,提供外围扩充函数 (#11105) * feat: mapping支持接口变量是records 的情况 * feat: 提供外围扩充函数 * feat: 修改函数名 * feat: 补充props 类型定义 * chore: 调整用例 * feat: 自定义样式扩展 (#11140) Co-authored-by: hezhihang <hezhihang@baidu.com> * feat: tabs支持删除动作,外观样式支持主题 * typo error * chore: 支持更多的场景 * feat: 穿梭选择器增加点击选项事件 * feat: 锚点导航调整为sticky布局 (#11143) * feat: 锚点导航调整为sticky布局 * bugfix * 更新快照 * 更新单测 * 更新单测 * bugfix * 优化样式 --------- Co-authored-by: qinhaoyan <30946345+qinhaoyan@users.noreply.github.com> * 动作面板支持外部注册 (#11149) * 动作面板支持外部注册 * 修复someTree报错 * chore: debug 面板调整 (#11152) * feat:事件动作面板支持查看调用链 * feat: 新增autoCheckChildren和onlyChildren属性配置面板,更改穿梭框事件点击位置 * feat: 预留外围扩充函数 * fix: 调整文案和属性名 * 修复初始化弹窗问题 * fix:自定义样式根节点不生效、样式修改时schema更新不正确,tabs动作仅支持hash删除 (#11145) Co-authored-by: hezhihang <hezhihang@baidu.com> * feat: 日期\日期范围组件可配禁止输入 (#11197) * feat:验证器手机和电话号支持国家代号,数字框新增显示上下按钮,修改自定义样式实现。 (#11198) * fix: 穿梭器面板中onlyChildren属性默认开启 * feat: 验证器中手机号和电话号支持国家代号 * feat: 数字框编辑器新增显示上下按钮开关,修改自定义样式实现 * 修复插件重复注册&输入序号支持表达式 * 移除无用代码 * feat: tree支持节点行为配置、点击事件、虚拟列表高度、工具栏、操作栏等功能 * feat: 虚拟列表支持高度自适应 * feat: 虚拟列表支持高度自适应 * feat: 虚拟列表支持高度自适应 * feat: 虚拟列表支持高度自适应 * feat: 表格列新增textOverflow属性 * feat: 新增文本未超出,不呼出功能 * feat: 修改dom计算的位置 * feat: 增加限制条件 * feat: 删除sonTarget属性 * feat: 合并renderTextOver * feat: 留出外围扩充位置 * feat: 步骤条新增iconPositon属性,修复简单模式下箭头布局错乱 (#11250) * feat: 替换按钮配置面板自定义样式 * feat: 步骤条新增iconPositon属性,修复简单模式下箭头布局错乱 --------- Co-authored-by: hzh11012 <43038692+hzh11012@users.noreply.github.com> Co-authored-by: hezhihang <hezhihang@baidu.com> Co-authored-by: F-jianchao <161407305+F-jianchao@users.noreply.github.com> Co-authored-by: hsm-lv <80095014+hsm-lv@users.noreply.github.com> Co-authored-by: fujianchao <fujianchao@baidu.com> Co-authored-by: qkiroc <30946345+qkiroc@users.noreply.github.com> Co-authored-by: qinhaoyan <30946345+qinhaoyan@users.noreply.github.com> Co-authored-by: z418577198 <418577198@qq.com> Co-authored-by: lvxiaojiao <lvxiaojiao@baidu.com> Co-authored-by: zhangzhijun03 <zhangzhijun03@baidu.com> Co-authored-by: Allen <yupeng.fe@qq.com>
17 KiB
Executable File
title | description | type | group | menuName | icon | order |
---|---|---|---|---|---|---|
Page 页面 | 0 | ⚙ 组件 | Page 页面 | 23 |
Page 组件是 amis 页面 JSON 配置中顶级容器组件,是整个页面配置的入口组件。
基本用法
我们这里在内容区中简单渲染一段文字。
{
"type": "page",
"title": "标题",
"body": "Hello World!"
}
渲染组件
内容区同样可以渲染各种组件,这里我们渲染一个表单。
{
"type": "form",
"api": "/api/mock2/form/saveForm",
"body": [
{
"type": "input-text",
"name": "name",
"label": "姓名:"
}
]
}
在其他区域渲染组件
Page 默认将页面分为几个区域,分别是内容区(body
)、侧边栏(aside
) 和 工具栏(toolbar
)部分,你可以在这些区域配置你想要的组件和内容。
{
"type": "page",
"aside": [
{
"type": "tpl",
"tpl": "这是侧边栏部分"
}
],
"toolbar": [
{
"type": "tpl",
"tpl": "这是工具栏部分"
}
],
"body": [
{
"type": "tpl",
"tpl": "这是内容区"
}
]
}
不同区域都是
Page
的子节点,也就是说都可以使用Page
下数据作用域。
页面初始化请求
通过配置initApi
,可以在初始化页面时请求所配置的接口。
{
"type": "page",
"initApi": "/api/mock2/page/initData",
"body": [
{
"type": "tpl",
"tpl": "当前时间是:${date}"
}
]
}
具体 API 规范查看 API 文档。
轮询初始化接口
想要在页面渲染后,轮询请求初始化接口,步骤如下:
- 配置 initApi;
- 配置 interval:单位为毫秒,最小 1000。
{
"type": "page",
"initApi": "/api/mock2/page/initData",
"interval": 3000,
"body": [
{
"type": "tpl",
"tpl": "当前时间是:${date}"
}
]
}
如果希望在满足某个条件的情况下停止轮询,配置stopAutoRefreshWhen
表达式。
{
"type": "page",
"initApi": "/api/mock2/page/initData",
"stopAutoRefreshWhen": "this.time % 5", // 当时间戳能被5整除时,停止轮询
"interval": 3000,
"body": [
{
"type": "tpl",
"tpl": "当前时间戳是:${date}"
}
]
}
下拉刷新
通过配置pullRefresh
,可以设置下拉刷新功能(仅用于移动端)。
{
"type": "page",
"initApi": "/api/mock2/page/initData",
"pullRefresh": {
"disabled": false
},
"body": [
{
"type": "tpl",
"tpl": "当前时间是:${date}"
}
]
}
配置下拉刷新文案
{
"type": "page",
"initApi": "/api/mock2/page/initData",
"pullRefresh": {
"disabled": false,
"pullingText": "继续下拉",
"loosingText": "可以释放了"
},
"body": [
{
"type": "tpl",
"tpl": "当前时间是:${date}"
}
]
}
CSS 变量
通过设置 CSS 变量几乎可以修改 amis 中任意组件的展现,具体细节请参考样式。
{
"type": "page",
"cssVars": {
"--text-color": "#108cee"
},
"body": {
"type": "form",
"body": [
{
"type": "input-text",
"label": "文本框",
"name": "text"
}
]
}
}
自定义 CSS
1.3.0 及以上版本
虽然 amis 提供了很多内置样式,但想要更精细控制样式,最好的方式依然是编写自定义 CSS,在之前的版本中需要外部页面配合,从 1.3.0 开始 amis 可以直接在配置中支持自定义 CSS
{
"type": "page",
"css": {
".myClass": {
"color": "blue"
}
},
"body": {
"type": "tpl",
"tpl": "文本",
"className": "myClass"
}
}
上面的配置会自动创建一个 <style>
标签,其中内容就是:
.myClass {
color: blue;
}
配置写法和编写普通 css 的体验是一致的,可以使用任意 css 选择符及属性。
aside 可调整宽度
通过配置 asideResizor
,可以让侧边栏支持动态调整宽度,同时可以通过 asideMinWidth
、asideMaxWidth
设置 aside 最大最小宽度。
{
"type": "page",
"asideResizor": true,
"asideMinWidth": 150,
"asideMaxWidth": 400,
"aside": [
{
"type": "tpl",
"tpl": "这是侧边栏部分"
}
],
"body": [
{
"type": "tpl",
"tpl": "这是内容区"
}
]
}
aside 位置固定
通过配置 asideSticky
来开关,默认是开启状态。
aside 展示位置
通过配置 asidePosition
,可以控制侧边栏的展示位置。
{
"type": "page",
"asideResizor": true,
"asidePosition": "right",
"aside": [
{
"type": "tpl",
"tpl": "这是侧边栏部分"
}
],
"body": [
{
"type": "tpl",
"tpl": "这是内容区"
}
]
}
属性表
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
type | string |
"page" |
指定为 Page 组件 |
title | SchemaNode | 页面标题 | |
subTitle | SchemaNode | 页面副标题 | |
remark | Remark | 标题附近会出现一个提示图标,鼠标放上去会提示该内容。 | |
aside | SchemaNode | 往页面的边栏区域加内容 | |
asideResizor | boolean |
页面的边栏区域宽度是否可调整 | |
asideMinWidth | number |
页面边栏区域的最小宽度 | |
asideMaxWidth | number |
页面边栏区域的最大宽度 | |
asideSticky | boolean |
true | 用来控制边栏固定与否 |
asidePosition | "left" | "right" |
"left" |
页面边栏区域的位置 |
toolbar | SchemaNode | 往页面的右上角加内容,需要注意的是,当有 title 时,该区域在右上角,没有时该区域在顶部 | |
body | SchemaNode | 往页面的内容区域加内容 | |
className | string |
外层 dom 类名 | |
cssVars | object |
自定义 CSS 变量,请参考样式 | |
toolbarClassName | string |
v-middle wrapper text-right bg-light b-b |
Toolbar dom 类名 |
bodyClassName | string |
wrapper |
Body dom 类名 |
asideClassName | string |
w page-aside-region bg-auto |
Aside dom 类名 |
headerClassName | string |
bg-light b-b wrapper |
Header 区域 dom 类名 |
initApi | API | Page 用来获取初始数据的 api。返回的数据可以整个 page 级别使用。 | |
initFetch | boolean |
true |
是否起始拉取 initApi |
initFetchOn | 表达式 | 是否起始拉取 initApi, 通过表达式配置 | |
interval | number |
3000 |
刷新时间(最小 1000) |
silentPolling | boolean |
false |
配置刷新时是否显示加载动画 |
stopAutoRefreshWhen | 表达式 | "" |
通过表达式来配置停止刷新的条件 |
pullRefresh | object |
{disabled: true} |
下拉刷新配置(仅用于移动端) |
事件表
当前组件会对外派发以下事件,可以通过onEvent
来监听这些事件,并通过actions
来配置执行的动作,在actions
中可以通过${事件参数名}
或${event.data.[事件参数名]}
来获取事件产生的数据,详细请查看事件动作。
[name]
为当前数据域中的字段名,例如:当前数据域为 {username: 'amis'},则可以通过${username}获取对应的值。
事件名称 | 事件参数 | 说明 |
---|---|---|
init | - | 组件实例被创建并插入 DOM 中时触发。2.4.1 及以上版本 |
inited | responseData: any 请求的响应数据responseStatus: number 响应状态,0 表示成功responseMsg: string 响应消息, error 表示接口是否成功[name]: any 当前数据域中指定字段的值 |
initApi 接口请求完成时触发 |
pullRefresh | - | 开启下拉刷新后,下拉释放后触发(仅用于移动端) |
init 和 inited
{
"type": "page",
"initApi": "/api/mock2/page/initData",
"body": [
{
"type": "tpl",
"tpl": "当前时间是:${date}"
}
],
"onEvent": {
"init": {
"actions": [
{
"actionType": "toast",
"args": {
"msgType": "info",
"msg": "init"
}
}
]
},
"inited": {
"actions": [
{
"actionType": "toast",
"args": {
"msgType": "info",
"msg": "${event.data.responseData|json}"
}
}
]
}
}
}
动作表
当前组件对外暴露以下特性动作,其他组件可以通过指定actionType: 动作名称
、componentId: 该组件id
来触发这些动作,动作配置可以通过args: {动作配置项名称: xxx}
来配置具体的参数,详细请查看事件动作。
动作名称 | 动作配置 | 说明 |
---|---|---|
reload | - | 重新加载,调用 intiApi ,刷新数据域数据 |
setValue | value: object 更新的数据 |
更新数据 |
reload
只做刷新
重新发送initApi
请求,刷新 Page 时,只配置componentId
目标组件 ID 即可。
{
"type": "page",
"id": "page_reload_1",
"initApi": "/api/mock2/page/initData",
"body": [
{
"type": "button",
"label": "刷新Page数据加载请求",
"className": "mb-2",
"onEvent": {
"click": {
"actions": [
{
"componentId": "page_reload_1",
"actionType": "reload"
}
]
}
}
},
{
"type": "tpl",
"tpl": "当前时间是:${date}"
}
]
}
发送数据并刷新
刷新 Page 组件时,如果配置了data
,将先发送data
给目标组件,并将该数据合并到目标组件的数据域中(如果配置"dataMergeMode": "override"
将覆盖目标组件的数据),然后重新请求数据。
{
"type": "page",
"id": "page_reload_2",
"initApi": "/api/mock2/page/initData",
"body": [
{
"type": "button",
"label": "刷新Page数据加载请求,并将我的年龄设置为18",
"className": "mb-2",
"onEvent": {
"click": {
"actions": [
{
"componentId": "page_reload_2",
"actionType": "reload",
"data": {
"age": 18
}
}
]
}
}
},
{
"type": "tpl",
"tpl": "当前时间是:${date}, 我的年龄:${age|default:'-'}"
}
]
}
setValue
通过setValue
更新指定页面组件的数据。
合并数据
默认setValue
会将新数据与目标组件数据进行合并。
{
"type": "page",
"id": "page02",
"initApi": "/api/mock2/page/initData",
"body": [
{
"type": "button",
"label": "更新数据",
"className": "mb-2",
"onEvent": {
"click": {
"actions": [
{
"componentId": "page02",
"actionType": "setValue",
"args": {
"value": {"date": "2023-05-01"}
}
}
]
}
}
},
{
"type": "tpl",
"tpl": "标题:${title} 当前时间是:${date}"
}
]
}
覆盖数据
可以通过"dataMergeMode": "override"
来覆盖目标组件数据。
{
"type": "page",
"id": "page02",
"initApi": "/api/mock2/page/initData",
"body": [
{
"type": "button",
"label": "更新数据",
"className": "mb-2",
"onEvent": {
"click": {
"actions": [
{
"componentId": "page02",
"actionType": "setValue",
"args": {
"value": {"date": "2023-05-01"}
},
"dataMergeMode": "override"
}
]
}
}
},
{
"type": "tpl",
"tpl": "标题:${title|default:'-'} 当前时间是:${date}"
}
]
}