1# PluginComponent 2 3提供外部应用组件嵌入式显示功能,即外部应用提供的UI可在本应用内显示。如需通过跨进程通信实现更新,请参考[@ohos.pluginComponent](../apis/js-apis-plugincomponent.md)。 4 5 6> **说明:** 7> 8> - 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 9 10## 子组件 11 12无 13 14 15## 接口 16 17PluginComponent(value: { template: PluginComponentTemplate, data: KVObject}) 18 19创建插件组件,用于显示外部应用提供的UI。 20 21**参数:** 22 23| 参数名 | 参数类型 | 必填 | 参数描述 | 24| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---- | --------------------------------------------------------------------------------------------------------- | 25| value | {<br/>template: [PluginComponentTemplate](#plugincomponenttemplate类型说明),<br/>data: [KVObject](../apis/js-apis-plugincomponent.md#kvobject)<br/>} | 是 | template: 组件模板,用于跟提供者定义的组件绑定。<br/>data: 传给插件组件提供者使用的数据。 | 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: () => void) | 组件加载完成回调。 | 58| onError(callback: (info: { errcode: number, msg: string }) => void) | 组件加载错误回调。<br/>errcode: 错误码。<br/>msg: 错误信息。 | 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