Uniapp简介
- uni-app:是一个使用Vue.js开发前端应用的框架,开发的代码可以发布到H5、Android、iOS以及各种小程序多个平台。
- Uniapp约定的开发规范:
- 页面文件遵循Vue单文件组件规范
- 组件标签靠近小程序规范
- 接口靠近微信小程序规范
- 数据绑定及事件处理同
Vue.js
规范,同时补充了App及页面的生命周期
- 为了兼容多个平台运行,建议使用flex布局
小程序开发的环境搭建
- 安装编辑器HbuilderX
- 安装微信开发者工具
项目的目录介绍
- pages.json:对uni-app进行全局配置,决定页面文件的路径、窗口样式、最顶部的导航栏、底部的tabbar等
- manifest.json:应用的配置文件,用于指定应用的名称、图标、权限等
- App.vue:根组件,是页面入口文件,可以调用应用的生命周期函数。
- main.js:项目入口文件,主要作用是初始化
vue
实例并使用需要的插件。
- uni.scss:为了方便整体控制应用的风格,预置了一批scss变量
- unpackage:打包目录,包含各个平台的打包文件
- pages:所有的页面存放目录
- static:静态资源存放的目录
- components:组件存放的目录
pages.json下的常用配置
1.全局配置
- 在pages.json文件中的globalStyle节点下进行页面的全局配置,作用于每一个小程序页面
- navigationBarTextStyle:设置导航栏的标题颜色,仅支持black、white
- navigationBarTitleText:设置导航栏的标题内容
- navigationBarBackgroundColor:设置导航栏的背景色
- backgroundColor:设置下拉刷新时窗口的背景色
- backgroundTextStyle:设置下拉loading的样式,仅支持dark、light。
- enablePullDownRefresh:是否开启下拉刷新
- onReachBottomDistance:页面上拉触底事件触发时距页面底部距离,单位只支持px
- pages.json文件中的pages节点进行配置页面,其属性如下:
- path:指定页面路径
- style:设置页面的局部配置,其配置项可以参考globalStyle节点下的属性。
2.tabBar配置
- tabBar分为顶部tabBar和底部tabBar。其属性包含如下:
- color:tab 上的文字默认颜色
- selectedColor:tab上的文字选中时的颜色
- backgroundColor:tab的背景色
- borderStyle:tabbar 上边框的颜色,仅支持 black/white
- list:tab的列表,最少2个、最多5个tab。list节点下的属性有
- pagePath:在pages中定义的
- text:tab上的按钮文字
- iconPath:图片路径
- selectedIconPath:选中时的图片路径
- position:可选值bottom、top。当position值为top时,将不会显示icon。
3.condition启动模式的配置
- 在开发期间,为了方便进入非tabBar页面,可以配置启动模式。类似于在微信开发者工具中添加编译模式的功能
- condition节点的属性:
- current:当前激活的模式,list节点的索引值
- list:设置启动模式列表
- name:启动模式名称
- path:启动的页面路径
- query:启动参数,可以在页面的生命周期函数onLoad中获取。
"condition": {
"current": 0,
"list": [
{
"name": "详情页",
"path": "pages/detail/detail",
"query": "id=1"
}
]
}
// 配置完后,在微信开发者工具中在普通编译器
// 新增了详情页的快速进入方式
常用组件的基本使用
1.text组件
- text组件等同于HTML中的span标签,属于行内元素。
- 其常用属性有:
- selectable:表示文本是否可选。在微信小程序中,该属性调整为user-select
- space:显示连续空格
- decode:是否解码
2.view组件
- view组件等同于HTML中的div元素,属于块元素
- 其常用属性有:
- hover-class:指定按下去的样式类,其默认值为none,表示没有点击效果
- hover-stop-propagation:指定是否阻止本节点的祖先节点出现点击的效果,即阻止冒泡
- hover-start-time:按住后多久出现点击的效果
- hover-stay-time:手指松开后点击的效果保留时间
4.image组件
- image组件,等同于HTML中的img元素
- 其常用属性:
- src:指定图片资源地址
- mode:指定图片裁剪、缩放的模式
uni-app中的样式
- rpx:一种根据屏幕宽度自适应的动态单位。不管屏幕多宽,都将其分为750份,即屏幕宽度为750rpx。
- 使用
@import
可以导入外联样式表,例如:
<style>
@import url("./common.css");
</style>
- 支持常用的选择器,比如类选择器、id选择器、元素选择器;不支持通配符选择器
- 页面上的page节点相当于HTML文档中的body节点
- 定义在App.vue中的样式为全局样式,作用于每一个页面。在 pages目录下的vue文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖App.vue中相同的选择器。
- uni-app中可以使用字体图标
- 使用scss:
<style lang="scss">
</style>
uni-app中的数据绑定
1.插值语法的使用
- 插值语法:使用一对大花括号
<view>
<text>{{msg}}</text>
<view></view>
<text>{{flag === true ? '真' : '假'}}</text>
<view></view>
<text>{{100 + 150}}</text>
</view>
2.v-bind动态绑定属性
v-bind:属性名称
指令可以简写为:属性名称
<image v-bind:src="imgUrl"></image>
<image :src="imgUrl"></image>
uni-app中的列表渲染
- 列表渲染使用vue中的v-for指令。
<view v-for="(item, index) in userList" :key="item.id">
<text>{{item.name}}</text>
</view>
uni-app中的事件
- 事件绑定:通过v-on进行事件的绑定,可以简写成@。例如绑定点击事件,则应该写为
<button @click="handleClick"></button>
- 事件传参
- 如果未显示传递参数,则事件的回调函数中的第一个形参就为事件对象
<button @click="handleClick">点击事件, 事件的回调函数中包含默认形参事件对象</button>
handleClick(e) {
console.log(e)
}
- 如果显示的传递了参数,对应的事件函数形参接收的则是传递过来的实参
<button @click="handleClick(imgUrl)">点击事件, 传递数据</button>
handleClick(imgUrl) {
console.log(imgUrl)
}
- 事件回调函数中即获取事件对象,也获取传递的实参数据
<button @click="handleClick(imgUrl, $event)">点击事件, 传递数据</button>
handleClick(imgUrl, e) {
console.log(imgUrl, e)
}
uni-app中的生命周期函数
1.应用的生命周期函数
- onLaunch:当
uni-app
初始化完成时触发(全局只触发一次)
- onShow:当
uni-app
启动,或从后台进入前台显示
- onHide:当
uni-app
从前台进入后台
- onError:当
uni-app
报错时触发
2.页面的生命周期函数
- onLoad:监听页面加载,其参数为上个页面传递的数据,参数类型为Object,可以用于页面传参
- onShow:监听页面显示。
- onReady:监听页面初次渲染完成。
- onHide:监听页面隐藏
- onUnload:监听页面卸载
下拉刷新
1.启动下拉刷新
- 在pages.json文件中的pages节点下的style属性中,使用enablePullDownRefresh属性开启下拉刷新。
"enablePullDownRefresh": true
- 调用
uni.startPullDownRefresh
方法开启下拉刷新
2.监听下拉刷新
- 在页面的onPullDownRefresh函数中进行监听。
onPullDownRefresh() {
console.log("用户下拉刷新了")
},
3.下拉刷新的关闭
- 使用
uni.stopPullDownRefresh()
停止当前页面下拉刷新
上拉加载
- 在pages.json文件中的pages节点下的style属性中,使用onReachBottomDistance属性设置距离底部加载的距离,默认为50px
- 在页面的onReachBottom函数监听触底的行为
网络请求的发送
- 在uni-app中使用
uni.request
方法进行网络请求的发送。在小程序中网络相关的API在使用前需要配置域名白名单。
- get请求的发送示例
uni.request({
url:"https://www.escook.cn/api/get",
method:"GET",
data: {
name: 'zs',
age: 24
},
success(res) {
console.log(res)
}
})
- post请求的发送示例
uni.request({
url: "https://www.escook.cn/api/post",
data: {
name: 'zs',
age: 23
},
success(res) {
console.log(res)
},
method:"POST"
})
数据缓存
uni.setStorage
:将数据存储在本地存储的指定key中,会覆盖掉原来该key对应的内容。这是一个异步接口
uni.setStorageSync
:将data存储在本地缓存中指定的 key 中,会覆盖掉原来该key对应的内容,这是一个同步接口
uni.getStorage
:从本地缓存中异步获取指定 key 对应的内容。
uni.getStorageSync
:从本地缓存中同步获取指定 key 对应的内容
uni.removeStorage
:从本地缓存中异步移除指定 key
uni.removeStorageSync
:从本地缓存中同步移除指定 key。
上传图片
- 使用
uni.chooseImage
方法从本地相册选择图片或使用相机拍照。
- 示例
<button @click="chooseImgs">上传图片</button>
chooseImgs() {
uni.chooseImage({
count:5,
success: (res) => {
this.imgPath = res.tempFilePaths
console.log(res)
}
})
},
预览图片
- 预览图片使用
uni.previewImage
方法
- 示例
<view >
<image :src='item' v-for="(item, index) in imgPath" :key="index" @click="previewImg(item)"></image>
</view>
chooseImgs() {
uni.chooseImage({
count:5,
success: (res) => {
this.imgPath = res.tempFilePaths
console.log(res)
}
})
}
条件注释实现多端兼容
- 条件注释的语法:
以#ifdef 平台标识开头,以#endif结尾
- 组件的条件注释
<!-- #ifdef H5 -->
<view>H5中层现的内容</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<view>微信中层现的内容</view>
<!-- #endif -->
- api的条件注释
test() {
// #ifdef H5
console.log("H5中层现的内容")
// #endif
// #ifdef MP-WEIXIN
console.log("微信中层现的内容")
// #endif
}
- 样式的条件注释
.container {
/* #ifdef H5 */
background-color: aqua;
/* #endif */
/* #ifdef MP-WEIXIN */
background-color: brown;
/* #endif */
}
uni-app中的导航跳转
1.声明式导航
- 使用navigator组件
- 跳转到普通页面(非tabBar页面)示例
<navigator open-type="navigate" url="/pages/detail/detail">跳转到普通页面</navigator>
- 跳转到tabBar页面
<navigator open-type="switchTab" url="/pages/message/message">跳转到tabBar页面</navigator>
2.编程式导航
- 使用
navigateTo
方法进行跳转:将会保留当前页面,跳转到应用内的某个页面,从而使用uni.navigateBack
可以返回到原页面。
- 使用
switchTab
方法进行跳转,跳转到tabbar页面
- 使用
redirectTo
方法进行跳转,关闭当前页面,跳转到应用内的某个页面。
3.导航跳转传递参数
- 在导航进行跳转到下一个页面的同时,可以给下一个页面传递相应的参数,接收参数的页面可以通过onLoad生命周期函数进行接收,该生命周期函数的options形参存放着其他地方传递过来的参数
- 示例:
goToDetail() {
uni.navigateTo({
url:`/pages/detail/detail?id=1&name=zs`
})
}
onLoad(options) {
console.log(options.id, options.name)
}
组件
1.组件的创建
- 在项目根目录下新建components目录,在components目录下新建xxx.vue即完成一个组件的创建
- 组件的注册和使用和vue是一样的
2.组件的生命周期
- 组件的生命周期和vue中是一样的
3.组件的通信方式
- 父组件给子组件传值:在子组件内部使用props接收父组件传递的数据
<!--父组件中-->
<login :msg='name'></login>
<!--子组件中-->
props:['msg']
- 子组件给父组件传值:子组件通过$emit触发事件进行传递参数,父组件定义自定义事件(监听事件)并接收参数
<!--子组件中-->
<button @click="passValue">给父组件传值</button>
methods: {
passValue() {
this.$emit('update', this.msg + ',Good')
}
}
// 父组件中监听事件
<login :msg='name' @update='updateMsg'></login>
methods: {
updateMsg(res) {
console.log(res)
this.msg = res
}
}
- 兄弟组件之间通信:uni.$on注册一个全局监听事件,通过uni.$emit触发全局监听事件
打包
1.微信小程序打包
- 在manifest.json文件中进行微信小程序配置
- 修改请求服务端的地址为线上合法地址
- 在小程序后台配置request合法域名
2.安卓打包
- 在manifest.json文件中进行H5配置
3.IOS打包
- 在manifest.json文件中进行基础配置等