1e41f4b71Sopenharmony_ci# PluginComponent (System API)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ciThe **\<PluginComponent>** allows an application to display external UI from another application. To implement update through inter-process communication (IPC), see [@ohos.pluginComponent](../js-apis-plugincomponent.md).
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci>  **NOTE**
7e41f4b71Sopenharmony_ci>
8e41f4b71Sopenharmony_ci>  - This component is supported since API version 9. Updates will be marked with a superscript to indicate their earliest API version.
9e41f4b71Sopenharmony_ci>
10e41f4b71Sopenharmony_ci>  - The APIs provided by this module are system APIs.
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci## Child Components
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ciNot supported
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci## APIs
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ciPluginComponent(value: { template: PluginComponentTemplate, data: KVObject})
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ciCreates a **PluginComponent** to display the UI provided by an external application.
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci**Parameters**
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci| Name| Type                                                    | Mandatory| Description                                                    |
26e41f4b71Sopenharmony_ci| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
27e41f4b71Sopenharmony_ci| value  | {<br>template:  [PluginComponentTemplate](#plugincomponenttemplate),<br>data: [KVObject](../js-apis-plugincomponent.md#kvobject)<br>} | Yes  | **template**: template of the **PluginComponent**, which is bound to the component defined by the provider.<br>**data**: data passed to the **PluginComponent** provider.|
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci## PluginComponentTemplate
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci| Name      | Type  | Description                       |
32e41f4b71Sopenharmony_ci| ---------- | ------ | --------------------------- |
33e41f4b71Sopenharmony_ci| source     | string | Component template name.               |
34e41f4b71Sopenharmony_ci| bundleName | string | Bundle name of the provider ability.|
35e41f4b71Sopenharmony_ci## Attributes
36e41f4b71Sopenharmony_ciThe width and height of the component must be explicitly set to non-zero valid values.
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ci**NOTE**
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ci  The template can be provided in either of the following modes:
41e41f4b71Sopenharmony_ci* Use an absolute path. In this case, set **source** to the absolute path of the template and leave **bundleName** blank. This mode is not recommended as it is applicable only to standalone templates that do not need to load resources.
42e41f4b71Sopenharmony_ci
43e41f4b71Sopenharmony_ci* Use an application package. In this case, set **bundleName** to the application bundle name and **source** to the relative path of the HAP file template. In the multi-HAP scenario, a HAP file is identified based on its relative path and name.
44e41f4b71Sopenharmony_ci
45e41f4b71Sopenharmony_ci  Example: **{source: 'pages/PluginProviderExample.ets&entry', bundleName:'com.example.provider'}**
46e41f4b71Sopenharmony_ci
47e41f4b71Sopenharmony_ci  The template is provided only when **source** can be set to an ability name in the FA model.
48e41f4b71Sopenharmony_ci
49e41f4b71Sopenharmony_ci  Example: **{source:'plugin', bundleName:'com.example.provider'}**
50e41f4b71Sopenharmony_ci
51e41f4b71Sopenharmony_ci
52e41f4b71Sopenharmony_ci## Events
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ciOnly the [gesture event](ts-gesture-settings.md) can be distributed to and processed inside the provider page.
55e41f4b71Sopenharmony_ci
56e41f4b71Sopenharmony_ciIn addition to the [universal events](ts-universal-events-click.md), the following events are supported.
57e41f4b71Sopenharmony_ci
58e41f4b71Sopenharmony_ci### onComplete
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_cionComplete(callback: () =&gt; void)
61e41f4b71Sopenharmony_ci
62e41f4b71Sopenharmony_ciTriggered when the component loading is complete.
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci**System API**: This is a system API.
65e41f4b71Sopenharmony_ci
66e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_ci### onError
69e41f4b71Sopenharmony_ci
70e41f4b71Sopenharmony_cionError(callback: (info: { errcode: number, msg: string }) =&gt; void)
71e41f4b71Sopenharmony_ci
72e41f4b71Sopenharmony_ciTriggered when an error occurs during component loading.
73e41f4b71Sopenharmony_ci
74e41f4b71Sopenharmony_ci**System API**: This is a system API.
75e41f4b71Sopenharmony_ci
76e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full
77e41f4b71Sopenharmony_ci
78e41f4b71Sopenharmony_ci**Parameters**
79e41f4b71Sopenharmony_ci
80e41f4b71Sopenharmony_ci| Name| Type                                                        | Mandatory| Description                                           |
81e41f4b71Sopenharmony_ci| ------ | ------------------------------------------------------------ | ---- | ----------------------------------------------- |
82e41f4b71Sopenharmony_ci| info   |  { errcode: number, msg: string } | Yes  | **errcode**: error code.<br>**msg**: error information.|
83e41f4b71Sopenharmony_ci
84e41f4b71Sopenharmony_ci## Example
85e41f4b71Sopenharmony_ci
86e41f4b71Sopenharmony_ci
87e41f4b71Sopenharmony_ci### PluginComponent User
88e41f4b71Sopenharmony_ci
89e41f4b71Sopenharmony_ci```ts
90e41f4b71Sopenharmony_ci//PluginUserExample.ets
91e41f4b71Sopenharmony_ciimport plugin from "./plugin_component"
92e41f4b71Sopenharmony_ciinterface Info{
93e41f4b71Sopenharmony_ci  errcode:number,
94e41f4b71Sopenharmony_ci  msg:string
95e41f4b71Sopenharmony_ci}
96e41f4b71Sopenharmony_ci@Entry
97e41f4b71Sopenharmony_ci@Component
98e41f4b71Sopenharmony_cistruct PluginUserExample {
99e41f4b71Sopenharmony_ci
100e41f4b71Sopenharmony_ci  build() {
101e41f4b71Sopenharmony_ci    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
102e41f4b71Sopenharmony_ci      Text('Hello World')
103e41f4b71Sopenharmony_ci        .fontSize(50)
104e41f4b71Sopenharmony_ci        .fontWeight(FontWeight.Bold)
105e41f4b71Sopenharmony_ci      Button('Register Request Listener')
106e41f4b71Sopenharmony_ci        .fontSize(30)
107e41f4b71Sopenharmony_ci        .width(400)
108e41f4b71Sopenharmony_ci        .height(100)
109e41f4b71Sopenharmony_ci        .margin({top:20})
110e41f4b71Sopenharmony_ci        .onClick(()=>{
111e41f4b71Sopenharmony_ci          plugin.onListener()
112e41f4b71Sopenharmony_ci          console.log("Button('Register Request Listener')")
113e41f4b71Sopenharmony_ci        })
114e41f4b71Sopenharmony_ci      Button('Request')
115e41f4b71Sopenharmony_ci        .fontSize(50)
116e41f4b71Sopenharmony_ci        .width(400)
117e41f4b71Sopenharmony_ci        .height(100)
118e41f4b71Sopenharmony_ci        .margin({ top: 20 })
119e41f4b71Sopenharmony_ci        .onClick(() => {
120e41f4b71Sopenharmony_ci          plugin.Request()
121e41f4b71Sopenharmony_ci          console.log("Button('Request')")
122e41f4b71Sopenharmony_ci        })
123e41f4b71Sopenharmony_ci      PluginComponent({
124e41f4b71Sopenharmony_ci        template: { source: 'pages/PluginProviderExample.ets&entry', bundleName: 'com.example.plugin' },
125e41f4b71Sopenharmony_ci        data: { 'countDownStartValue': 'new countDownStartValue' }
126e41f4b71Sopenharmony_ci      }).size({ width: 500, height: 350 })
127e41f4b71Sopenharmony_ci        .onComplete(() => {
128e41f4b71Sopenharmony_ci          console.log("onComplete")
129e41f4b71Sopenharmony_ci        })
130e41f4b71Sopenharmony_ci        .onError((info:Info) => {
131e41f4b71Sopenharmony_ci          console.log("onComplete" + info.errcode + ":" + info.msg)
132e41f4b71Sopenharmony_ci        })
133e41f4b71Sopenharmony_ci    }
134e41f4b71Sopenharmony_ci    .width('100%')
135e41f4b71Sopenharmony_ci    .height('100%')
136e41f4b71Sopenharmony_ci  }
137e41f4b71Sopenharmony_ci}
138e41f4b71Sopenharmony_ci```
139e41f4b71Sopenharmony_ci
140e41f4b71Sopenharmony_ci### PluginComponent Provider
141e41f4b71Sopenharmony_ci
142e41f4b71Sopenharmony_ci```ts
143e41f4b71Sopenharmony_ci//PluginProviderExample.ets
144e41f4b71Sopenharmony_ciimport plugin from "./plugin_component"
145e41f4b71Sopenharmony_ci
146e41f4b71Sopenharmony_ci@Entry
147e41f4b71Sopenharmony_ci@Component
148e41f4b71Sopenharmony_cistruct PluginProviderExample {
149e41f4b71Sopenharmony_ci  @State message: string = 'no click!'
150e41f4b71Sopenharmony_ci
151e41f4b71Sopenharmony_ci  build() {
152e41f4b71Sopenharmony_ci    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
153e41f4b71Sopenharmony_ci      Button('Register Push Listener')
154e41f4b71Sopenharmony_ci        .fontSize(30)
155e41f4b71Sopenharmony_ci        .width(400)
156e41f4b71Sopenharmony_ci        .height(100)
157e41f4b71Sopenharmony_ci        .margin({top:20})
158e41f4b71Sopenharmony_ci        .onClick(()=>{
159e41f4b71Sopenharmony_ci          plugin.onListener()
160e41f4b71Sopenharmony_ci          console.log("Button('Register Push Listener')")
161e41f4b71Sopenharmony_ci        })
162e41f4b71Sopenharmony_ci      Button('Push')
163e41f4b71Sopenharmony_ci        .fontSize(30)
164e41f4b71Sopenharmony_ci        .width(400)
165e41f4b71Sopenharmony_ci        .height(100)
166e41f4b71Sopenharmony_ci        .margin({top:20})
167e41f4b71Sopenharmony_ci        .onClick(()=>{
168e41f4b71Sopenharmony_ci          plugin.Push()
169e41f4b71Sopenharmony_ci          this.message = "Button('Push')"
170e41f4b71Sopenharmony_ci          console.log("Button('Push')")
171e41f4b71Sopenharmony_ci        })
172e41f4b71Sopenharmony_ci      Text(this.message)
173e41f4b71Sopenharmony_ci        .height(150)
174e41f4b71Sopenharmony_ci        .fontSize(30)
175e41f4b71Sopenharmony_ci        .padding(5)
176e41f4b71Sopenharmony_ci        .margin(5)
177e41f4b71Sopenharmony_ci    }.width('100%').height('100%').backgroundColor(0xDCDCDC).padding({ top: 5 })
178e41f4b71Sopenharmony_ci  }
179e41f4b71Sopenharmony_ci}
180e41f4b71Sopenharmony_ci```
181e41f4b71Sopenharmony_ci
182e41f4b71Sopenharmony_ci### PluginComponent Tools
183e41f4b71Sopenharmony_ci
184e41f4b71Sopenharmony_ci#### FA Model
185e41f4b71Sopenharmony_ci```js
186e41f4b71Sopenharmony_ci// The sample code applies only to JS source files.
187e41f4b71Sopenharmony_ci//plugin_component.js
188e41f4b71Sopenharmony_ciimport pluginComponentManager from '@ohos.pluginComponent'
189e41f4b71Sopenharmony_ci
190e41f4b71Sopenharmony_cifunction onPushListener(source, template, data, extraData) {
191e41f4b71Sopenharmony_ci  console.log("onPushListener template.source=" + template.source)
192e41f4b71Sopenharmony_ci  console.log("onPushListener template.ability=" + template.ability)
193e41f4b71Sopenharmony_ci  console.log("onPushListener data=" + JSON.stringify(data))
194e41f4b71Sopenharmony_ci  console.log("onPushListener extraData=" + JSON.stringify(extraData))
195e41f4b71Sopenharmony_ci}
196e41f4b71Sopenharmony_ci
197e41f4b71Sopenharmony_cifunction onRequestListener(source, name, data)
198e41f4b71Sopenharmony_ci{
199e41f4b71Sopenharmony_ci    console.log("onRequestListener name=" + name);
200e41f4b71Sopenharmony_ci    console.log("onRequestListener data=" + JSON.stringify(data));
201e41f4b71Sopenharmony_ci    return {template:"plugintemplate", data:data};
202e41f4b71Sopenharmony_ci}
203e41f4b71Sopenharmony_ci
204e41f4b71Sopenharmony_ciexport default {
205e41f4b71Sopenharmony_ci  //register listener
206e41f4b71Sopenharmony_ci  onListener() {
207e41f4b71Sopenharmony_ci    pluginComponentManager.on("push", onPushListener)
208e41f4b71Sopenharmony_ci    pluginComponentManager.on("request", onRequestListener)
209e41f4b71Sopenharmony_ci  },
210e41f4b71Sopenharmony_ci  Push() {
211e41f4b71Sopenharmony_ci    // The component provider proactively sends data.
212e41f4b71Sopenharmony_ci    pluginComponentManager.push(
213e41f4b71Sopenharmony_ci      {
214e41f4b71Sopenharmony_ci        want: {
215e41f4b71Sopenharmony_ci          bundleName: "com.example.plugin",
216e41f4b71Sopenharmony_ci          abilityName: "com.example.myapplication.PluginProviderExample",
217e41f4b71Sopenharmony_ci        },
218e41f4b71Sopenharmony_ci        name: "PluginProviderExample",
219e41f4b71Sopenharmony_ci        data: {
220e41f4b71Sopenharmony_ci          "key_1": "plugin component test",
221e41f4b71Sopenharmony_ci          "key_2": 34234
222e41f4b71Sopenharmony_ci        },
223e41f4b71Sopenharmony_ci        extraData: {
224e41f4b71Sopenharmony_ci          "extra_str": "this is push event"
225e41f4b71Sopenharmony_ci        },
226e41f4b71Sopenharmony_ci        jsonPath: "",
227e41f4b71Sopenharmony_ci      },
228e41f4b71Sopenharmony_ci      (err, data) => {
229e41f4b71Sopenharmony_ci        console.log("push_callback: push ok!");
230e41f4b71Sopenharmony_ci      }
231e41f4b71Sopenharmony_ci    )
232e41f4b71Sopenharmony_ci  },
233e41f4b71Sopenharmony_ci  Request() {
234e41f4b71Sopenharmony_ci    // The component user proactively sends data.
235e41f4b71Sopenharmony_ci    pluginComponentManager.request({
236e41f4b71Sopenharmony_ci        want: {
237e41f4b71Sopenharmony_ci          bundleName: "com.example.plugin",
238e41f4b71Sopenharmony_ci          abilityName: "com.example.myapplication.PluginProviderExample",
239e41f4b71Sopenharmony_ci        },
240e41f4b71Sopenharmony_ci        name: "PluginProviderExample",
241e41f4b71Sopenharmony_ci        data: {
242e41f4b71Sopenharmony_ci          "key_1": "plugin component test",
243e41f4b71Sopenharmony_ci          "key_2": 34234
244e41f4b71Sopenharmony_ci        },
245e41f4b71Sopenharmony_ci        jsonPath: "",
246e41f4b71Sopenharmony_ci      },
247e41f4b71Sopenharmony_ci      (err, data) => {
248e41f4b71Sopenharmony_ci        console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability)
249e41f4b71Sopenharmony_ci        console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source)
250e41f4b71Sopenharmony_ci        console.log("request_callback: data=" + JSON.stringify(data.data))
251e41f4b71Sopenharmony_ci        console.log("request_callback: extraData=" + JSON.stringify(data.extraData))
252e41f4b71Sopenharmony_ci      }
253e41f4b71Sopenharmony_ci    )
254e41f4b71Sopenharmony_ci  }
255e41f4b71Sopenharmony_ci}
256e41f4b71Sopenharmony_ci```
257e41f4b71Sopenharmony_ci
258e41f4b71Sopenharmony_ci#### Stage Model
259e41f4b71Sopenharmony_ci```js
260e41f4b71Sopenharmony_ci// The sample code applies only to JS source files.
261e41f4b71Sopenharmony_ci//plugin_component.js
262e41f4b71Sopenharmony_ciimport pluginComponentManager from '@ohos.pluginComponent'
263e41f4b71Sopenharmony_ci
264e41f4b71Sopenharmony_cifunction onPushListener(source, template, data, extraData) {
265e41f4b71Sopenharmony_ci  console.log("onPushListener template.source=" + template.source)
266e41f4b71Sopenharmony_ci  console.log("onPushListener template.ability=" + template.ability)
267e41f4b71Sopenharmony_ci  console.log("onPushListener data=" + JSON.stringify(data))
268e41f4b71Sopenharmony_ci  console.log("onPushListener extraData=" + JSON.stringify(extraData))
269e41f4b71Sopenharmony_ci}
270e41f4b71Sopenharmony_ci
271e41f4b71Sopenharmony_cifunction onRequestListener(source, name, data)
272e41f4b71Sopenharmony_ci{
273e41f4b71Sopenharmony_ci    console.log("onRequestListener name=" + name);
274e41f4b71Sopenharmony_ci    console.log("onRequestListener data=" + JSON.stringify(data));
275e41f4b71Sopenharmony_ci    return {template:"plugintemplate", data:data};
276e41f4b71Sopenharmony_ci}
277e41f4b71Sopenharmony_ci
278e41f4b71Sopenharmony_ciexport default {
279e41f4b71Sopenharmony_ci  //register listener
280e41f4b71Sopenharmony_ci  onListener() {
281e41f4b71Sopenharmony_ci    pluginComponentManager.on("push", onPushListener)
282e41f4b71Sopenharmony_ci    pluginComponentManager.on("request", onRequestListener)
283e41f4b71Sopenharmony_ci  },
284e41f4b71Sopenharmony_ci  Push() {
285e41f4b71Sopenharmony_ci    // The component provider proactively sends data.
286e41f4b71Sopenharmony_ci    pluginComponentManager.push(
287e41f4b71Sopenharmony_ci      {
288e41f4b71Sopenharmony_ci        owner: {
289e41f4b71Sopenharmony_ci          bundleName: "com.example.myapplication",
290e41f4b71Sopenharmony_ci          abilityName: "com.example.myapplication.MainAbility",
291e41f4b71Sopenharmony_ci        },
292e41f4b71Sopenharmony_ci        target: {
293e41f4b71Sopenharmony_ci          bundleName: "com.example.plugin",
294e41f4b71Sopenharmony_ci          abilityName: "com.example.myapplication.PluginProviderExample",
295e41f4b71Sopenharmony_ci        },
296e41f4b71Sopenharmony_ci        name: "PluginProviderExample",
297e41f4b71Sopenharmony_ci        data: {
298e41f4b71Sopenharmony_ci          "key_1": "plugin component test",
299e41f4b71Sopenharmony_ci          "key_2": 34234
300e41f4b71Sopenharmony_ci        },
301e41f4b71Sopenharmony_ci        extraData: {
302e41f4b71Sopenharmony_ci          "extra_str": "this is push event"
303e41f4b71Sopenharmony_ci        },
304e41f4b71Sopenharmony_ci        jsonPath: "",
305e41f4b71Sopenharmony_ci      },
306e41f4b71Sopenharmony_ci      (err, data) => {
307e41f4b71Sopenharmony_ci        console.log("push_callback: push ok!");
308e41f4b71Sopenharmony_ci      }
309e41f4b71Sopenharmony_ci    )
310e41f4b71Sopenharmony_ci  },
311e41f4b71Sopenharmony_ci  Request() {
312e41f4b71Sopenharmony_ci    // The component user proactively sends data.
313e41f4b71Sopenharmony_ci    pluginComponentManager.request({
314e41f4b71Sopenharmony_ci        owner: {
315e41f4b71Sopenharmony_ci          bundleName: "com.example.myapplication",
316e41f4b71Sopenharmony_ci          abilityName: "com.example.myapplication.MainAbility",
317e41f4b71Sopenharmony_ci        },
318e41f4b71Sopenharmony_ci        target: {
319e41f4b71Sopenharmony_ci          bundleName: "com.example.plugin",
320e41f4b71Sopenharmony_ci          abilityName: "com.example.myapplication.PluginProviderExample",
321e41f4b71Sopenharmony_ci        },
322e41f4b71Sopenharmony_ci        name: "PluginProviderExample",
323e41f4b71Sopenharmony_ci        data: {
324e41f4b71Sopenharmony_ci          "key_1": "plugin component test",
325e41f4b71Sopenharmony_ci          "key_2": 34234
326e41f4b71Sopenharmony_ci        },
327e41f4b71Sopenharmony_ci        jsonPath: "",
328e41f4b71Sopenharmony_ci      },
329e41f4b71Sopenharmony_ci      (err, data) => {
330e41f4b71Sopenharmony_ci        console.log("request_callback: componentTemplate.ability=" + data.componentTemplate.ability)
331e41f4b71Sopenharmony_ci        console.log("request_callback: componentTemplate.source=" + data.componentTemplate.source)
332e41f4b71Sopenharmony_ci        console.log("request_callback: data=" + JSON.stringify(data.data))
333e41f4b71Sopenharmony_ci        console.log("request_callback: extraData=" + JSON.stringify(data.extraData))
334e41f4b71Sopenharmony_ci      }
335e41f4b71Sopenharmony_ci    )
336e41f4b71Sopenharmony_ci  }
337e41f4b71Sopenharmony_ci}
338e41f4b71Sopenharmony_ci```
339