提交 6ed0c5c5 编写于 作者: 杜庆泉's avatar 杜庆泉

Update uts-component.md

上级 e08ebe58
...@@ -159,6 +159,7 @@ UTS组件的优势在于,它秉承了UTS的跨平台特性,统一的UTS语 ...@@ -159,6 +159,7 @@ UTS组件的优势在于,它秉承了UTS的跨平台特性,统一的UTS语
props: { props: {
/** /**
* 字符串类型 属性:buttonText 需要设置默认值 * 字符串类型 属性:buttonText 需要设置默认值
* 目前仅支持,布尔,数字,字符串
*/ */
"buttonText": { "buttonText": {
type: String, type: String,
...@@ -603,200 +604,200 @@ NVUpdateStyles(styles: Map<String, any>){ ...@@ -603,200 +604,200 @@ NVUpdateStyles(styles: Map<String, any>){
```html ```html
<template> <template>
<view> <view>
</view> </view>
</template> </template>
<script lang="uts"> <script lang="uts">
/** /**
* 引用 Android 系统库 * 引用 Android 系统库
* [可选实现,按需引入] * [可选实现,按需引入]
*/ */
import TextUtils from 'android.text.TextUtils'; import TextUtils from 'android.text.TextUtils';
import Button from 'android.widget.Button'; import Button from 'android.widget.Button';
import View from 'android.view.View'; import View from 'android.view.View';
/** /**
* 引入三方库 * 引入三方库
* [可选实现,按需引入] * [可选实现,按需引入]
* *
* 在 Android 平台引入三方库有以下两种方式: * 在 Android 平台引入三方库有以下两种方式:
* 1、[推荐] 通过 仓储 方式引入,将 三方库的依赖信息 配置到 config.json 文件下的 dependencies 字段下。详细配置方式[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#dependencies) * 1、[推荐] 通过 仓储 方式引入,将 三方库的依赖信息 配置到 config.json 文件下的 dependencies 字段下。详细配置方式[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#dependencies)
* 2、直接引入,将 三方库的aar或jar文件 放到libs目录下。更多信息[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#android%E5%B9%B3%E5%8F%B0%E5%8E%9F%E7%94%9F%E9%85%8D%E7%BD%AE) * 2、直接引入,将 三方库的aar或jar文件 放到libs目录下。更多信息[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#android%E5%B9%B3%E5%8F%B0%E5%8E%9F%E7%94%9F%E9%85%8D%E7%BD%AE)
* *
* 在通过上述任意方式依赖三方库后,使用时需要在文件中 import * 在通过上述任意方式依赖三方库后,使用时需要在文件中 import
* import { LottieAnimationView } from 'com.airbnb.lottie.LottieAnimationView' * import { LottieAnimationView } from 'com.airbnb.lottie.LottieAnimationView'
*/ */
/** /**
* UTSAndroid 为平台内置对象,不需要 import 可直接调用其API,[详见](https://uniapp.dcloud.net.cn/uts/utsandroid.html#utsandroid) * UTSAndroid 为平台内置对象,不需要 import 可直接调用其API,[详见](https://uniapp.dcloud.net.cn/uts/utsandroid.html#utsandroid)
*/ */
//原生提供以下属性或方法的实现 //原生提供以下属性或方法的实现
export default { export default {
/** /**
* 组件名称,也就是开发者使用的标签 * 组件名称,也就是开发者使用的标签
*/ */
name: "uts-hello-view", name: "uts-hello-view",
/** /**
* 组件涉及的事件声明,只有声明过的事件,才能被正常发送 * 组件涉及的事件声明,只有声明过的事件,才能被正常发送
*/ */
emits: ['buttonclick'], emits: ['buttonclick'],
/** /**
* 属性声明,组件的使用者会传递这些属性值到组件 * 属性声明,组件的使用者会传递这些属性值到组件
*/ */
props: { props: {
"buttontext": { "buttontext": {
type: String, type: String,
default: "点击触发" default: "点击触发"
} }
}, },
/** /**
* 组件内部变量声明 * 组件内部变量声明
*/ */
data() { data() {
return {} return {}
}, },
/** /**
* 属性变化监听器实现 * 属性变化监听器实现
*/ */
watch: { watch: {
"buttontext": { "buttontext": {
/** /**
* 这里监听属性变化,并进行组件内部更新 * 这里监听属性变化,并进行组件内部更新
*/ */
handler(newValue : string, oldValue : string) { handler(newValue : string, oldValue : string) {
if (!TextUtils.isEmpty(newValue) && newValue != oldValue) { if (!TextUtils.isEmpty(newValue) && newValue != oldValue) {
this.$el?.setText(newValue); this.$el?.setText(newValue);
} }
}, },
immediate: false // 创建时是否通过此方法更新属性,默认值为false immediate: false // 创建时是否通过此方法更新属性,默认值为false
}, },
}, },
/** /**
* 规则:如果没有配置expose,则methods中的方法均对外暴露,如果配置了expose,则以expose的配置为准向外暴露 * 规则:如果没有配置expose,则methods中的方法均对外暴露,如果配置了expose,则以expose的配置为准向外暴露
* ['publicMethod'] 含义为:只有 `publicMethod` 在实例上可用 * ['publicMethod'] 含义为:只有 `publicMethod` 在实例上可用
*/ */
expose: ['doSomething'], expose: ['doSomething'],
methods: { methods: {
/** /**
* 对外公开的组件方法 * 对外公开的组件方法
* *
* uni-app中调用示例: * uni-app中调用示例:
* this.$refs["组件ref"].doSomething("uts-button"); * this.$refs["组件ref"].doSomething("uts-button");
* *
* uni-app x中调用示例: * uni-app x中调用示例:
* 1、引入对应Element * 1、引入对应Element
* import { UtsButtonElement(组件名称以upper camel case方式命名 + Element) } from 'uts.sdk.modules.utsComponent(组件目录名称以lower camel case方式命名)'; * import { UtsButtonElement(组件名称以upper camel case方式命名 + Element) } from 'uts.sdk.modules.utsComponent(组件目录名称以lower camel case方式命名)';
* 2、(this.$refs["组件ref"] as UtsButtonElement).doSomething("uts-button"); * 2、(this.$refs["组件ref"] as UtsButtonElement).doSomething("uts-button");
* 或 (uni.getElementById("组件id") as UtsButtonElement).doSomething("uts-button"); * 或 (uni.getElementById("组件id") as UtsButtonElement).doSomething("uts-button");
*/ */
doSomething(param : string) { doSomething(param : string) {
console.log(param); console.log(param);
}, },
/** /**
* 内部使用的组件方法 * 内部使用的组件方法
*/ */
privateMethod() { privateMethod() {
} }
}, },
/** /**
* [可选实现] 组件被创建,组件第一个生命周期, * [可选实现] 组件被创建,组件第一个生命周期,
* 在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑 * 在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑
*/ */
created() { created() {
}, },
/** /**
* [可选实现] 对应平台的view载体即将被创建,对应前端beforeMount * [可选实现] 对应平台的view载体即将被创建,对应前端beforeMount
*/ */
NVBeforeLoad() { NVBeforeLoad() {
}, },
/** /**
* [必须实现] 创建原生View,必须定义返回值类型 * [必须实现] 创建原生View,必须定义返回值类型
* 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型 * 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型
* (Android需要明确知道View类型,需特殊校验) * (Android需要明确知道View类型,需特殊校验)
*/ */
NVLoad() : Button { NVLoad() : Button {
let button = new Button($androidContext!); let button = new Button($androidContext!);
button.setText("点击触发"); button.setText("点击触发");
button.setOnClickListener(new ButtonClickListener(this)); button.setOnClickListener(new ButtonClickListener(this));
return button; return button;
}, },
/** /**
* [可选实现] 原生View已创建 * [可选实现] 原生View已创建
*/ */
NVLoaded() { NVLoaded() {
}, },
/** /**
* [可选实现] 原生View布局完成 * [可选实现] 原生View布局完成
*/ */
NVLayouted() { NVLayouted() {
}, },
/** /**
* [可选实现] 原生View将释放 * [可选实现] 原生View将释放
*/ */
NVBeforeUnload() { NVBeforeUnload() {
}, },
/** /**
* [可选实现] 原生View已释放,这里可以做释放View之后的操作 * [可选实现] 原生View已释放,这里可以做释放View之后的操作
*/ */
NVUnloaded() { NVUnloaded() {
}, },
/** /**
* [可选实现] 组件销毁 * [可选实现] 组件销毁
*/ */
unmounted() { unmounted() {
}, },
/** /**
* [可选实现] 自定组件布局尺寸,用于告诉排版系统,组件自身需要的宽高 * [可选实现] 自定组件布局尺寸,用于告诉排版系统,组件自身需要的宽高
* 一般情况下,组件的宽高应该是由终端系统的排版引擎决定,组件开发者不需要实现此函数 * 一般情况下,组件的宽高应该是由终端系统的排版引擎决定,组件开发者不需要实现此函数
* 但是部分场景下,组件开发者需要自己维护宽高,则需要开发者重写此函数 * 但是部分场景下,组件开发者需要自己维护宽高,则需要开发者重写此函数
*/ */
NVMeasure(size : UTSSize) : UTSSize { NVMeasure(size : UTSSize) : UTSSize {
// size.width = 300.0.toFloat(); // size.width = 300.0.toFloat();
// size.height = 200.0.toFloat(); // size.height = 200.0.toFloat();
return size; return size;
} }
} }
/** /**
* 定义按钮点击后触发回调的类 * 定义按钮点击后触发回调的类
* [可选实现] * [可选实现]
*/ */
class ButtonClickListener extends View.OnClickListener { class ButtonClickListener extends View.OnClickListener {
/** /**
* 如果需要在回调类或者代理类中对组件进行操作,比如调用组件方法,发送事件等,需要在该类中持有组件对应的原生类的对象 * 如果需要在回调类或者代理类中对组件进行操作,比如调用组件方法,发送事件等,需要在该类中持有组件对应的原生类的对象
* 组件原生类的基类为 UTSComponent,该类是一个泛型类,需要接收一个类型变量,该类型变量就是原生组件的类型 * 组件原生类的基类为 UTSComponent,该类是一个泛型类,需要接收一个类型变量,该类型变量就是原生组件的类型
*/ */
private comp : UTSComponent<Button>; private comp : UTSComponent<Button>;
constructor(comp : UTSComponent<Button>) { constructor(comp : UTSComponent<Button>) {
super(); super();
this.comp = comp; this.comp = comp;
} }
/** /**
* 按钮点击回调方法 * 按钮点击回调方法
*/ */
override onClick(v ?: View) { override onClick(v ?: View) {
console.log("按钮被点击"); console.log("按钮被点击");
// 发送事件 // 发送事件
this.comp.$emit("buttonclick"); this.comp.$emit("buttonclick");
} }
} }
</script> </script>
<style> <style>
</style> </style>
``` ```
...@@ -804,217 +805,217 @@ NVUpdateStyles(styles: Map<String, any>){ ...@@ -804,217 +805,217 @@ NVUpdateStyles(styles: Map<String, any>){
> iOS > iOS
```html ```html
<template> <template>
<view class="defaultStyles"> <view class="defaultStyles">
</view> </view>
</template> </template>
<script lang="uts"> <script lang="uts">
/** /**
* 引用 iOS 系统库 * 引用 iOS 系统库
* [可选实现,按需引入] * [可选实现,按需引入]
*/ */
import { import {
UIButton, UIButton,
UIControl UIControl
} from "UIKit" } from "UIKit"
/** /**
* 引入三方库 * 引入三方库
* [可选实现,按需引入] * [可选实现,按需引入]
* *
* 在 iOS 平台引入三方库有以下两种方式: * 在 iOS 平台引入三方库有以下两种方式:
* 1、通过引入三方库framework 或者.a 等方式,需要将 .framework 放到 ./Frameworks 目录下,将.a 放到 ./Libs 目录下。更多信息[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#ios-平台原生配置) * 1、通过引入三方库framework 或者.a 等方式,需要将 .framework 放到 ./Frameworks 目录下,将.a 放到 ./Libs 目录下。更多信息[详见](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html#ios-平台原生配置)
* 2、通过 cocoaPods 方式引入,将要引入的 pod 信息配置到 config.json 文件下的 dependencies-pods 字段下。详细配置方式[详见](https://uniapp.dcloud.net.cn/plugin/uts-ios-cocoapods.html) * 2、通过 cocoaPods 方式引入,将要引入的 pod 信息配置到 config.json 文件下的 dependencies-pods 字段下。详细配置方式[详见](https://uniapp.dcloud.net.cn/plugin/uts-ios-cocoapods.html)
* *
* 在通过上述任意方式依赖三方库后,使用时需要在文件中 import: * 在通过上述任意方式依赖三方库后,使用时需要在文件中 import:
* 示例:import { LottieAnimationView, LottieAnimation, LottieLoopMode } from 'Lottie' * 示例:import { LottieAnimationView, LottieAnimation, LottieLoopMode } from 'Lottie'
*/ */
/** /**
* UTSiOS、UTSComponent 为平台内置对象,不需要 import 可直接调用其API,[详见](https://uniapp.dcloud.net.cn/uts/utsios.html) * UTSiOS、UTSComponent 为平台内置对象,不需要 import 可直接调用其API,[详见](https://uniapp.dcloud.net.cn/uts/utsios.html)
*/ */
import { UTSComponent } from "DCloudUTSFoundation" import { UTSComponent } from "DCloudUTSFoundation"
//原生提供以下属性或方法的实现 //原生提供以下属性或方法的实现
export default { export default {
data() { data() {
return { return {
}; };
}, },
/** /**
* 组件名称,也就是开发者使用的标签 * 组件名称,也就是开发者使用的标签
*/ */
name: "uts-hello-view", name: "uts-hello-view",
/** /**
* 组件涉及的事件声明,只有声明过的事件,才能被正常发送 * 组件涉及的事件声明,只有声明过的事件,才能被正常发送
*/ */
emits: ['buttonclick'], emits: ['buttonclick'],
/** /**
* 属性声明,组件的使用者会传递这些属性值到组件 * 属性声明,组件的使用者会传递这些属性值到组件
*/ */
props: { props: {
/** /**
* 字符串类型 属性:buttontext 需要设置默认值 * 字符串类型 属性:buttontext 需要设置默认值
*/ */
"buttontext": { "buttontext": {
type: String, type: String,
default: "点击触发" default: "点击触发"
} }
}, },
/** /**
* 组件内部变量声明 * 组件内部变量声明
*/ */
/** /**
* 属性变化监听器实现 * 属性变化监听器实现
*/ */
watch: { watch: {
"buttontext": { "buttontext": {
/** /**
* 这里监听属性变化,并进行组件内部更新 * 这里监听属性变化,并进行组件内部更新
*/ */
handler(newValue : String, oldValue : String) { handler(newValue : String, oldValue : String) {
this.$el.setTitle(newValue, for = UIControl.State.normal) this.$el.setTitle(newValue, for = UIControl.State.normal)
}, },
/** /**
* 创建时是否通过此方法更新属性,默认值为false * 创建时是否通过此方法更新属性,默认值为false
*/ */
immediate: false immediate: false
}, },
}, },
/** /**
* 规则:如果没有配置expose,则methods中的方法均对外暴露,如果配置了expose,则以expose的配置为准向外暴露 * 规则:如果没有配置expose,则methods中的方法均对外暴露,如果配置了expose,则以expose的配置为准向外暴露
* ['publicMethod'] 含义为:只有 `publicMethod` 在实例上可用 * ['publicMethod'] 含义为:只有 `publicMethod` 在实例上可用
*/ */
expose: ['doSomething'], expose: ['doSomething'],
methods: { methods: {
/** /**
* 对外公开的组件方法 * 对外公开的组件方法
* 在uni-app中调用组件方法,可以通过指定ref的方式,例如指定uts-button 标签的ref 为 ’button‘, 调用时使用:this.$refs["button"].doSomething('message'); * 在uni-app中调用组件方法,可以通过指定ref的方式,例如指定uts-button 标签的ref 为 ’button‘, 调用时使用:this.$refs["button"].doSomething('message');
*/ */
doSomething(paramA : string) { doSomething(paramA : string) {
// 这是组件的自定义方法 // 这是组件的自定义方法
console.log(paramA, 'this is in uts-button component') console.log(paramA, 'this is in uts-button component')
}, },
/** /**
* 内部使用的组件方法 * 内部使用的组件方法
*/ */
}, },
/** /**
* 组件被创建,组件第一个生命周期, * 组件被创建,组件第一个生命周期,
* 在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑 * 在内存中被占用的时候被调用,开发者可以在这里执行一些需要提前执行的初始化逻辑
* [可选实现] * [可选实现]
*/ */
created() { created() {
}, },
/** /**
* 对应平台的view载体即将被创建,对应前端beforeMount * 对应平台的view载体即将被创建,对应前端beforeMount
* [可选实现] * [可选实现]
*/ */
NVBeforeLoad() { NVBeforeLoad() {
}, },
/** /**
* 创建原生View,必须定义返回值类型 * 创建原生View,必须定义返回值类型
* 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型 * 开发者需要重点实现这个函数,声明原生组件被创建出来的过程,以及最终生成的原生组件类型
* [必须实现] * [必须实现]
*/ */
NVLoad() : UIButton { NVLoad() : UIButton {
//必须实现 //必须实现
buttonClickListsner = new ButtonClickListsner(this) buttonClickListsner = new ButtonClickListsner(this)
let button = new UIButton() let button = new UIButton()
button.setTitle(this.buttontext, for = UIControl.State.normal) button.setTitle(this.buttontext, for = UIControl.State.normal)
// 在 swift target-action 对应的方法需要以OC的方式来调用,那么OC语言中用Selector来表示一个方法的名称(又称方法选择器),创建一个Selector可以使用 Selector("functionName") 的方式。 // 在 swift target-action 对应的方法需要以OC的方式来调用,那么OC语言中用Selector来表示一个方法的名称(又称方法选择器),创建一个Selector可以使用 Selector("functionName") 的方式。
const method = Selector("buttonClickAction") const method = Selector("buttonClickAction")
if (buttonClickListsner != null) { if (buttonClickListsner != null) {
button.addTarget(buttonClickListsner!, action = method, for = UIControl.Event.touchUpInside) button.addTarget(buttonClickListsner!, action = method, for = UIControl.Event.touchUpInside)
} }
return button return button
}, },
/** /**
* 原生View已创建 * 原生View已创建
* [可选实现] * [可选实现]
*/ */
NVLoaded() { NVLoaded() {
/** /**
* 通过 this.$el 来获取原生控件。 * 通过 this.$el 来获取原生控件。
*/ */
this.$el.setTitle(this.buttontext, for = UIControl.State.normal) this.$el.setTitle(this.buttontext, for = UIControl.State.normal)
}, },
/** /**
* 原生View布局完成 * 原生View布局完成
* [可选实现] * [可选实现]
*/ */
NVLayouted() { NVLayouted() {
}, },
/** /**
* 原生View将释放 * 原生View将释放
* [可选实现] * [可选实现]
*/ */
NVBeforeUnload() { }, NVBeforeUnload() { },
/** /**
* 原生View已释放,这里可以做释放View之后的操作 * 原生View已释放,这里可以做释放View之后的操作
* [可选实现] * [可选实现]
*/ */
NVUnloaded() { NVUnloaded() {
}, },
/** /**
* 组件销毁 * 组件销毁
* [可选实现] * [可选实现]
*/ */
unmounted() { } unmounted() { }
/** /**
* 更多组件开发的信息详见:https://uniapp.dcloud.net.cn/plugin/uts-component.html * 更多组件开发的信息详见:https://uniapp.dcloud.net.cn/plugin/uts-component.html
*/ */
} }
/** /**
* 定义按钮点击后触发回调的类 * 定义按钮点击后触发回调的类
* [可选实现] * [可选实现]
*/ */
class ButtonClickListsner { class ButtonClickListsner {
/** /**
* 如果需要在回调类或者代理类中对组件进行操作,比如调用组件方法,发送事件等,需要在该类中持有组件对应的原生类的对象。 * 如果需要在回调类或者代理类中对组件进行操作,比如调用组件方法,发送事件等,需要在该类中持有组件对应的原生类的对象。
* 组件原生类的基类为 UTSComponent,该类是一个泛型类,需要接收一个类型变量,该类型变量就是原生组件的类型。 * 组件原生类的基类为 UTSComponent,该类是一个泛型类,需要接收一个类型变量,该类型变量就是原生组件的类型。
*/ */
private component : UTSComponent<UIButton> private component : UTSComponent<UIButton>
constructor(component : UTSComponent<UIButton>) { constructor(component : UTSComponent<UIButton>) {
this.component = component this.component = component
super.init() super.init()
} }
/** /**
* 按钮点击回调方法 * 按钮点击回调方法
* 在 swift 中,所有target-action (例如按钮的点击事件,NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。 * 在 swift 中,所有target-action (例如按钮的点击事件,NotificationCenter 的通知事件等)对应的 action 函数前面都要使用 @objc 进行标记。
* [可选实现] * [可选实现]
*/ */
@objc buttonClickAction() { @objc buttonClickAction() {
console.log("按钮被点击") console.log("按钮被点击")
// 发送事件 // 发送事件
this.component.__$$emit("buttonclick"); this.component.__$$emit("buttonclick");
} }
} }
/** /**
* 定义回调类或者代理类的实例 * 定义回调类或者代理类的实例
* [可选实现] * [可选实现]
*/ */
let buttonClickListsner : ButtonClickListsner | null = null let buttonClickListsner : ButtonClickListsner | null = null
</script> </script>
<style> <style>
</style> </style>
``` ```
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册