基本页面
基本语言 | 支持原生渲染的nvue 可以编译为kotlin(Android)和swift(ios)的uts | |
开发规范 |
| |
编译器和运行时(runtime) | 实现一套代码,多端运行 编译的输出物由各个终端的runtime进行解析。每个平台有自己的runtime | 小程序:小程序版vue runtime web端:比普通vue项目,多了一套ui库、页面路由框架、uni对象 app端:DCloud也有一套小程序引擎,打包app时将代码和DCloud小程序打包成apk或ipa |
uni-app runtime | 一、基础框架 数据驱动、全局文件、应用管理、页面管理、js引擎、渲染和排版引擎 web和小程序,不需要uni-app提供js引擎和排版引擎;app需要 App的js引擎:andriod是v8;iOS是jscore App的渲染引擎:.vue由webview渲染,与小程序类似;.nvue由原生渲染 二、组件 只有基础组件 小程序端,基础组件直接转义为小程序内置组件,在小程序的runtime不占体积 web、android、ios,这几十个组件都在uni-app的runtime中,占用一定体积,相当于内置了一套ui库 组件扩展: 官方库uni ui基于这些基础组件封装的 web,可使用其他ui库(如element-ui),由于操作了DOM,无法在app和小程序中使用 App,支持使用原生编程语言来扩展原生组件,地图、ar 支持将微信自定义组件运行到微信小程序、web、app 三、API 内置了大量常见的、跨端的API,如uni.request、uni.getStorage ext API:不常用API不在runtime,虽然uni开头,需要下载插件 APP:除了uni,还可以使用plus.的API、Native.js,以及通过uts编写原生插件,或java、objectC编写原生插件(调用os的API封装给js使用) | DCloud在开发app时有:5+App、wap2app、uni-app等3种模式,runtime在底层能力上是公用,所有uni-app可调用5+(plus.xxx)的API。uni-app的逻辑层运行在js层,渲染层是webview和原生nvue双选。而5+不区分逻辑层和渲染层,全部运行在webview,在性能上5+不及uni-app 逻辑层和渲染层分离(小程序、App) 基于webview的app性能不佳,因为js和界面渲染抢资源 逻辑层:单独的js引擎 小程序、app逻辑层不支持BOM、DOM App只能在渲染层操作window、dom,即renderjs |
目录结构 | uniCloud: 云空间目录 components utssdk: 存放uts文件 uni_modules 存放[uni_module](/uni_modules) platforms 存放各平台专用页面的目录 nativeplugins App原生语言插件 nativeResources App端原生资源目录(android、ios) hybrid App端存放本地html文件的目录 wxcomponents 存放小程序组件的目录 unpackage 非工程代码,一般存放运行或发行的编译结果 AndroidManifest.xml Android原生应用清单文件 Info.plist iOS原生应用配置文件 manifest.json 配置应用名称、appid、logo、版本等打包信息 pages.json 未配置的编译时忽略 App.vue main.js uni.scss | static:会直接复制到最终打包目录,不会打包编译 非static文件,引用时才会打包编译 css、less、scss放在自建的common目录 |
页面生命周期 | onInit 参数为上个页面传递数据,触发早于onLoad(百度小程序) onLoad 监听页面加载,响应式数据、computed、watch、props、slots已设置完成;参数为上个页面传递 onShow 监听页面显示,页面每次出现在屏幕上都触发 onReady 监听页面初次渲染完成,组件已挂载完成,$el可用,渲染速度够快的话,会在页面进入动画完成前触发 onHide onUnload onResize 监听窗口尺寸变化 onPullDownRefresh 监听用户下拉动作 onReachBottom 页面滚动到底部时间 onTabItemTap 点击tab时触发 onShareAppMessage 点击右上角分享 onPageScroll onNavigationBarButtonTap 原生标题栏按钮点击事件(返回原生标题栏按钮数组的下标) onBackPress:uni.navigateBack() onNavigationBarSearchInputChanged 监听原生标题栏搜索输入框输入内容变化事件 onNavigationBarSearchInputConfirmed点击软键盘“搜索”按钮时触发 onNavigationBarSearchInputClicked 监听原生标题栏搜索输入框点击事件(page.json中searchInput配置disabled为true时触发) onShareTimeline 微信小程序右上角转发到朋友圈 onAddToFavorites 小程序监听右上角收藏 | onReachBottom:可在page.json定义底部触发距离onReachBottomDistance,距离底部为该距离时触发onReachBottom 如使用scroll-view导致页面没有滚动,触底事件不会触发 onPageScroll scrollTop:垂直方向已滚动距离 渲染层触发,js在逻辑层执行,通信有损耗,不要写复杂js App、H5实现滚动时标题栏透明渐变:pages.json中配置titleNView的types为transparent 滚动吸顶有插件 App、微信小程序、H5,可以使用wxs监听滚动 app-nvue,可以使用bindings监听滚动 onBackPress:不可使用async,会导致无法阻止默认返回 onTabItemTap:切换、滚动或刷新当前页面 如果想在App端实现点击某个tabitem不跳转页面,不能使用onTabItemTap,可使用plus.nativeObj.view放在一个区块盖住原来的tabitem |
页面调用接口 | getApp() 获取当前应用实例 可以通过this.$scope获取对应app实例 getCurrentPages() 获取当前页面栈的实例,数组,第一个元素为首页,最后一个元素为当前页面 page.$getAppWebview() 获取当前页面的webview对象实例;如需要可使用原生子窗体subNvue覆盖 page.route 获取当前页面的路由 | const app = getApp() app.globalData navigateTo,redirectTo只能打开非tabBar页面 switchTab 只能打开tabBar页面 reLaunch 可以打开任意页面 只要定义是tabBar的页面,底部都有tabBar |
export default { data() { return { title: 'Hello' } }, onLoad() { // #ifdef APP-PLUS const currentWebview = this.$scope.$getAppWebview(); //此对象相当于html5plus里的plus.webview.currentWebview()。在uni-app里vue页面直接使用plus.webview.currentWebview()无效 currentWebview.setBounce({position:{top:'100px'},changeoffset:{top:'0px'}}); //动态重设bounce效果 // #endif }} | var pages = getCurrentPages();var page = pages[pages.length - 1];// #ifdef APP-PLUSvar currentWebview = page.$getAppWebview();console.log(currentWebview.id);//获得当前webview的idconsole.log(currentWebview.isVisible());//查询当前webview是否可见); | |
页面通讯 | uni.$emit(evnetName, {触发事件携带参数}) uni.$on(enventName, callback) uni.$once(eventName, callback) 触发一次后移除 uni.$off([enventName, callback]) | 都是App全局级别,跨任意组件、页面、nvue、vue 注意移除,如onUnload |
路由 | uni.navigateTo 新页面入栈 uni.redirectTo 当前页面出栈,新页面入栈 uni.navigateBack 页面不断出栈,直到目标返回页 uni.switchTab 页面全部出栈,只留下新的Tab uni.reLaunch 页面全部出栈,只留下新的页面 | |
列表渲染 条件渲染 | template、block:包装元素,不做热河渲染 | <template v-if="test"> <view>test 为 true 时显示</view></template><template v-else> <view>test 为 false 时显示</view></template><block v-for="(item,index) in list" :key="index"> <view>{{item}} - {{index}}</view></block> |
nvue开发与vue开发常见区别 |
| |
easycom | 只管使用组件,无需导入和注册 只需安装在uni_modules的components目录下,components/组件名称/组件名称.vue 或 uni_modules/插件ID/components/组件名称/组件名称.vue 打包后自动剔除未使用组件 | pages.json的easycom设置,如关闭自动扫描,或自定义扫描组件的策略 |
js语法 | 标准ECMAScript+扩展了uni,其他平台的扩展:小程序扩展了wx、my、swan;浏览器扩展了window、document、naivgator | |
css语法 | px rpx | |
uts | 不支持ts中的联合类型 Kotlin 特有的数字类型
Swift 特有的数字类型
| 全程uni type script,是一门跨平台、高性能、强类型语言 web,被编译成js Android,编译为Kotlin iOS,编译为Swift 采用了与ts基本一致的语法规范,支持绝大多数ES6 |
编译器 | cli方法 HBuilderX创建的项目,编译器在HBuilderX的安装目录下的plugin目录,随着HBuilderX的升级会自动升级编译器 cli创建的项目,想在HBuilderX中使用,把工程拖入HBuilderX,走的是项目下的编译器 如果把src拖入HBuilderX,则走的是HBuilderX安装目录下得plugin的编译器 | 条件编译 #ifdef APP-Plus || MP-WEIXIN #endif #ifndef H5 #endif js:// css:/**/ vue/nvue: APP-PLUS:APP-NVUE(APP-PLUS-NVUE)、APP-VUE static:根据目录条件编译 |
环境变量 | 一、vue.config.js 修改webpack配置 二、package.json package.json文件的env节点下配置 三、.env cli创建的项目可在根目录放置.env | |
编译器配置 | manifest.json:配置vue版本。发行H5平台的路由 vue.config.js: webpack配置 vite.config.js:修改vite配置 package.json .env | |
uni_modules | uni-app的插件模块化规范,通常是对一组js sdk、组件、页面、uniCloud云函数、公共模块等的封装 安装最新版本,不嵌套 使用HBuilderX3.1.0直接导入,右键发布、安装、升级 区别于node_modules: 1、node_modules不满足云端一体的需求。uniCloud云函数、公共模块、schema和前端js_sdk、组件、页面、项目,无法在node_modules有效融合 2、付费插件,DCloud有版权保护 3、HBuilderX提供版本对比 4、uni_modules支持放置node_modules |
App专题
nvue介绍 | App端内置了一个基于weex改进的原生渲染引擎 提供丰富的插件生态、云打包 修复的bug:
| 1、nvue长滚动没有性能问题,需要使用list、recycle-list、waterfall组件,性能优于vue的scroll-view 2、复杂高性能的自定义下拉刷新refresh 3、左右拖动的长列表 4、swiper-list 5、软键盘右下角按钮文字为“发送” 6、解决前端控件无法覆盖原生控件的层级问题,subnvue 7、深度map组件 8、深度使用video:video内嵌到swiper中;全屏后,通过cover-view实现内容覆盖,比如增加文字标题、分享按钮 9、直播推流:nvue下有live-pusher 10、App启动速度,manifest配置fast模式,可以控制1秒内 不及vue 1、canvas 2、动态横竖屏 |
weex编译模式 uni-app编译模式 | { "app-plus": { "renderer": "native" //App端纯原生渲染,vue文件被忽略 "nvueCompiler": "weex"/"uni-app"编译模式,HBuilderX2.4之前默认weex,之后为uni-app模式 } } weex编译模式: 不支持onNavigationBarButtonTap,原生监听uni.onNavigationBarButtonTap 不支持onShow,可监听addEventListener('show')达到相同效果 不支持vuex 页面跳转遵循uni-app模式 原生开发没有页面滚动概念,只有放在list、waterfall、scroll-view/scroller才可以滚动,uni-app会给nvue页面外层嵌套一个scroller -页面有recycle-list,不会给页面嵌套scroller -不希望嵌套scoller,可在pages.json中关闭 { "page": "", "style": { "disableScroll": true } } | weex编译模式 uni-app编译模式 仅app 所有端 weex组件,如div uni-app组件如view 只支持weex生命周期 支持所有uni-app生命周期 weex API、uni API、Plus API weex API、uni API、Plus API 750px,wx是固定像素单位 750rpx是屏幕宽度,px是固定像素单位 全局样式手动引入 可在app.vue中定义 必须给页面套组件 默认支持页面滚动 |
nvue页面 | vue和nvue都需要在pages.json中注册,同名的话,App端nvue优先,非app端vue优先 render-whole 视图层将组件及其子组件的信息结构一次性与原生层通讯,通过整个节点的重绘提升了排版渲染性能 为false时,视图层将以子节点一个接一个和原生层通讯,渲染时间更久 默认启用render-whole为true的组件列表: text cell header cell-slot recycle-list | |