1.uni-app介绍
1.1 诞生背景
1.1.1 多端泛滥
1.1.2 体验不好
1.1.3 生态不够丰富
1.2 uni-app 是什么?
一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。
2.uni-app的生命周期
uni-app的生命周期函数
函数名
说明
onLaunch
当uni-app 初始化完成时触发(全局只触发一次)
onShow
当 uni-app 启动,或从后台进入前台显示
onHide
当 uni-app 从前台进入后台
onError
当 uni-app 报错时触发
onUniNViewMessage
对 nvue 页面发送的数据进行监听,可参考 nvue 向 vue 通讯
onUnhandledRejection
对未处理的 Promise 拒绝事件监听函数(2.8.1+)
onPageNotFound
页面不存在监听函数
onThemeChange
监听系统主题变化
uni-app页面的生命周期函数:
函数名
说明
onInit
监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad
onLoad
监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考示例
onShow
监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady
监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
onHide
监听页面隐藏
onUnload
监听页面卸载
onResize
监听窗口尺寸变化
onPullDownRefresh
监听用户下拉动作,一般用于下拉刷新,参考示例
onReachBottom
页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项
onTabItemTap
点击 tab 时触发,参数为Object,具体见下方注意事项
onShareAppMessage
用户点击右上角分享
onPageScroll
监听页面滚动,参数为Object
onNavigationBarButtonTap
监听原生标题栏按钮点击事件,参数为Object
onBackPress
监听页面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack表示来源是 uni.navigateBack ;详细说明及使用:onBackPress 详解。支付宝小程序只有真机能触发,只能监听非navigateBack引起的返回,不可阻止默认行为。
onNavigationBarSearchInputChanged
监听原生标题栏搜索输入框输入内容变化事件
onNavigationBarSearchInputConfirmed
监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发。
onNavigationBarSearchInputClicked
监听原生标题栏搜索输入框点击事件
onShareTimeline
监听用户点击右上角转发到朋友圈
onAddToFavorites
监听用户点击右上角收藏
uni-app组件的生命周期:与vue标准组件的生命周期相同
函数名
说明
beforeCreate
在实例初始化之后被调用。详见
created
在实例创建完成后被立即调用。详见
beforeMount
在挂载开始之前被调用。详见
mounted
挂载到实例上去之后调用。详见 注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTickVue官方文档
beforeUpdate
数据更新时调用,发生在虚拟 DOM 打补丁之前。详见
updated
由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。详见
beforeDestroy
实例销毁之前调用。在这一步,实例仍然完全可用。详见
destroyed
Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。详见
3.组件间的通讯
父子组件传值与vue中一致,此处不再赘述
3.1 事件总线
事件总线可以作为组件沟通的桥梁,就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件,但也就是太方便所以若使用不慎,就会造成难以维护的灾难,因此才需要更完善的Vuex作为状态管理中心,将通知的概念上升到共享状态层次。
事件总线的优缺点:
1.优点:uni支持事件总线,直接使用api就可以,非常灵活
2.缺点:代码不容易维护
3.2 触发事件 uni.$emit(eventName,OBJECT) //一般在methods中
3.3 监听事件 uni.$on(eventName,callback) //一般在created中
//代码示例
uni.$on('update',function(data){
console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
})
3.4 只监听一次 uni.$once(eventName,callback)
监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。
//代码示例
uni.$once('update',function(data){
console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
})
3.5 移除监听 uni.$off(eventName,callback) //一般在beforeDestory中
一般用在beforeDestory的声明周期中
注意事项
- 如果没有提供参数,则移除所有的事件监听器;
- 如果只提供了事件,则移除该事件所有的监听器;
- 如果同时提供了事件与回调,则只移除这个回调的监听器;
提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器;
4.条件注释的跨端兼容
4.1 写法
以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。
- #ifdef:if defined 仅在某平台存在
- #ifndef:if not defined 除了某平台均存在
- %PLATFORM%:平台名称
条件编译写法
说明
#ifdef APP-PLUS
需条件编译的代码
#endif仅出现在 App 平台下的代码
#ifndef H5
需条件编译的代码
#endif除了 H5 平台,其它平台均存在的代码
#ifdef H5 || MP-WEIXIN
需条件编译的代码
#endif在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)
4.2 %PLATFORM% 可取值如下:
值
平台
APP-PLUS
App
APP-PLUS-NVUE或APP-NVUE
App nvue
H5
H5
MP-WEIXIN
微信小程序
MP-ALIPAY
支付宝小程序
MP-BAIDU
百度小程序
MP-TOUTIAO
字节跳动小程序
MP-QQ
QQ小程序
MP-360
360小程序
MP
微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序
QUICKAPP-WEBVIEW
快应用通用(包含联盟、华为)
QUICKAPP-WEBVIEW-UNION
快应用联盟
QUICKAPP-WEBVIEW-HUAWEI
快应用华为
4.3 组件的条件注释
//代码示例:仅在微信中出现
<view>
<!-- uni-app未封装,但可直接使用微信原生的official-account组件-->
<!-- #ifdef MP-WEIXIN -->
<view>微信公众号关注组件</view>
<official-account></official-account>
<!-- #endif -->
</view>
//以下代码不会在H5平台出现
// #ifndef H5
console.log("123")
uni.scanCode({
success() {
console.log("123")
}
})
// #endif
5.导航跳转
5.1 利用navagator跳转(类似html中的a标签)
- 如果想实现web外链跳转,可参考uLink组件
属性名
类型
默认值
说明
平台差异说明
url
String
应用内的跳转链接,值为相对路径或绝对路径,如:"../first/first","/pages/first/first",注意不能加 .vue 后缀
open-type
String
navigate
跳转方式
delta
Number
当 open-type 为 'navigateBack' 时有效,表示回退的层数
animation-type
String
pop-in/out
当 open-type 为 navigate、navigateBack 时有效,窗口的显示/关闭动画效果,详见:窗口动画
App
animation-duration
Number
300
当 open-type 为 navigate、navigateBack 时有效,窗口显示/关闭动画的持续时间。
App
hover-class
String
navigator-hover
指定点击时的样式类,当hover-class="none"时,没有点击态效果
hover-stop-propagation
Boolean
false
指定是否阻止本节点的祖先节点出现点击态
微信小程序
hover-start-time
Number
50
按住后多久出现点击态,单位毫秒
hover-stay-time
Number
600
手指松开后点击态保留时间,单位毫秒
target
String
self
在哪个小程序目标上发生跳转,默认当前小程序,值域self/miniProgram
微信2.0.7+、百度2.5.2+、QQ
5.2 open-type有效值
值
说明
平台差异说明
navigate
对应 uni.navigateTo 的功能
redirect
对应 uni.redirectTo 的功能
switchTab
对应 uni.switchTab 的功能
reLaunch
对应 uni.reLaunch 的功能
字节跳动小程序不支持
navigateBack
对应 uni.navigateBack 的功能
exit
退出小程序,target="miniProgram"时生效
微信2.1.0+、百度2.5.2+、QQ1.4.7+
5.3 编程式跳转(和微信小程序类似)
uni.navigateTo:跳转到指定界面。
uni. redirectTo:关闭当前页面,跳转到应用内的某个页面。
uni.reLaunch:关闭所有界面打卡应用内的某个界面。
uni.switchTab:切换到tabbar界面。
uni.navigateBack:返回到指定界面。
5.4 跳转传参(和微信小程序类似)
路由跳转的时候可以通过?拼接参数。
<navigator url="../message/message?id=99">界面跳转传参</navigator>
获取路由参数,在界面的onLoad方法中获取
onLoad(options) {
console.log(options)
},