1.7.0 及以上版本
上一节我们介绍了如何实现联动,是比较基础和局限的,而事件动作是更简单、更灵活、更高级的用法,可以解决复杂的 UI 交互场景,支持渲染器事件监听和响应设计,无需关心组件层级关系。例如:
通过onEvent
属性实现渲染器事件与响应动作的绑定。onEvent
内配置事件和动作映射关系,actions
是事件对应的响应动作的集合。
{
"type": "button",
"label": "尝试点击、鼠标移入/移出",
"level": "primary",
"onEvent": {
"click": { // 监听点击事件
"actions": [ // 执行的动作列表
{
"actionType": "toast", // 执行toast提示动作
"args": { // 动作参数
"msgType": "info",
"msg": "派发点击事件"
}
}
]
},
"mouseenter": {{ // 监听鼠标移入事件
"actions": [
{
"actionType": "toast",
"args": {
"msgType": "info",
"msg": "派发鼠标移入事件"
}
}
]
},
"mouseleave": {{ // 监听鼠标移出事件
"actions": [
{
"actionType": "toast",
"args": {
"msgType": "info",
"msg": "派发鼠标移出事件"
}
}
]
}
}
}
可以在浏览器控制台查看运行日志,类似如下
run action ajax
[ajax] action args, data {api: {…}, messages: {…}}
[ajax] action end event {context: {…}, type: 'click', prevented: false, stoped: false, preventDefault: ƒ, …}
代表运行了 ajax 动作,第二行是传递的参数和数据,第三行是执行完动作之后的 event
值,可以用做后续动作的参数。
事件包含渲染器事件
和广播事件
。
eventName
,其他渲染器可以监听该自定义事件并配置响应动作。动作包含通用动作
、组件动作
、广播动作
、自定义动作
,可以通过配置actionType
来指定具体执行什么动作。
通过配置actionType: 'ajax'
实现 http 请求发送,该动作需实现 env.fetcher
请求器。
请求配置中可读取的数据包含事件源所在数据域和动作执行产生的数据。可以通过api.data
配置数据映射来读取所需数据。例如:
"name": "${name}", "email": "${email}"
来映射表单校验数据(只适用于事件源在表单内的情况)"name": "${event.data.validateResult.payload.name}", "email": "${event.data.validateResult.payload.email}"
来映射表单校验数据,这种是获取前面表单校验动作的校验结果数据。通过"&": "${event.data.validateResult.payload}"
展开表单校验数据,结果相同,这是一个数据映射小技巧动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
api | API | - | 接口配置 |
options | object |
- | 其他配置 |
messages | {success: string, failed: string} |
- | 请求成功/失败后的提示信息 |
其他属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
outputVar | string |
- | 请求响应结果缓存在${event.data.responseResult} 或${event.data.{outputVar}} |
请求响应结果的结构如下:
{
// 状态码
"responseStatus": 0,
// 响应数据
"responseData": {
"xxx": "xxx"
},
// 响应消息
"responseMsg": "ok"
}
通过配置actionType: 'dialog'
实现 Dialog 弹窗。
动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
dialog | string /DialogObject |
- | 指定弹框内容,格式可参考Dialog |
waitForAction | boolean |
- | 是否等待弹窗响应,开启后将等待弹窗操作 |
outputVar | string |
- | 输出数据变量名, 输出数据格式为 {confirmed: boolean; value: any[]} ,当 waitForAction 开启时才有用 |
通过配置actionType: 'closeDialog'
实现关闭当前弹窗;附加配置componentId
可以实现关闭指定弹窗。
动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
drawer | string /DrawerObject |
- | 指定弹框内容,格式可参考Drawer |
waitForAction | boolean |
- | 是否等待弹窗响应,开启后将等待弹窗操作 |
outputVar | string |
- | 输出数据变量名, 输出数据格式为 {confirmed: boolean; value: any[]} ,当 waitForAction 开启时才有用 |
通过配置actionType: 'closeDrawer'
实现关闭当前抽屉;附加配置componentId
可以实现关闭指定抽屉。
其他属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
componentId | string |
- | 指定抽屉组件 id |
通过配置actionType: 'confirmDialog'
打开确认对话框。确认对话框弹出后,如果选择取消操作,将不会执行该动作后面的动作。如下面的例子,点击确认之后将弹出toast
提示,点击取消则不会提示。
普通文本内容
动作需要实现 env.confirm: (msg: string, title?: string) => boolean | Promise<boolean>。
自定义弹窗内容
可以通过body
像配置弹窗一样配置确认弹窗的内容。
动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
dialog | {msg:string }/DialogObject |
- | 指定弹框内容。自定义弹窗内容可参考Dialog |
通过配置actionType: 'alert'
打开提示对话框,该对话框只有确认按钮。该动作需要实现 env.alert: (msg: string) => void。
动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
dialog | {title:string msg: string } |
{title: '系统提示', msg: ''} | 对话框配置 |
通过配置actionType: 'toast'
实现弹出 toast 提示,该动作需实现 env.notify(type: ToastLevel, msg: string, conf?: ToastConf) => void 方法。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
msgType | string |
"info" |
消息类型 info|success|error|warning |
msg | string |
- | 消息内容 |
position | string |
top-center(移动端为center) |
提示显示位置 top-right|top-center|top-left|bottom-center|bottom-left|bottom-right|center |
closeButton | boolean |
false |
是否展示关闭按钮 |
showIcon | boolean |
true |
是否展示图标 |
timeout | number |
5000(error类型为6000,移动端为3000) |
持续时间 |
通过配置actionType: 'url'
或actionType: 'link'
实现链接跳转,该动作需实现 env.jumpTo(to: string, action?: any) => void 方法。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
url | string |
- | 按钮点击后,会打开指定页面。可用 ${xxx} 取值 |
blank | boolean |
false |
如果为 true 将在新 tab 页面打开 |
params | object |
- | 页面参数{key:value} ,支持数据映射,> 1.10.0 及以上版本 |
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
link | string |
link |
用来指定跳转地址,跟 url 不同的是,这是单页跳转方式,不会渲染浏览器,请指定 amis 平台内的页面。可用 ${xxx} 取值 |
params | object |
- | 页面参数{key:value} ,支持数据映射,> 1.9.0 及以上版本 |
targetType | string |
page |
默认为内容区打开page ,可设置为新窗口打开blank ,当前页签打开self ,blank|self 方式会重新渲染浏览器> 6.1.0 及以上版本 |
1.8.0 及以上版本
通过配置actionType: 'goBack'
实现页面回退。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
delta | string |
0 |
位置 |
1.8.0 及以上版本
通过配置actionType: 'refresh'
实现浏览器刷新。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
copyFormat | string |
- | 复制格式 |
content | 模板 | - | 指定复制的内容。可用 ${xxx} 取值 |
6.2.0 及以后版本
打印页面中的某个组件,对应的组件需要配置 id
,如果要打印多个,可以使用 "ids": ["x", "y"]
来打印多个组件,只支持主要是容器类组件 crud
、crud2
、form
、table
、wrapper
、container
、flex
、grid
、grid2d
、tableview
breaking:在 6.2.0 版本中配置是 testid,但这个配置会导致性能问题,所以新版使用 id 作为标识。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
testid | string |
组件的 testid | |
testids | string[] |
- | 多个组件的 testid |
通过配置actionType: 'email'
和邮件属性实现发送邮件操作。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
to | string |
- | 收件人邮箱,可用 ${xxx} 取值 |
cc | string |
- | 抄送邮箱,可用 ${xxx} 取值 |
bcc | string |
- | 匿名抄送邮箱,可用 ${xxx} 取值 |
subject | string |
- | 邮件主题,可用 ${xxx} 取值 |
body | string |
- | 邮件正文,可用 ${xxx} 取值 |
6.3.0 及以上版本
修改 event.data
对象中的数据,修改后后续的动作中可以引用,及时生效,不像更新组件上下文数据是个异步操作。可以用来临时存储数据。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
time | number |
- | 等待时间,单位是毫秒 |
通过配置actionType: 'custom'
实现自定义 JS。JS 中可以访问以下对象和方法:
自定义函数签名: script:(context,doAction,event)=>{}
动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
script | string /function |
- | 自定义 JS 脚本代码,代码内可以通过调用doAction 执行任何动作 ,通过事件对象event 可以实现事件动作干预 |
2.0.3 及以上版本
有时在执行自定义 JS 的时候,希望该过程中产生的数据可以分享给后面的动作使用,此时可以通过event.setData()
来实现事件上下文的设置,这样后面动作都可以通过事件上下文来获取共享的数据。
注意:直接调用
event.setData()
将修改事件的原有上下文,如果不希望覆盖可以通过event.setData({...event.data, ...{xxx: xxx}})
来进行数据的合并。
通过配置componentId
或componentName
来触发指定组件的动作(不配置将调用当前组件自己的动作),组件动作配置通过args
传入(> 1.9.0 及以上版本)
,动作参数请查看对应的组件的动作表,更多示例请查看组件事件动作示例。
1.8.0 及以上版本
更新数据即更新指定组件数据域中的数据(data),通过配置actionType: 'setValue'
实现组件数据域变量更新
,通过它可以实现组件间联动更新
、数据回填
,更多示例请查看更新数据示例。
注意事项
${xxx}
来获取更新后的数据,如果需要请更新事件上下文数据,然后通过${event.data.xxx}
来获取。基础类型
、对象类型
、数组类型
,数据类型取决于目标组件所需数据值类型form
、dialog
、drawer
、wizard
、service
、page
、app
、chart
,以及数据输入类
组件${event.data.xxx}
来获取异步动作产生的数据,无法通过当前数据域${xxx}
直接获取更新后的数据。{"user": "amis"}
,这时就会更新表单里的 user
字段值为 amis
通过配置actionType: 'reload'
刷新指定组件的数据请求,支持数据容器类组件(form
、wizard
、service
、page
、app
、chart
、crud
)以及支持动态数据的输入类
组件,详见组件的动作表
。更多示例请查看刷新示例。
针对支持远程数据的输入类组件,支持刷新目标组件的数据请求。
刷新 CRUD 时,如果配置了data
,将发送data
给目标 CRUD 组件,并将该数据合并到目标 CRUD 组件的数据域中,然后触发目标组件的刷新操作,即 CRUD 数据拉取接口将自动追加data
参数到请求中,更多示例可以查看CRUD reload。
6.9.0 及以上版本
通过配置 outputVar 可以拿到刷新后的结果,例如以下示例,点击按钮后,会串行按顺序刷新 service 1 和 service2, 同时 service2 可以拿到 service1 的返回值。
动作属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
resetPage | boolean |
true | 当目标组件为 crud 时,可以控制是否重置页码,> 2.3.2 及以上版本 |
其他属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
componentId | string |
- | 指定刷新的目标组件 id |
1.8.0 及以上版本
通过配置actionType: 'show'
或'hidden'
或'enabled'
或'disabled'
或'static'
或'nonstatic'
实现对指定组件的显示、隐藏、启用、禁用,仅支持实现了对应状态控制功能的数据输入类
组件。
动作属性(args)
< 2.3.2 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
eventName | string |
- | 广播动作对应的自定义事件名称,用于广播事件的监听 |
其他属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
weight | number |
0 | 可以通过配置动作执行优先级来控制所有监听者的动作执行顺序 |
除了以上内置动作,你还可以注册自己的动作。通过对RendererAction
的run
方法的实现可以定制自己的动作逻辑,最后通过registerAction
注册到 amis 事件动作中。
import {
ListenerAction,
ListenerContext,
registerAction,
RendererAction
} from 'amis-core';
import {RendererEvent} from 'amis-core';
// 动作定义
interface IMyAction extends ListenerAction {
actionType: 'my-action';
args: {
param1: string, // 动作参数1
param2: string // 动作参数2
};
}
/**
* 我的动作实现
*/
export class MyAction implements RendererAction {
run(action: IMyAction, renderer: ListenerContext, event: RendererEvent<any>) {
const props = renderer.props;
const {param1, param2} = action.args;
// 你的动作逻辑
// ...
}
}
// 注册自定义动作
registerAction('my-action', new MyAction());
通过配置不同的逻辑动作实现动作编排,支持嵌套。
通过配置expression: 表达式或ConditionBuilder组合条件
来实现条件逻辑。
动作属性(args)
< 1.8.0 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
loopName | string |
- | 循环变量名称 |
其他属性
< 2.3.2 及以下版本
,以下属性与 args 同级。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
children | Array<动作> | - | 子动作,可以通过break动作 来跳出循环 |
通过配置actionType: 'loop'
和actionType: 'break'
实现循环跳出。
其他属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
children | Array<动作> | - | 子动作,每个子动作可以通过配置expression 来匹配的条件 |
通过配置actionType: 'parallel'
实现并行执逻辑。
其他属性
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
children | Array<动作> | - | 子动作 |
从事件触发开始,整个数据流包含事件本身产生的事件数据和动作产生的动作数据,事件源头产生的数据在 AMIS 事件动作机制底层已经自动加入渲染器数据域,可以通过xxx
直接获取(< 2.3.2 及以下版本 为 event.data.xxx
),而部分动作产生的数据如何流动需要交互设计者进行介入,对于数据流动可以通过数据映射,将上一个动作产生的数据作为动作参数写入下一个动作。
通过 data
指定输入的参数数据(< 2.3.2 及以下版本
通过args
传递数据),它是一个键值对。
http 请求动作执行结束后,后面的动作可以通过 ${responseResult}
或${{outputVar}}
来获取请求响应结果,响应结果的结构定义参考发送 http 请求。
< 2.3.2 及以下版本 需要通过 ${event.data.{xxx}}
来获取以上信息,例如:${event.data.responseResult}
该函数参数说明如下:
参数名 | 说明 |
---|---|
id | 组件 ID,即组件的 id 属性的值 |
path | 数据路径,即数据变量的路径 |
事件动作干预是指执行完当前动作后,干预所监听事件默认处理逻辑和后续其他动作的执行。通过preventDefault
、stopPropagation
分别阻止监听事件默认行为和停止下一个动作执行。
有些组件内置了一些逻辑来帮助用户降低配置成本,但可能这些逻辑并不符合设计者的业务需求,这时可以通过onEvent
来监听对应的事件,并通过preventDefault
来阻止那些默认处理逻辑来达到想要的最终效果。更多示例请查看阻止组件默认行为示例。
6.3.0 版本开始支持
或者直接通过动作来阻止
{
"actionType": "preventDefault",
"expression": "${command === 'Do not close'}"
}
通过onEvent
可以对监听的事件配置一组动作,这些动作是顺序执行的,有时间设计者希望执行某个/些动作后就停止继续执行后面的动作,这时候可以通过stopPropagation
来停止执行后面配置的所有动作。
6.3.0 版本开始支持
或者直接通过动作来跳过后续逻辑
{
"actionType": "stopPropagation",
"expression": "${command === 'Do not close'}"
}
3.3.1
及以上版本
默认情况下,尝试执行一个不存在的目标组件动作、JS 脚本执行错误等程序错误都会导致动作执行终止,可以通过ignoreError: true
来忽略动作报错继续执行后面的动作。
需求场景主要是想要自定义组件的内部事件暴露出去,能够通过对事件的监听来执行所需动作,并希望自定义组件自身的动作能够被其他组件调用。接入方法是通过props.dispatchEvent
派发自身的各种事件,使其具备更灵活的交互设计能力;通过实现doAction
方法实现其他组件对其专属动作的调用,需要注意的是,此处依赖内部的 Scoped Context
来实现自身的注册,可以参考 组件间通信。
属性名 | 类型 | 默认值 | 说明 |
---|---|---|---|
actionType | string |
- | 动作名称 |
args | object |
- | 动作属性{key:value} ,支持数据映射 |
data | object |
- | 追加数据{key:value} ,支持数据映射,如果是触发其他组件的动作,则该数据会传递给目标组件,> 2.3.2 及以上版本 |
dataMergeMode | string |
'merge' | 当配置了 data 的时候,可以控制数据追加方式,支持合并(merge )和覆盖(override )两种模式,> 2.3.2 及以上版本 |
preventDefault | boolean |表达式|ConditionBuilder |
false | 阻止事件默认行为,> 1.10.0 及以上版本支持表达式,> 2.9.0 及以上版本支持ConditionBuilder |
stopPropagation | boolean |表达式|ConditionBuilder |
false | 停止后续动作执行,> 1.10.0 及以上版本支持表达式,> 2.9.0 及以上版本支持ConditionBuilder |
expression | boolean |表达式|ConditionBuilder |
- | 执行条件,不设置表示默认执行,> 1.10.0 及以上版本支持表达式,> 2.9.0 及以上版本支持ConditionBuilder |
outputVar | string |
- | 输出数据变量名 |
ignoreError | boolean |
false | 当动作执行出错后,是否忽略错误继续执行。3.3.1 及以上版本支持 |