目录结构

  1. page 业务页面文件存放的目录
  2. static 存放静态资源
  3. unpackage 存放编译后的文件
  4. App.vue 可以进行全局配置
  5. main.js vue初始化入库文件
  6. manifest.json 配置应用名称、appidlogo、版本等打包信息
  7. pages.json 配置页面路由 导航条 选项卡
  8. uni.scss 基础样式规定

尺寸单位

uni-app 支持的通用 css 单位包括 px、rpx

  • px 即屏幕像素
  • rpx 即响应式px,一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准,750rpx恰好为屏幕宽度。屏幕变宽,rpx 实际显示效果会等比放大,但在 App 端和 H5 端屏幕宽度达到 960px 时,默认将按照 375px 的屏幕宽度进行计算

    生命周期

    应用生命周期

onLaunch uni-app
初始化完成时触发(全局只触发一次)
onShow uni-app
启动,或从后台进入前台显示
onHide uni-app
从前台进入后台
onError uni-app
报错时触发
onUniNViewMessage nvue
页面发送的数据进行监听

页面生命周期

onInit 监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad
onLoad 监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考示例
onShow 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady 监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
onHide 监听页面隐藏
onUnload 监听页面卸载

组件声明周期

beforeCreate 在实例初始化之后被调用。
created 在实例创建完成后被立即调用。
beforeMount 在挂载开始之前被调用。
mounted 挂载到实例上去之后调用。 注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTick
beforeDestroy 实例销毁之前调用。在这一步,实例仍然完全可用。
destroyed Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

页面

getApp

  1. getApp() 函数用于获取当前应用实例,一般用于获取globalData
  2. const app = getApp()
  3. console.log(app.globalData)

getCurrentPages

  1. getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
  2. getCurrentPages()[length-1].route 获取当前页面的路由

页面通信

uni.$emit

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

  1. uni.$emit('update',{msg:'页面更新'})

uni.$on

监听全局的自定义事件。事件可以由 uni.$emit 触发

  1. uni.$on('update',function(data){
  2. console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
  3. })

uni.$once

监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。

  1. uni.$once('update',function(data){
  2. console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
  3. })

uni.off

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

  1. uni.$off('update',function(data){
  2. console.log('移除update ,携带参数 msg 为:' + data.msg);
  3. })


原生子窗体—仅支持APP

在我们的开发中,经常会遇到各种层级覆盖和原生界面自定义的问题:

  • 覆盖原生导航栏、tabbar 的弹出层组件。比如侧滑菜单盖不住地图、视频、原生导航栏,比如 popup盖不住tabbar
  • 弹出层内部元素可滚动,
  • 在地图、视频等组件上的添加复杂覆盖组件:比如直播视频上覆盖滚动的聊天记录。

**subNVue** 页面可以和 vue 页面进行通信,来告知 vue 页面用户执行的操作。或者通过 vue 页面对 subNVue 进行数据和状态的更新。 subNVue 除了与 vue 页面进行通信,还 可以与 nvue 页面进行通信。
如果一些简单的需求,如果 cover-view 已经能搞定,那也没必要使用subNVue

实现

  1. 创建一个xxx.nvue文件
  1. //在pages.json中在要显得页面下配置
  2. {
  3. "pages": [{
  4. "path": "pages/index/index", //首页
  5. "style": {
  6. "app-plus": {
  7. "subNVues":[{
  8. "id": "concat", // 唯一标识
  9. "path": "pages/index/subnvue/concat", // 页面路径
  10. /*"type": "popup", 配置这个是弹出层不配置是文字*/
  11. "style": {
  12. "position": "absolute",
  13. "dock": "right",
  14. "width": "100upx",
  15. "height": "150upx",
  16. "background": "transparent"
  17. }
  18. }]
  19. }
  20. }
  21. }]
  22. }
  1. // 通过 id 获取 nvue 子窗体
  2. const subNVue = uni.getSubNVueById('map_widget')
  3. // 打开 nvue 子窗体
  4. subNVue.show('slide-in-left', 300, function(){
  5. // 打开后进行一些操作...
  6. //
  7. });
  8. // 关闭 nvue 子窗体
  9. subNVue.hide('fade-out', 300)

跨端兼容

以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。

ifdef:if defined 仅在某平台存在

ifndef:if not defined 除了某平台均存在

%PLATFORM%:平台名称 条件编译是利用注释实现的,在不同语法里注释写法不一样,js使用 // 注释、css 使用 /* 注释 */、vue/nvue 模板里使用 <!-- 注释 -->

条件编译写法 说明
#ifdef APP-PLUS
需条件编译的代码
#endif
仅出现在 App 平台下的代码
#ifndef H5
需条件编译的代码
#endif
除了 H5 平台,其它平台均存在的代码
#ifdef H5 || MP-WEIXIN
需条件编译的代码
#endif
在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)

%PLATFORM% 可取值如下:

生效条件
VUE3 HBuilderX 3.2.0+ 详情
APP-PLUS App
APP-PLUS-NVUE或APP-NVUE App nvue
H5 H5
MP-WEIXIN 微信小程序
MP-ALIPAY 支付宝小程序
MP-BAIDU 百度小程序
MP-TOUTIAO 字节跳动小程序
MP-QQ QQ小程序
MP-KUAISHOU 快手小程序
MP-360 360小程序
MP 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序
QUICKAPP-WEBVIEW 快应用通用(包含联盟、华为)
QUICKAPP-WEBVIEW-UNION 快应用联盟
QUICKAPP-WEBVIEW-HUAWEI 快应用华为

支持的文件

  • .vue
  • .js
  • .css
  • pages.json
  • 各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug

    基本指令和VUE基本指令相同,组件中传递也相同

组件使用查看官网

API使用查看官网