Skip to content

uni-app 基本用法

生命周期

  • onLoad: 监听页面加载,其参数为上个页面传递的数据
  • onShow: 监听页面显示,页面每次出现在屏幕上都触发
  • onReady:监听页面初次渲染完成,此时组件已挂载完成,DOM 树($el)已可用
  • onHide: 监听页面隐藏
  • onUnload: 监听页面卸载
  • onResize: 监听窗口尺寸变化
  • onShareAppMessage: 用户点击右上角分享
  • onBackPress: 监听页面返回

页面加载时序:

  1. 首先根据pages.json的配置,创建页面

  2. 页面template里的组件,创建dom(处理的静态dom),对于通过js/uts更新data然后通过v-for再创建的列表数据,不在第一批处理。

  3. 触发onLoad,此时页面还未显示,所以这里不能直接操作dom,可以在这时候处理上页的参数,联网取数据,更新data。

    uni.request或云开发联网,在子线程运行,不会干扰UI线程,并行处理可以更快的拿到数据、渲染界面。

  4. 新页面开始进入的转场动画,动画默认耗时300ms。

  5. UI层才能完成了页面上真实元素的创建,即触发了onReady,首批界面也渲染了。

    如果元素排版和渲染过慢,转场动画结束都没有内容,就会造成白屏。

    注意:onReady和转场动画开始、结束之间,没有必然的先后顺序,完全取决于dom的数量和复杂度。

  6. 转场动画结束。


注意问题:

  • 联网不要在onReady里,那样太慢了,在onLoad里早点联网。
  • 页面dom太多会拖累整体页面。
  • 在pages.json里配置原生导航栏和背景色。

常用API接口

getApp()

getApp() 函数用于获取当前应用实例,一般用于获取globalData。

js
const app = getApp()
console.log(app.globalData)
app.doSomething() // 调用 App.vue methods 中的 doSomething 方法
const app = getApp()
console.log(app.globalData)
app.doSomething() // 调用 App.vue methods 中的 doSomething 方法

可以通过 this.$scope 获取对应的app实例。

$getAppWebview()

可以得到当前webview的对象实例,从而实现对 webview 更强大的控制。注意:此方法仅 App 支持

uni.$on(eventName,callback)

监听全局的自定义事件。

uni.$emit(eventName,OBJECT)

触发全局的自定义事件。附加参数都会传给监听器回调。

uni.$once(eventName,callback)

监听全局的自定义事件。只触发一次,在第一次触发之后移除监听器。

uni.$off([eventName, callback])

移除全局自定义事件监听器。


路由

框架以栈的形式管理当前所有页面, 当发生路由切换的时候,页面栈的表现如下:

路由方式页面栈表现触发时机
初始化新页面入栈uni-app 打开的第一个页面
打开新页面新页面入栈调用 API uni.navigateTo 、使用组件
页面重定向当前页面出栈,新页面入栈调用 API uni.redirectTo 、使用组件
页面返回页面不断出栈,直到目标返回页调用 API uni.navigateBack 、使用组件 、用户按左上角返回按钮、安卓用户点击物理back按键
Tab 切换页面全部出栈,只留下新的 Tab 页面调用 API uni.switchTab 、使用组件 、用户切换 Tab
重加载页面全部出栈,只留下新的页面调用 API uni.reLaunch 、使用组件

页面关闭时,只是销毁了页面实例,未完成的网络请求、计时器等副作用需开发者自行处理。

条件编译

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。

  • #ifdef:if defined 仅在某平台存在
  • #ifndef:if not defined 除了某平台均存在
  • %PLATFORM%:平台名称
条件编译写法说明
#ifdef APP-PLUS 需条件编译的代码 #endif仅出现在 App 平台下的代码
#ifndef H5 需条件编译的代码 #endif除了 H5 平台,其它平台均存在的代码(注意if后面有个n)
#ifdef H5 || MP-WEIXIN 需条件编译的代码 #endif在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)

具体平台类型,查看这里


组件

基础组件

视图容器(View Container):

组件名说明
view视图容器,类似于HTML中的div
scroll-view可滚动视图容器
swiper滑块视图容器,比如用于轮播banner
match-media屏幕动态适配组件,比如窄屏上不显示某些内容
movable-area可拖动区域
movable-view可移动的视图容器,在页面中可以拖拽滑动或双指缩放。movable-view必须在movable-area组件中
cover-view可覆盖在原生组件的上的文本组件
cover-image可覆盖在原生组件的上的图片组件

基础内容(Basic Content):

组件名说明
icon图标
text文字
rich-text富文本显示组件
progress进度条

表单组件(Form):

标签名说明
button按钮
checkbox多项选择器
editor富文本输入框
form表单
input输入框
label标签
picker弹出式列表选择器
picker-view窗体内嵌式列表选择器
radio单项选择器
slider滑动选择器
switch开关选择器
textarea多行文本输入框

媒体组件(Media):

组件名说明
audio音频
camera相机
image图片
video视频
live-player直播播放
live-pusher实时音视频录制,也称直播推流

扩展组件

插件市场里可以获取,把这个uni-rate组件导入到你的uni-app项目下。

easycom组件

只要组件安装在项目的components目录下或uni_modules目录下,并符合components/组件名称/组件名称.(vue|uvue)目录结构。可以不用引用、注册,直接在页面中使用。

如果你的组件名称或路径不符合easycom的默认规范,可以在pages.jsoneasycom节点进行个性化设置。

json
{
    "easycom": {
		"autoscan": true,
		"custom": {
			"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
		}
	},
}
{
    "easycom": {
		"autoscan": true,
		"custom": {
			"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
		}
	},
}

注意

页面级的代码大多写在export default {}中。写在里面的代码,会随着页面关闭而关闭。

谨慎编写export default {}外面的代码:

  1. 在应用启动时执行。也就是这里的代码执行时机是应用启动、而不是页面加载。如果这里的代码写的太复杂,会影响应用启动速度和内存占用。
  2. 不跟随页面关闭而回收。在外层的静态变量不会跟随页面关闭而回收。

Released under the MIT License.