目录结构
page 业务页面文件存放的目录static 存放静态资源unpackage 存放编译后的文件App.vue 可以进行全局配置main.js vue初始化入库文件manifest.json 配置应用名称、appid、logo、版本等打包信息pages.json 配置页面路由 导航条 选项卡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
getApp() 函数用于获取当前应用实例,一般用于获取globalDataconst app = getApp()console.log(app.globalData)
getCurrentPages
getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。getCurrentPages()[length-1].route 获取当前页面的路由
页面通信
uni.$emit
触发全局的自定事件。附加参数都会传给监听器回调
uni.$emit('update',{msg:'页面更新'})
uni.$on
监听全局的自定义事件。事件可以由 uni.$emit 触发
uni.$on('update',function(data){console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);})
uni.$once
监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。
uni.$once('update',function(data){console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);})
uni.off
移除全局自定义事件监听器。
uni.$off('update',function(data){console.log('移除update ,携带参数 msg 为:' + data.msg);})
原生子窗体—仅支持APP
在我们的开发中,经常会遇到各种层级覆盖和原生界面自定义的问题:
- 覆盖原生导航栏、
tabbar的弹出层组件。比如侧滑菜单盖不住地图、视频、原生导航栏,比如popup盖不住tabbar。 - 弹出层内部元素可滚动,
- 在地图、视频等组件上的添加复杂覆盖组件:比如直播视频上覆盖滚动的聊天记录。
**subNVue** 页面可以和 vue 页面进行通信,来告知 vue 页面用户执行的操作。或者通过 vue 页面对 subNVue 进行数据和状态的更新。 subNVue 除了与 vue 页面进行通信,还 可以与 nvue 页面进行通信。
如果一些简单的需求,如果 cover-view 已经能搞定,那也没必要使用subNVue
实现
创建一个xxx.nvue文件
//在pages.json中在要显得页面下配置{"pages": [{"path": "pages/index/index", //首页"style": {"app-plus": {"subNVues":[{"id": "concat", // 唯一标识"path": "pages/index/subnvue/concat", // 页面路径/*"type": "popup", 配置这个是弹出层不配置是文字*/"style": {"position": "absolute","dock": "right","width": "100upx","height": "150upx","background": "transparent"}}]}}}]}
// 通过 id 获取 nvue 子窗体const subNVue = uni.getSubNVueById('map_widget')// 打开 nvue 子窗体subNVue.show('slide-in-left', 300, function(){// 打开后进行一些操作...//});// 关闭 nvue 子窗体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 | 快应用华为 |
支持的文件
