amis/docs/zh-CN/components/iframe.md
hsm-lv 251c2f68fc
feat:iframe接入事件动作 (#5754)
* feat:iframe接入事件动作

* feat:[#5462]alert action支持title设置
2022-11-14 14:50:01 +08:00

203 lines
5.5 KiB
Markdown
Executable File
Raw 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: iFrame
description:
type: 0
group: ⚙ 组件
menuName: iFrame
icon:
order: 51
---
## 基本使用
内嵌外部站点,可用 iframe 来实现。
```schema: scope="body"
{
"type": "iframe",
"src": "https://github.com/baidu/amis",
"height": 300
}
```
## src 使用动态数据
### 数据域变量
> 1.1.6
```schema:
{
"type": "page",
"data": {
"iframeSrc": "https://github.com/baidu/amis"
},
"body": {
"type": "iframe",
"src": "${iframeSrc}",
"height": 300
}
}
```
## 其它原生 iframe 属性
> 2.1.0 及以上版本
还支持以下原生 iframe 属性,具体配置项请[参考](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe)。
- name
- allow
- sandbox
- referrerpolicy
## 支持 base64 格式
> 2.4.0 及以上版本
`src`属性支持传入符合 base64 编码标准的 [MIME 类型](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types)字符串,具体效果参考[示例](../../../examples/iframe)
## 如何和 iframe 通信
#### amis 向 iframe 通信
在 iframe 页面中添加`message`事件监听器,在 iframe 初始化、更新或者接收到其他组件发送数据的时候,会通过 `postMessage` 发送当前数据域数据iframe 页面的事件监听器中可以通过`e.data`进行获取:
```js
window.addEventListener('message', e => {
// e.data 获取当前数据域数据,进行使用
});
```
`e.data` 格式及参数说明:
```json
{
"type": "amis:init", // 当前事件类型
"data": {
//... 当前数据域数据
}
}
```
- **type**: 当前事件类型
- amis:init初始化的时候触发
- amis:update组件更新时触发
- amis:receive组件通过 target 接收到其他组件发送来数据的时候
- **data**:当前数据源数据
> 如果是 webpack 开发环境,注意过滤掉`webpackOk`类型消息
#### iframe 页面向 amis 通信
可以通过以下两种方式实现 iframe 页面向 amis 通信:
- 方式一:通过 events 属性,基于[Action](./action)实现,有一定的局限性。
- 方式二:通过 onEvent 属性,基于[事件动作](../../docs/concepts/event-action)实现,更灵活。
> 注意:如果同时配置了 events 和 onEventamis 都会执行,且 onEvent 配置的动作行为会先于 events 执行。
步骤如下:
1. 在 iframe 页面中定义消息名称和需要传递的数据。获取父级 window并使用`postMessage`传递数据,格式如下,:
```js
window.parent.postMessage(
{
type: 'amis:detail',
data: {
iframeId: '111'
}
},
'*'
);
```
`message`格式:
- `type`: 标识要触发的 amis 行为,请使用 `amis:xxx` 的格式,这里我们设置为配置好的`detail`事件
- `data`: 传给 amis 的数据amis 会将该数据与当前数据域进行合并进行使用
2. 在 amis 的 iframe 组件中指明需要监听的消息名称,以及需要执行的动作。
```json
// 方式一:即在 amis 的 iframe 配置项中配置 events 对象
{
"type": "iframe",
"src": "http://www.xxx.com",
"events": {
"detail": {
"actionType": "dialog", // 弹窗动作
"dialog": {
"title": "弹框",
"body": "iframe 传给 amis 的 id 是:${iframeId}" // 在弹框中渲染`"iframe 传给 amis 的 id 是:${iframeId}"`这段模板即111
}
}
}
}
// 方式二:即在 amis 的 iframe 配置项中配置 onEvent 对象
{
"type": "iframe",
"src": "http://www.xxx.com",
"onEvent": {
"detail": {
"actions": [
// 动作 1弹窗动作
{
"actionType": "dialog",
"dialog": {
"title": "弹框",
"body": "iframe 传给 amis 的 id 是:${iframeId}" // 在弹框中渲染`"iframe 传给 amis 的 id 是:${iframeId}"`这段模板即111
}
},
// 动作 2触发指定组件的特性动作
{
"actionType": "crud",
"componentId": "form01",
"data": {
"iframeId": "${iframeId}" // 刷新请求参数为`"iframe 传给 amis 的 id 是:${iframeId}"`这段模板即111
}
}
]
}
}
}
```
## 设置高度自适应
默认 amis 中只支持给 iframe 配置固定高度,我们可以通过上面说到的通信机制实现高度自适应。
1. 首先在 iframe 页面中获取到页面高度
2. 通过`amis:resize`事件,将高度信息发送给 amis
```js
window.parent.postMessage(
{
type: 'amis:resize',
data: {
height: 400
}
},
'*'
);
```
这样就可以动态设置 iframe 组件高度
## 属性表
| 属性名 | 类型 | 默认值 | 说明 |
| -------------- | ------------------ | ---------- | -------------------- |
| type | `string` | `"iframe"` | 指定为 iFrame 渲染器 |
| className | `string` | | iFrame 的类名 |
| frameBorder | `Array` | | frameBorder |
| style | `object` | | 样式对象 |
| src | `string` | | iframe 地址 |
| allow | `string` | | allow 配置 |
| sandbox | `string` | | sandbox 配置 |
| referrerpolicy | `string` | | referrerpolicy 配置 |
| height | `number`或`string` | `"100%"` | iframe 高度 |
| width | `number`或`string` | `"100%"` | iframe 宽度 |