• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# PluginComponent
2
3提供外部应用组件嵌入式显示功能,即外部应用提供的UI可在本应用内显示。如需通过跨进程通信实现更新,请参考[@ohos.pluginComponent](../apis/js-apis-plugincomponent.md)。
4
5
6>  **说明:**
7>
8> - 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
9
10## 子组件
11
1213
14
15## 接口
16
17PluginComponent(value: { template: PluginComponentTemplate, data: KVObject})
18
19创建插件组件,用于显示外部应用提供的UI。
20
21**参数:**
22
23| 参数名 | 参数类型                                                                                                                                                        | 必填 | 参数描述                                                                                                  |
24| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------------------------------------------- |
25| value  | {<br/>template:&nbsp; [PluginComponentTemplate](#plugincomponenttemplate类型说明),<br/>data:&nbsp;[KVObject](../apis/js-apis-plugincomponent.md#kvobject)<br/>} | 是   | template:&nbsp;&nbsp;组件模板,用于跟提供者定义的组件绑定。<br/>data:&nbsp;传给插件组件提供者使用的数据。 |
26
27## PluginComponentTemplate类型说明
28
29| 参数       | 类型   | 描述                        |
30| ---------- | ------ | --------------------------- |
31| source     | string | 组件模板名。                |
32| bundleName | string | 提供者Ability的bundleName。 |
33## 属性
34支持[通用属性size](ts-universal-attributes-size.md),且必须设置size。
35
36**说明:**
37
38  模板支持两种提供方式:
39* 1.使用绝对路径进行资源提供:source字段填写模板绝对路径,bundleName不需要填写。仅适用于不需要加载资源的单独模板页面,不建议使用。
40* 2.通过应用包进行资源提供:bundleName字段需要填写应用包名;source字段填写相对hap包的模板相对路径。
41
42  例如:{source:'ets/pages/plugin.js', bundleName:'com.example.provider'}
43
44  仅对FA模型支持source字段填写AbilityName进行模板提供。
45
46  例如:{source:'plugin', bundleName:'com.example.provider'}
47
48
49## 事件
50
51仅支持[手势事件](ts-gesture-settings.md)分发给提供方页面,并在提供方页面内部处理。
52
53除支持[通用事件](ts-universal-events-click.md),还支持以下事件:
54
55| 名称                                                                                                                | 功能描述                                                               |
56| ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
57| onComplete(callback:&nbsp;()&nbsp;=&gt;&nbsp;void)                                                                  | 组件加载完成回调。                                                     |
58| onError(callback:&nbsp;(info:&nbsp;{&nbsp;errcode:&nbsp;number,&nbsp;msg:&nbsp;string&nbsp;})&nbsp;=&gt;&nbsp;void) | 组件加载错误回调。<br/>errcode:&nbsp;错误码。<br/>msg:&nbsp;错误信息。 |
59
60## 示例
61
62
63### 组件使用方
64
65```ts
66//PluginUserExample.ets
67import plugin from "./plugin_component.js"
68
69@Entry
70@Component
71struct PluginUserExample {
72  @StorageLink("plugincount") plugincount: Object[] = [
73    { source: 'plugincomponent1', bundleName: 'com.example.plugin' },
74    { source: 'plugintemplate', bundleName: 'com.example.myapplication' },
75    { source: 'plugintemplate', bundleName: 'com.example.myapplication' }]
76
77  build() {
78    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
79      Text('Hello World')
80        .fontSize(50)
81        .fontWeight(FontWeight.Bold)
82      Button('Register Request Listener')
83        .fontSize(30)
84        .width(400)
85        .height(100)
86        .margin({top:20})
87        .onClick(()=>{
88          plugin.onListener()
89          console.log("Button('Register Request Listener')")
90        })
91      Button('Request')
92        .fontSize(50)
93        .width(400)
94        .height(100)
95        .margin({ top: 20 })
96        .onClick(() => {
97          plugin.Request()
98          console.log("Button('Request')")
99        })
100      ForEach(this.plugincount, item => {
101        PluginComponent({
102          template: { source: 'PluginProviderExample', bundleName: 'com.example.plugin' },
103          data: { 'countDownStartValue': 'new countDownStartValue' }
104        }).size({ width: 500, height: 100 })
105          .onComplete(() => {
106            console.log("onComplete")
107          })
108          .onError(({errcode, msg}) => {
109            console.log("onComplete" + errcode + ":" + msg)
110          })
111      })
112    }
113    .width('100%')
114    .height('100%')
115  }
116}
117```
118
119### 组件提供方
120
121```ts
122//PluginProviderExample.ets
123import plugin from "./plugin_component.js"
124
125@Entry
126@Component
127struct PluginProviderExample {
128  @State message: string = 'no click!'
129
130  build() {
131    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
132      Button('Register Push Listener')
133        .fontSize(30)
134        .width(400)
135        .height(100)
136        .margin({top:20})
137        .onClick(()=>{
138          plugin.onListener()
139          console.log("Button('Register Push Listener')")
140        })
141      Button('Push')
142        .fontSize(30)
143        .width(400)
144        .height(100)
145        .margin({top:20})
146        .onClick(()=>{
147          plugin.Push()
148          this.message = "Button('Push')"
149          console.log("Button('Push')")
150        })
151      Text(this.message)
152        .height(150)
153        .fontSize(30)
154        .padding(5)
155        .margin(5)
156    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
157  }
158}
159```
160
161### Plugin组件工具
162
163#### FA模型
164```js
165//plugin_component.js
166import pluginComponentManager from '@ohos.pluginComponent'
167
168function onPushListener(source, template, data, extraData) {
169  console.log("onPushListener template.source=" + template.source)
170  var jsonObject = JSON.parse(data.componentTemplate.source)
171  console.log("request_callback1:source json object" + jsonObject)
172  var jsonArry = jsonObject.ExternalComponent
173  for (var i in jsonArry) {
174    console.log(jsonArry[i])
175  }
176  console.log("onPushListener:source json object" + jsonObject)
177  console.log("onPushListener:source json string" + JSON.stringify(jsonObject))
178  console.log("onPushListener template.ability=" + template.ability)
179  console.log("onPushListener data=" + JSON.stringify(data))
180  console.log("onPushListener extraData=" + JSON.stringify(extraData))
181}
182
183function onRequestListener(source, name, data)
184{
185    console.log("onRequestListener name=" + name);
186    console.log("onRequestListener data=" + JSON.stringify(data));
187    return {template:"plugintemplate", data:data};
188}
189
190export default {
191  //register listener
192  onListener() {
193    pluginComponentManager.on("push", onPushListener)
194    pluginComponentManager.on("request", onRequestListener)
195  },
196  Push() {
197    // 组件提供方主动发送事件
198    pluginComponentManager.push(
199      {
200        want: {
201          bundleName: "com.example.plugin",
202          abilityName: "com.example.myapplication.PluginProviderExample",
203        },
204        name: "PluginProviderExample",
205        data: {
206          "key_1": "plugin component test",
207          "key_2": 34234
208        },
209        extraData: {
210          "extra_str": "this is push event"
211        },
212        jsonPath: "",
213      },
214      (err, data) => {
215        console.log("push_callback: push ok!");
216      }
217    )
218  },
219  Request() {
220    // 组件使用方主动发送事件
221    pluginComponentManager.request({
222        want: {
223          bundleName: "com.example.plugin",
224          abilityName: "com.example.myapplication.PluginProviderExample",
225        },
226        name: "PluginProviderExample",
227        data: {
228          "key_1": "plugin component test",
229          "key_2": 34234
230        },
231        jsonPath: "",
232      },
233      (err, data) => {
234        console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability)
235        console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source)
236        var jsonObject = JSON.parse(data.componentTemplate.source)
237        console.log("request_callback:source json object" + jsonObject)
238        var jsonArry = jsonObject.ExternalComponent
239        for (var i in jsonArry) {
240          console.log(jsonArry[i])
241        }
242        console.log("request_callback:source json string" + JSON.stringify(jsonObject))
243        console.log("request_callback: data=" + JSON.stringify(data.data))
244        console.log("request_callback: extraData=" + JSON.stringify(data.extraData))
245      }
246    )
247  }
248}
249```
250
251#### Stage模型
252```js
253//plugin_component.js
254import pluginComponentManager from '@ohos.pluginComponent'
255
256function onPushListener(source, template, data, extraData) {
257  console.log("onPushListener template.source=" + template.source)
258  var jsonObject = JSON.parse(data.componentTemplate.source)
259  console.log("request_callback1:source json object" + jsonObject)
260  var jsonArry = jsonObject.ExternalComponent
261  for (var i in jsonArry) {
262    console.log(jsonArry[i])
263  }
264  console.log("onPushListener:source json object" + jsonObject)
265  console.log("onPushListener:source json string" + JSON.stringify(jsonObject))
266  console.log("onPushListener template.ability=" + template.ability)
267  console.log("onPushListener data=" + JSON.stringify(data))
268  console.log("onPushListener extraData=" + JSON.stringify(extraData))
269}
270
271function onRequestListener(source, name, data)
272{
273    console.log("onRequestListener name=" + name);
274    console.log("onRequestListener data=" + JSON.stringify(data));
275    return {template:"plugintemplate", data:data};
276}
277
278export default {
279  //register listener
280  onListener() {
281    pluginComponentManager.on("push", onPushListener)
282    pluginComponentManager.on("request", onRequestListener)
283  },
284  Push() {
285    // 组件提供方主动发送事件
286    pluginComponentManager.push(
287      {
288        owner: {
289          bundleName: "com.example.myapplication",
290          abilityName: "com.example.myapplication.MainAbility",
291        },
292        target: {
293          bundleName: "com.example.plugin",
294          abilityName: "com.example.myapplication.PluginProviderExample",
295        },
296        name: "PluginProviderExample",
297        data: {
298          "key_1": "plugin component test",
299          "key_2": 34234
300        },
301        extraData: {
302          "extra_str": "this is push event"
303        },
304        jsonPath: "",
305      },
306      (err, data) => {
307        console.log("push_callback: push ok!");
308      }
309    )
310  },
311  Request() {
312    // 组件使用方主动发送事件
313    pluginComponentManager.request({
314        owner: {
315          bundleName: "com.example.myapplication",
316          abilityName: "com.example.myapplication.MainAbility",
317        },
318        target: {
319          bundleName: "com.example.plugin",
320          abilityName: "com.example.myapplication.PluginProviderExample",
321        },
322        name: "PluginProviderExample",
323        data: {
324          "key_1": "plugin component test",
325          "key_2": 34234
326        },
327        jsonPath: "",
328      },
329      (err, data) => {
330        console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability)
331        console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source)
332        var jsonObject = JSON.parse(data.componentTemplate.source)
333        console.log("request_callback:source json object" + jsonObject)
334        var jsonArry = jsonObject.ExternalComponent
335        for (var i in jsonArry) {
336          console.log(jsonArry[i])
337        }
338        console.log("request_callback:source json string" + JSON.stringify(jsonObject))
339        console.log("request_callback: data=" + JSON.stringify(data.data))
340        console.log("request_callback: extraData=" + JSON.stringify(data.extraData))
341      }
342    )
343  }
344}
345```
346