native-view.md 5.5 KB
Newer Older
D
DCloud_LXH 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
## native-view

<!-- UTSCOMJSON.native-view.description -->

`native-view`自身没有渲染内容,开发者可以通过DOM API获取到`native-view`对应的原生view,然后提供平台原生view与`native-view`进行绑定,`native-view`将展示该view的渲染内容。

`<native-view>`组件是uni-app x下扩展原生组件(如map)的重要方式。事实上官方的map组件就是使用`<native-view>`开发的。详见下方的使用场景章节。

<!-- UTSCOMJSON.native-view.compatibility -->

<!-- UTSCOMJSON.native-view.attribute -->

<!-- UTSCOMJSON.native-view.event -->

<!-- UTSCOMJSON.native-view.component_type -->

### 使用场景

`native-view` 适用于开发[uts插件-标准模式组件](../plugin/uts-component-vue.md)

### 使用教程

#### 获取 UniNativeViewElement

`native-view`提供 @init 监听元素初始化,通过事件[UniNativeViewInitEvent](#uninativeviewinitevent)的 detail.element 获取到 [UniNativeViewElement](../dom/uninativeviewelement.md)

#### UniNativeViewElement绑定原生view

**Android 平台:**

[UniNativeViewElement](../dom/uninativeviewelement.md) 提供[bindAndroidView](../dom/uninativeviewelement.md#bindandroidview)函数与`native-view`绑定android平台原生view

**IOS 平台:**

[UniNativeViewElement](../dom/uninativeviewelement.md) 提供[bindIOSView](../dom/uninativeviewelement.md#bindiosview)函数与`native-view`绑定ios平台原生view

#### 分发自定义事件

[UniNativeViewElement](../dom/uninativeviewelement.md) 提供了dispatchEvent分发event事件API,注意:事件数据类型暂时只支持[UniNativeViewEvent](./common.md#uninativeviewevent)

具体示例请参考:[native-button](https://gitcode.net/dcloud/hello-uni-app-x/-/blob/alpha/uni_modules/native-button/components/native-button/native-button.uvue)插件,该插件使用`native-view`封装原生button实现的native-button。

### 注意事项
shutao-dc's avatar
shutao-dc 已提交
44 45

+ app平台`native-view`组件绑定原生view后自动适配[组件全局属性](common.md#组件全局属性)
D
DCloud_LXH 已提交
46 47 48 49 50 51 52 53
+ app平台`native-view`组件不支持自定义属性,使用[uts插件-标准模式组件-声明属性props](../plugin/uts-component-vue.md##组件声明属性props)实现自定义属性目的
+ android平台`native-view`组件不支持[list-item复用机制](list-item.md#list-item复用机制),list-item其他子组件不受影响正常启动复用业务。
+ android平台`native-view`组件不支持background、border、boxshadow属性
+ android平台`native-view`组件不支持子组件
+ android平台`native-view`组件不支持overflow属性设置visible,仅支持hidden

<!-- UTSCOMJSON.native-view.children -->

shutao-dc's avatar
shutao-dc 已提交
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
<!-- UTSCOMJSON.native-view.example -->

NativeButton原生对象代码如下:

::: preview

> Android

```uts
import { Button } from "android.widget"

export class NativeButton {
	$element: UniNativeViewElement;

	constructor(element: UniNativeViewElement) {
		this.$element = element;
		this.bindView();
	}

	button: Button | null = null;
	bindView() {
		//通过UniElement.getAndroidActivity()获取android平台activity 用于创建view的上下文
		this.button = new Button(this.$element.getAndroidActivity()!);  //构建原生view
		//限制原生Button 文案描述不自动大写
		this.button?.setAllCaps(false)
		//监听原生Button点击事件
		this.button?.setOnClickListener(_ => {
			const detail = {}
			//构建自定义UniNativeViewEvent返回对象
			const event = new UniNativeViewEvent("customClick", detail)
			//响应分发原生Button的点击事件
			this.$element.dispatchEvent(event)
		})
		//UniNativeViewEvent 绑定 安卓原生view
		this.$element.bindAndroidView(this.button!);
	}

	updateText(text: string) {
		//更新原生Button 文案描述
		this.button?.setText(text)
	}

	destroy() {
		//数据回收
	}
}
```

> iOS

```uts
import { UIButton, UIControl } from "UIKit"

export class NativeButton {

	element : UniNativeViewElement;
	button : UIButton | null;

D
DCloud_LXH 已提交
112
	constructor(element : UniNativeViewElement) {
shutao-dc's avatar
shutao-dc 已提交
113 114 115 116 117
    // 接收组件传递过来的UniNativeViewElement
		this.element = element;
		super.init()
		this.bindView();
	}
D
DCloud_LXH 已提交
118

shutao-dc's avatar
shutao-dc 已提交
119
	// element 绑定原生view
D
DCloud_LXH 已提交
120 121 122 123 124 125 126
	bindView() {
    // 初始化原生 UIButton
    this.button = new UIButton(type=UIButton.ButtonType.system)
    // 构建方法选择器
    const method = Selector("buttonClickAction")
    // button 绑定点击回调方法
    button?.addTarget(this, action = method, for = UIControl.Event.touchUpInside)
shutao-dc's avatar
shutao-dc 已提交
127 128 129 130
    // UniNativeViewElement 绑定原生 view
		this.element.bindIOSView(this.button!);
	}

D
DCloud_LXH 已提交
131
	updateText(text : string) {
shutao-dc's avatar
shutao-dc 已提交
132 133 134 135 136 137 138 139
    // 更新 button 显示文字
		this.button?.setTitle(text, for = UIControl.State.normal)
	}

	/**
	 * 按钮点击回调方法
	 * 在 swift 中,所有target-action (例如按钮的点击事件,NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。
	 */
D
DCloud_LXH 已提交
140
	@objc buttonClickAction() {
shutao-dc's avatar
shutao-dc 已提交
141
    //构建自定义 UniNativeViewEvent 对象
D
DCloud_LXH 已提交
142 143
		let event = new UniNativeViewEvent("customClick")
    //触发自定义事件
shutao-dc's avatar
shutao-dc 已提交
144 145 146
		this.element.dispatchEvent(event)
	}

D
DCloud_LXH 已提交
147
	destroy() {
shutao-dc's avatar
shutao-dc 已提交
148 149 150
    // 释放 UTS 实例对象,避免内存泄露
		UTSiOS.destroyInstance(this)
	}
D
DCloud_LXH 已提交
151
}
shutao-dc's avatar
shutao-dc 已提交
152 153 154

```

D
DCloud_LXH 已提交
155
:::
shutao-dc's avatar
shutao-dc 已提交
156 157

具体示例请参考:[native-button](https://gitcode.net/dcloud/hello-uni-app-x/-/blob/alpha/uni_modules/native-button/components/native-button/native-button.uvue)插件
D
DCloud_LXH 已提交
158 159

<!-- UTSCOMJSON.native-view.reference -->