diff --git a/docs/plugin/uts-component.md b/docs/plugin/uts-component.md index 5990c922dd2103389b8180ba0ab1a310517526d3..b03d57660f2e74532f120e4bfdd5c263898f160a 100644 --- a/docs/plugin/uts-component.md +++ b/docs/plugin/uts-component.md @@ -121,330 +121,421 @@ UTS组件的优势在于,它秉承了UTS的跨平台特性,统一的UTS语 > Android -```ts +```html + + + + +``` + +> iOS + +```html + + - + /** + * 组件被创建,组件第一个生命周期, + * 在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑 + * [可选实现] + */ + created() { + }, + /** + * 对应平台的view载体即将被创建,对应前端beforeMount + * [可选实现] + */ + NVBeforeLoad() { -``` + }, + /** + * 创建原生View,必须定义返回值类型 + * 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型 + * [必须实现] + */ + NVLoad() : UIButton { + //必须实现 + buttonClickListsner = new ButtonClickListsner(this) -> iOS + let button = new UIButton() + button.setTitle(this.buttontext, for = UIControl.State.normal) + // 在 swift target-action 对应的方法需要以OC的方式来调用,那么OC语言中用Selector来表示一个方法的名称(又称方法选择器),创建一个Selector可以使用 Selector("functionName") 的方式。 + const method = Selector("buttonClickAction") + if (buttonClickListsner != null) { + button.addTarget(buttonClickListsner!, action = method, for = UIControl.Event.touchUpInside) + } + return button + }, -```ts - - - }, - /** - * 原生View将释放 - * [可选实现] - */ - NVBeforeUnload() {}, - /** - * 原生View已释放,这里可以做释放View之后的操作 - * [可选实现] - */ - NVUnloaded() { + ``` ::: @@ -521,6 +612,7 @@ NVMeasure 用于告诉排版系统,组件自身需要的宽高,具体的调 但是部分场景下,组件开发者需要自己维护宽高,则需要开发者重写此函数 +**注意:只有非容器组件生效,容器组件不应该重写此函数** + NVUpdateStyles @@ -536,10 +628,29 @@ NVUpdateStyles(styles: Map){ } ``` ++ NVRecycler +HBuilderX 4.0版本起支持,仅uni-app x App-Android平台支持 +当UTS组件在`list-view`组件中使用时,由于[复用机制](../component/list-view.md),UTS组件可能表现异常(UI、事件回调等),因此,组件开发者需要在此函数中进行相应的逻辑处理。 -**注意:只有非容器组件生效,容器组件不应该重写此函数** +比如我们使用UTS组件封装了一个Android原生的`EditText`控件(输入框),代码如下 + +```html +NVLoad() : EditText { + let editText = new EditText($androidContext!); + return editText; +} +``` + +然后我们在`list-view`组件中使用该UTS组件,当我们在第一个输入框中随机输入几个字符后,开始滚动列表,会发现之前输入的字符又出现在下面某个`list-item`中,这就是一个典型的由于复用机制导致的UI状态异常问题。此时我们就需要在NVRecycler()函数中处理该问题,代码如下 + +```html +NVRecycler() { + // 发生复用时置空输入框内容 + this.$el?.setText("") +} +``` [vue3 生命周期暂不支持](https://uniapp.dcloud.net.cn/tutorial/vue3-api.html#%E9%80%89%E9%A1%B9-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90)