开发工具
项目创建
步骤1:打开 HBuilder-x
步骤2:文件 -> 新建 -> 项目 -> uni-app项目
除了HBuilderX可视化界面,也可以使用 cli 脚手架,可以通过 vue-cli 创建 uni-app 项目。
目录结构 / 分包结构
┌─uniCloud 云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb [详见uniCloud]
│─components 符合vue组件规范的uni-app组件目录
│ └─comp-a.vue 可复用的a组件
├─hybrid App端存放本地html文件的目录
├─unpackage 存放各平台专用页面的目录
├─pages 业务页面文件存放的目录
│ ├─index
│ │ └─index.vue index页面
│ └─list
│ └─list.vue list页面
├─static 存放应用引用的本地静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此
├─uni_modules 存放[uni_module](/uni_modules)规范的插件。
├─wxcomponents 存放小程序组件的目录
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期
├─manifest.json 配置应用名称、appid、logo、版本等打包信息
├─pages.json 配置页面路由、导航条、选项卡等页面类信息
└─uni.scss 这里是uni-app内置的常用样式变量
文件简介
main.js
-
main.js
是uni-app
的入口文件,主要作用是初始化vue
实例、定义全局组件、使用需要的插件如vuex
。 - 首先引入了
Vue
库和App.vue
,创建了一个vue
实例,并且挂载vue
实例。 - 使用
Vue.use
引用插件,使用Vue.prototype
添加全局变量,使用Vue.component
注册全局组件。 - 可以引用
vuex
,因涉及多个文件,此处没有提供示例,详见hello uni-app
示例工程。 - 无法使用
vue-router
,路由须在pages.json
中进行配置。如果开发者坚持使用vue-router
,可以在插件 市场 (opens new window)找到转换插件。
App.vue
-
App.vue
是uni-app
的主组件,所有页面都是在 下进行App.vue
切换的,是页面入口文件。但App.vue
- 本身不是页面,这里不能编写视图元素。
- 这个文件的作用包括:调用应用生命周期函数、配置全局样式、配置全局的存储globalData
- 应用生命周期仅可在App.vue中监听,在页面监听无效。
- 在应用
onLaunch
时,getApp
对象还未获取,暂时可以使用this.globalData
获取globalData
。 - 在
App.vue
中,可以定义一些全局通用样式,例如需要加一个通用的背景色,首屏页面渲染的动画等都可以写在App.vue
中。
uni.scss
-
uni.scss
文件的用途是为了方便整体控制应用的风格。比如按钮颜色、边框风格,uni.scss
文件里预置了一批scss变量预置。 -
uni-app
官方扩展插件(uni ui)及 插件市场 (opens new window)上很多三方插件均使用了这些样式变量,如果你是插件开发者,建议你使用 scss 预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App。 -
uni.scss
是一个特殊文件,在代码中无需 import 这个文件即可在scss
代码中使用这里的样式变量。uni-app
的编译器在webpack
配置中特殊处理了这个uni.scss
,使得每个scss
文件都被注入这个uni.scss
,达到全局可用的效果。如果开发者想要less
、stylus
的全局使用,需要在vue.config.js
中自行配置webpack
策略。
manifest.json
- manifest.json 文件是应用的配置文件,用于指定应用的名称、图标、权限等。HBuilderX 创建的工程此文件在根目录,CLI 创建的工程此文件在 src 目录。
- 各类网络请求的超时时间
networkTimeout
,单位均为毫秒
pages.json
- 用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar 等。
-
pages
配置应用由哪些页面组成,pages 节点接收一个数组,数组每个项都是一个对象 -
globalStyle
用于设置应用的状态栏、导航条、标题、窗口背景色等。 -
topWindow
,leftWindow
,rightWindow
用于解决宽屏适配问题。 -
matchMedia
通过matchMedia的调节,可以自适应在不同屏幕上显示指定的window。
开发规范
1.页面文件遵循 Vue 单文件组件 (SFC) 规范
<template>
<div class="example">{{ msg }}</div>
</template>
<script>
export default {
data () {
return {
msg: 'Hello world!'
}
}
}
</script>
<style>
.example {
color: red;
}
</style>
2.组件标签靠近小程序规范,详见uni-app 组件规范
html | uni-app | 说明 |
---|---|---|
<div>/<p>/<ul>/<li> | <view> | |
<span>/<font> | <text> | |
<a> | <navigator> | |
<img> | <image> | |
<select> | <picker> | |
<iframe> | <web-view> | |
<input> | <input> | type属性改成了confirmtype |
<form><button><checkbox><radio><label><textarea><canvas><video > | 都还一样 | |
<audio> | 不再推荐使用,改成api方式,背景音频api文档 |
3.接口能力(JS API)靠近微信小程序规范,但需将前缀 wx
替换为 uni
,详见uni-app接口规范
常用方法 | 说明 |
---|---|
uni.request | 发起网络请求 |
uni.navigateTo | 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 |
uni.navigateBack | 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。 |
uni.setStorage | 将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。 |
uni.getStorage | 从本地缓存中异步获取指定 key 对应的内容。 |
uni.showToast | 显示消息提示框。 |
uni.showLoading | 显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提示框。 |
uni.showModal | 显示模态弹窗,可以只有一个确定按钮,也可以同时有确定和取消按钮。类似于一个API整合了 html 中:alert、confirm。 |
uni.showActionSheet | 从底部向上弹出操作菜单 |
uni.$emit | 触发全局的自定义事件,附加参数都会传给监听器回调函数。 |
uni.$on | 监听全局的自定义事件,事件由 uni.$emit 触发,回调函数会接收事件触发函数的传入参数。 |
uni.login | 登录 |
uni.getUserInfo | 获取用户信息 |
uni.share | 分享 |
4.数据绑定及事件处理同 Vue.js 规范,同时补充了App及页面的生命周期
生命周期
1.应用生命周期
函数名 | 说明 |
---|---|
onLaunch | 当uni-app 初始化完成时触发(全局只触发一次) |
onShow | 当 uni-app 启动,或从后台进入前台显示 |
onHide | 当 uni-app 从前台进入后台 |
onError | 当 uni-app 报错时触发 |
onUniNViewMessage | 对 nvue 页面发送的数据进行监听,可参考 nvue 向 vue 通讯(opens new window)
|
onUnhandledRejection | 对未处理的 Promise 拒绝事件监听函数(2.8.1+) |
onPageNotFound | 页面不存在监听函数 |
onThemeChange | 监听系统主题变化 |
2.页面生命周期
函数名 | 说明 | 平台差异说明 | 最低版本 |
---|---|---|---|
onInit | 监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad | 百度小程序 | 3.1.0+ |
onLoad | 监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考示例 | ||
onShow | 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面 | ||
onReady | 监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发 | ||
onHide | 监听页面隐藏 | ||
onUnload | 监听页面卸载 | ||
onResize | 监听窗口尺寸变化 | App、微信小程序、快手小程序 | |
onPullDownRefresh | 监听用户下拉动作,一般用于下拉刷新,参考示例 | ||
onReachBottom | 页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项 | ||
onTabItemTap | 点击 tab 时触发,参数为Object,具体见下方注意事项 | 微信小程序、QQ小程序、支付宝小程序、百度小程序、H5、App、快手小程序、京东小程序 | |
onShareAppMessage | 用户点击右上角分享 | 微信小程序、QQ小程序、支付宝小程序、字节小程序、飞书小程序、快手小程序、京东小程序 | |
onPageScroll | 监听页面滚动,参数为Object | nvue暂不支持 | |
onNavigationBarButtonTap | 监听原生标题栏按钮点击事件,参数为Object | App、H5 | |
onBackPress | 监听页面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack表示来源是 uni.navigateBack ;详细说明及使用:onBackPress 详解 (opens new window)。支付宝小程序只有真机能触发,只能监听非navigateBack引起的返回,不可阻止默认行为。 | app、H5、支付宝小程序 | |
onNavigationBarSearchInputChanged | 监听原生标题栏搜索输入框输入内容变化事件 | App、H5 | 1.6.0 |
onNavigationBarSearchInputConfirmed | 监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发。 | App、H5 | 1.6.0 |
onNavigationBarSearchInputClicked | 监听原生标题栏搜索输入框点击事件(pages.json 中的 searchInput 配置 disabled 为 true 时才会触发) | App、H5 | 1.6.0 |
onShareTimeline | 监听用户点击右上角转发到朋友圈 | 微信小程序 | 2.8.1+ |
onAddToFavorites | 监听用户点击右上角收藏 | 微信小程序 | 2.8.1+ |
3.组件生命周期(同vue生命周期)
函数名 | 说明 | 平台差异说明 | 最低版本 |
---|---|---|---|
beforeCreate | 在实例初始化之前被调用。详见(opens new window) | ||
created | 在实例创建完成后被立即调用。详见(opens new window) | ||
beforeMount | 在挂载开始之前被调用。详见(opens new window) | ||
mounted | 挂载到实例上去之后调用。详见 (opens new window)注意:此处并不能确定子组件被全部挂载,如果需要子组件完全挂载之后在执行操作可以使用$nextTick Vue官方文档(opens new window)
|
||
beforeUpdate | 数据更新时调用,发生在虚拟 DOM 打补丁之前。详见(opens new window) | 仅H5平台支持 | |
updated | 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。详见(opens new window) | 仅H5平台支持 | |
beforeDestroy | 实例销毁之前调用。在这一步,实例仍然完全可用。详见(opens new window) | ||
destroyed | Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。详见(opens new window) |
组件使用
1.npm组件
npm i hm-uniapp-photo-card
安装完毕后 根目录会有
node_modules
文件夹
2.uni-app组件
import HmPhotoCard from '@/components/hm-photo-card/index.vue'
export default {
components: { HmPhotoCard }
}
运行
1.微信小程序
需要设置服务端口
2. 其他小程序
在项目的跟目录\unpackage\dist\dev\mp-toutiao 将改文件加入头条小程序
HBuilderX 编辑 保存的时候 相应的小程序编辑器中 项目会自动刷新
跨端兼容 条件编译
uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足。
但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况。
- 大量写 if else,会造成代码执行性能低下和管理混乱。
- 编译到不同的工程后二次修改,会让后续升级变的很麻烦。
在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码。 uni-app
参考这个思路,为 uni-app
提供了条件编译手段,在一个工程里优雅的完成了平台个性化实现。
1. 写法
以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。
-
\#ifdef
:if defined 仅在某平台存在 -
\#ifndef
:if not defined 除了某平台均存在 - %PLATFORM%:平台名称
2. %PLATFORM% 可取值如下:
值 | 生效条件 |
---|---|
VUE3 | HBuilderX 3.2.0+ 详情(opens new window) |
APP-PLUS | App |
APP-PLUS-NVUE或APP-NVUE | App nvue |
H5 | H5 |
MP-WEIXIN | 微信小程序 |
MP-ALIPAY | 支付宝小程序 |
MP-BAIDU | 百度小程序 |
MP-TOUTIAO | 字节跳动小程序 |
MP-LARK | 飞书小程序 |
MP-QQ | QQ小程序 |
MP-KUAISHOU | 快手小程序 |
MP-JD | 京东小程序 |
MP-360 | 360小程序 |
MP | 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/飞书小程序/QQ小程序/360小程序 |
QUICKAPP-WEBVIEW | 快应用通用(包含联盟、华为) |
QUICKAPP-WEBVIEW-UNION | 快应用联盟 |
QUICKAPP-WEBVIEW-HUAWEI | 快应用华为 |
3.示例
html
使用 <!-- -->
<view>
<view>微信公众号关注组件</view>
<view>
<!-- uni-app未封装,但可直接使用微信原生的official-account组件-->
<!-- #ifdef MP-WEIXIN -->
<official-account></official-account>
<!-- #endif -->
</view>
</view>
js
使用 //
代码仅在 App 下运行
// #ifdef APP-PLUS
APP 执行的相关代码
// #endif
代码会在 App 和 H5 平台上运行
// #ifdef H5 || APP-PLUS
H5执行的相关代码
// #endif
css
使用 /* */
/* #ifdef MP-WEIXIN
微信平台特有样式
/* #endif */
json
使用 //
// #ifdef MP-WEIXIN
{
path: “list/index.vue”,
style: {}
}
// #endif