# API概述

uni-app x项目的uts代码中可以使用很多API。包括:

  1. uts的api,包括内置对象,以及平台专有对象UTSAndroidUTSiOS
  2. 全局api,前面不需要加uni.。如getApp
  3. uni.xxx的内置api。见左侧
  4. uniCloud.xxx的内置api 详见
  5. dom的api 详见
  6. vue的api 详见
  7. 平台原生api
    • Android 所有原生API
    • iOS 所有原生API
    • harmony 所有原生API
    • Web浏览器所有API
    • 小程序所有API

uni-app x中,不会限制任何平台原来的API无法调用。常用的跨平台API,都已经封装在uni的API中,但所有的平台API均可以在uni-app x中调用。

# os原生api的使用

由于uts可以直接调用Android、iOS、鸿蒙的api,所以os和三方sdk的能力都可以在uts中调用。如下是一个Android的例子:

<script>
	import Build from 'android.os.Build';
	export default {
		onLoad() {
			console.log(Build.MODEL); //调用原生对象,返回手机型号
			console.log(uni.getSystemInfoSync().deviceModel); //调用uni API,返回手机型号。与上一行返回值相同
		}
	}
</script>

上面的示例,在页面启动时打印了2行日志,显示手机型号。

  • uni.getSystemInfoSync,是uni的api
  • import的Build,是Android os的api

可以看出,在uni-app x里,可以直接调用os的能力,不受限制,语法是uts的语法,但需要了解什么功能在原生里是哪个api。

使用uni.getSystemInfoSync则比较简单,看uni的文档即可,且可跨平台。

其实,uni.getSystemInfoSync 的内部实现就是一个uts模块,底层使用了一样的代码,也是import了android.os.Build。

大多数uni.的api,都是uts开发的,它们开源在uni-api

插件市场也有很多做好的uts插件,方便开发者拿来即用。uts插件

虽然上述页面可以直接调用原生Android能力,但正规开发时,原生能力应封装为uni_modules形式的uts插件。这样方便共享、方便跨平台。(iOS在js驱动模式时,uvue页面中不支持调用swift API,需封装为uts插件调用原生API)

uni-app x 中不再支持plus和weex的API。过去plus api中一些常用的api,一部分在uni-app x中进行了替换增补、一部分提供了uts操作原生的示例代码。详见

网上可以找到很多kotlin调用系统api的代码,但如何使用uts来调用这些系统api?

以上面的获取手机型号的代码为例:

  1. 打开一个靠谱的ai,询问:"kotlin中获取手机型号的代码,需包含导入的类",得到如下代码:
import android.os.Build

fun getDeviceModel(): String {
    return Build.MODEL
}
  1. 再问ai:"把上述代码转为ts代码"
function getDeviceModel(): string {
  return Build.MODEL;
}

这里注意几个差别:

  • kotlin中import包,是import android.os.Build,而uts是import Build from 'android.os.Build'。import后面需要跟名字,from后面需要引号括起来。
  • import包,需要在uvue页面的export default外。复杂的原生插件应该直接创建uts插件,放在单独的uni_modules中。
  • kotlin定义一个函数是fun,而uts是function
  • kotlin中定义一个常量是val,而uts是const;kotlin的变量定义是var,而uts推荐使用let。

更复杂的例子可以参考

# promise

uni的异步api,均支持callback,但只有部分支持promise。对于支持promise的API,在API文档的返回值描述中会包含Promise

# 生命周期

生命周期是一种特殊事件,对于应用、页面、组件,uni-app x提供了一批对应的生命周期,比如应用的onLaunch、页面的onLoad、组件的created。

除了生命周期,uni还提供了一批其他on/off事件监听API,比如uni.onPushMessage()、uni.offPushMessage()。这些不属于生命周期。

# uni对象的API与页面的关系

uni.xxx 的API,运行在全局逻辑层,并不和页面绑定。尤其注意的是不与代码所在页面文件绑定。

但uni.开头的api,有不少在逻辑上要访问或操作页面。

此时,这些API并无法访问代码所在的页面,而是访问页面栈栈顶(不包括 dialogPage)。

举个例子,

uni.getElementById("abc"),是从栈顶页面中寻找这个id为"abc"的元素。并不是从这行代码所在的uvue文件中获取页面。

日常可以使用,但有一些边界情况需要注意:

  1. 在新页面onShow触发之前,就调用uni.getElementById("abc"),由于新页面还没有显示,此时逻辑层的uni api找到的栈顶页面就是上一个页面,那么就会去上一个页面中寻找"abc"元素。
  2. 在定时器中调用uni.getElementById("abc"),后续又打开了新页面,但老页面的定时器还在运行,由于uni的api一直在找栈顶页面,在新页面onShow后,定时器仍在运行,就会开始从新页面找"abc"元素

从严谨的角度来说,与页面有关的API应该挂在UniPage对象上,页面上也有getElementById方法。

  • 选项式获取页面并使用getElementById:this.$page.getElementById("abc")
  • 组合式获取页面并使用getElementById:getCurrentInstance()?.proxy?.$page.getElementById("abc")

详见UniPage对象的getElementById方法

但小程序没有UniPage,只提供了一批全局API,使用如下API时均需注意栈顶页面问题。

  • uni.getElementById
  • uni.setNavigationBarColor
  • uni.setNavigationBarTitle
  • uni.showNavigationBarLoading
  • uni.hideNavigationBarLoading
  • uni.startPullDownRefresh
  • uni.stopPullDownRefresh
  • uni.pageScrollTo

还有很多API通过第二个参数可以指定所需要的页面,不传第二个参数时默认也是从栈顶页面找。 uni.createVideoContext(videoId, component?)