目录
什么是uniapp
含义:其是使用vue.js开发所有前端应用的框架,开发者编写一套代码,可以发布到ios、android、h5以及各种小程序(微信/支付宝/百度/头条/qq/钉钉)等多个平台
为什么学uniapp
- 一套代码可以打包到不同的应用平台
- 方便入手
- 丰富的生态环境
uni-app目录结构
- pages:vue的组件页面一般都放在这里
- static:存放静态文件的地方
- unpackage:存放项目最终打包输出的文件
- App.vue:用来配置vue的全局组件
- main.js:vue初始化的入口文件
- index.html:最终项目解析之后所生成的单文件项目
- uni.scss:定义公共的css样式
- manifest.json:项目的配置入口
- pages.json:页面以及全局外观的配置
uniapp开发规范
- 页面文件遵循vue的单文件组件
- 组件标签靠近小程序规范
- 接口能力靠近微信小程序规范,但需要将前缀wx换为uni
- 数据绑定及事件处理遵循vue规范,同时补充了App及页面的生命周期
- 为兼容多端运行,建议使用flex布局进行开发
pages.json页面的基本配置
pages页面配置
配置的vue组件一般都放在page目录中,若要使该组件生效则需要将该vue组件的路径path写在pages.json内pages数组中(该数组内每一项都是一个对象),并且pages数组中第一项vue页面表示应用的启动页;其中每个对象表示一个页面的配置,多个对象之中用逗号相隔。
pages对象的属性
globalStyle全局配置
在pages.json内通过globalStyle属性进行全局配置
作用:用于设置应用的状态栏、导航条、标题、窗口背景色等。
注意:页面配置内每个页面的style配置会将全局配置覆盖
配置基本tabbar
若一个应用是一个多tab应用,可以通过tabbar配置项指定tab栏的表现,以及tab切换时显示的对应页
tabbar的基本属性
其中list接收一个数组,数组中的每一项都是一个对象,属性值如下
注意:
- 当设置的position为top时,将不会显示icon
- tabBar中的list是一个数组,只能配置最少两个、最多五个tab,tab按数组的顺序排序
- tabbar的页面展现过一次后就会保留在内存中,再次切换到该tabbar页面。只会触发页面的onShow函数,不会再触发onLoad函数
- pagePath为点击后跳转页面的路径
condition启动模式配置
启动模式配置仅在开发期间生效,模拟直达页面的场景,如小程序转发后用户点击所打开的页面
具体属性
list内的属性
注意:list数组里面由多个对象组成,每个对象所具有的属性如下
组件的基本使用
前言:uni-app为开发者提供了一系列基础组件,类似html里的基础标签元素,虽然uni-app不推荐使用HTML标签,但实际上若开发者写了div等h5标签,在编译到非H5平台时也会被编译成view标签,类似的还有span转text、a转navigator等,包括css里的选择器也会转;但为了管理方便,策略统一,新写代码时仍建议使用view等标签
text文本组件
注意:
- text组件相当于行内标签(span),在同一行显示
- 除了文本节点以外的其他节点都无法长按选中
- ensp:中文空格一半大小;emsp:中文空格大小;nbsp:根据字体控制空格大小
view组件
前言:view属性相当于HTML中的div标签
button组件
属性名 | 类型 | 默认值 | 说明 |
size | String | default | 按钮的大小 |
type | String | default | 按钮的样式类型 |
plain | Boolean | false | 按钮背景色是否透明 |
disabled | Boolean | false | 是否禁用 |
loading | Boolean | false | 是否带loading图标 |
hover-class | String | button-hover | 指定按钮按下去的样式类,当属性为none时没有点击效果 |
hover-start-time | Number | 20 | 按住多久后出现点击态单位ms |
hover-stay-time | Number | 20 | 手指松开后生态保存时间,单位ms |
form-type | String | 用于form标签,点击后分别触发form组件的submit/reset事件 |
size属性
- default:默认大小
- mini:小尺寸
type属性
- primary:微信小程序为绿色,app、h5、百度小程序、支付宝小程序为蓝色,头条小程序为红色,qq小程序为浅蓝色
- default:白色
- warn:红色
form-type属性
- submit:提交表单事件
- reset:重置表单事件
image组件
mode属性
注意:
- image组件默认宽度300px、高度225px
- src仅支持相对路径、绝对路径,支持base64编码
- webp格式图片、app-vue下,ios不支持,android支持;app-nvue下,ios和android均支持。
uni-app中的样式
rpx:响应式px,一种根据屏幕宽度自适应的动态单位
理解:以750宽度的屏幕为基准,750rpx恰好为屏幕的宽度,屏幕变宽,那么rpx实际显示效果也会等比放大
使用@import语句可以导入外联样式表
语法:@import(url)
导入本页面相同路径下的add.css文件
<style>
@import url("add.css");
</style>
注意:
- 在uniapp中支持基本的常用选择器,如class、id、标签名选择器等,但是不能使用通配符*选择器
- uniapp中的page标签相当于body节点
- 定义在App.vue中的样式为全局样式,作用于每一个页面。在pages目录下的vue文件定义的样式为局部样式,只会作用于对应的页面,并会覆盖App.vue中的样式
scss嵌套css的使用
<template>
<view class="box">
<text>唱歌跳舞打篮球</text>
</view>
</template>
<script>
</script>
<style lang="scss">
.box{
width: 100px;
height: 100px;
background-color: aqua;
text{
background-color: red;
}
}
</style>
注意:
- 使用时需要下载scss插件
- uni.scss中还定义了公共的样式属性,可以直接拿来使用(直接用属性替换对应的颜色)
基本的数据绑定
<template>
<view>
<view>数据绑定的学习</view>
<!-- 插值表达式 -->
<view>{{msg}}</view>
<!-- 动态绑定属性,v-bind也可以省略不写 -->
<image v-bind:src="imgUrl"></image>
<!-- v-for绑定 -->
<view v-for="(item,index) in arr">
序号:{{index}} 名字:{{item.name}} 年龄:{{item.age}}
</view>
</view>
</template>
<script>
export default{
data(){
return{
msg:"hello world",
imgUrl:"https://www.jd.com/favicon.ico",
arr:[
{
name:"lili",
age:18
},
{
name:"lan",
age:19
}
]
}
}
}
</script>
uni-app中的事件
<template>
<view>
<view>uni-app中的事件</view>
<!-- 点击事件 -->
<button type="button" v-on:click="clickHandle('参数信息',$event)">点击</button>
</view>
</template>
<script>
export default{
methods:{
clickHandle(num,e){
console.log("传递的参数为:"+num+"\n事件对象为:",e)
}
}
}
</script>
生命周期函数
应用的生命周期
生命周期含义:一个对象从创建、运行、销毁的整个过程被称为生命周期
生命周期函数:生命周期中的每个阶段都会伴随着一个函数的触发,这些函数被称为生命周期函数
注意:应用的生命周期函数应该定义在App.vue内
<script>
export default {
onLaunch: function() {
console.log('项目启动了')
},
onShow: function() {
console.log('程序进入前台页面')
},
onHide: function() {
console.log('程序即将进入后台')
},
onError:function(err){
console.log("出现异常了",err)
}
}
</script>
页面的生命周期函数
onPullDownRefresh:监听页面下拉刷新状态
onReachBottom:监听页面触底的事件(前提页面高度,高于屏幕高度-可滚动)
注意:
- 页面的生命周期函数一般都定义在每个页面组件内
- onLoad函数和onReady函数仅会触发一次
- 关闭下拉刷新用uni.stopPullDownRefresh()方法,触发下拉刷新用uni.startPullDownRefresh()函数
- 页面触底的事件中触底距离可以在通过pages.json文件内设置onReachBottomDistance属性来设置,默认为50
<script>
export default{
onLoad(options){
console.log("页面加载了,上一个页面传过来的参数为:",options)
},
onShow(){
console.log("页面出现了")
},
onReady(){
console.log("页面初次渲染完成")
},
onHide(){
console.log("页面隐藏了")
},
onUnload(){
console.log("页面卸载了")
},
onPullDownRefresh(){
console.log("触发了下拉刷新")
/* 关闭下拉刷新 */
uni.stopPullDownRefresh();
},
onReachBottom(){
console.log("页面触底了")
}
}
</script>
uni-app中的网络请求
语法:uni.request(object)
object对应的参数
参数名 | 类型 | 必填 | 默认值 | 说明 |
url | String | 是 | 请求的url | |
data | Object/String/ArrayBuffer | 否 | 请求的参数 | |
header | Obhect | 否 | 设置请求的请求头 | |
method | String | 否 | Get | 请求方法 |
timeout | Number | 否 | 30000 | 请求超时时间,单位ms |
success | Function | 否 | 调用成功后执行的回调函数 | |
fail | Function | 否 | 调用失败后执行的回调函数 | |
dataType | String | 否 | json | 传输的数据格式 |
responseType | String | 否 | text | 接受的数据格式 |
get请求
node.js搭建服务用于接收get请求
//引入http内置模块
var http=require("http")
//创建http服务
var server=http.createServer()
server.on("request",(req,res)=>{
//拼接并解析请求的url
const myurl=new URL(req.url,"http://localhost:3000/")
//获取请求url的参数迭代器
var b=myurl.searchParams
//对该迭代器进行遍历
for (const [key,value] of b) {
console.log(key,value);
}
//设置响应编码格式
res.setHeader("content-Type","text/html;charset=utf-8")
//设置返回内容
res.write("好吧,你已经成功了")
res.end()
})
server.listen(3000,()=>{
console.log("server start")
})
uni-app发送get请求
<template>
<view>
<button @click="get()">发送get请求</button>
</view>
</template>
<script>
export default{
methods:{
get(){
//发送get请求
uni.request({
url:"http://localhost:3000/?name=lili",
method:"get",
success(res){
//打印接收到的返回值
console.log("请求的返回值为:"+res.data)
}
})
}
}
}
</script>
注意:res.data为接收到的返回值
post请求
node.js搭建服务用于接收post请求
//引入http内置模块
var http=require("http")
//创建http服务
var server=http.createServer()
server.on("request",(req,res)=>{
let data="";
//接收post请求传递的参数
req.on("data",chunk=>{
data+=chunk
})
req.on("end",()=>{
console.log(data);
})
//设置响应编码格式
res.setHeader("content-Type","text/html;charset=utf-8")
//设置返回内容
res.write("好吧,你已经成功了")
res.end()
})
server.listen(3000,()=>{
console.log("server start")
})
uni-app发送post请求
<template>
<view>
<button @click="post()">发送post请求</button>
</view>
</template>
<script>
export default{
methods:{
post(){
//发送post请求
uni.request({
url:"http://localhost:3000",
method:"post",
data:{"name":"lili","age":23},
success(res){
//打印接收到的返回值
console.log("请求的返回值为:"+res.data)
},
fail(err){
//打印失败信息
console.log("您失败了:",err)
}
})
}
}
}
</script>
数据缓存
异步设置缓存
在本地储存中设置数据:uni.setStorage(Object)
在本地储存中获取数据:uni.getStorage(Object)
在本地储存中移除数据:uni.removeStorage(Object)
理解:将数据存储在本地缓存中指定的key中,会覆盖掉原来key的内容,但是以上的接口为异步接口
Object中参数说明
<template>
<view>
<button type="primary" @click="setStorage()">存储数据</button>
<button type="primary" @click="getStorage('id')">获取数据</button>
<button type="primary" @click="removeStorage('id')">移除数据</button>
</view>
</template>
<script>
export default{
methods:{
setStorage(){
//向本地存数据
uni.setStorage({
key:"id",
data:80,
success(){
console.log("存储成功!")
}
})
},
getStorage(data){
//从本地获取数据
uni.getStorage({
key:data,
success(res){
console.log("获取到的数据为:"+res.data)
}
})
},
removeStorage(data){
//从本地移除数据
uni.removeStorage({
key:data,
success(res){
console.log("移除数据成功!",res)
}
})
}
}
}
</script>
同步设置缓存
同步设置缓存:uni.setStorageSync(key,data)
同步获取缓存:uni.getStorageSync(key)
同步移除缓存:uni.removeStorageSync(key)
参数说明
<template>
<view>
<button type="primary" @click="setStorageSync('id',23)">同步存储数据</button>
<button type="primary" @click="getStorageSync('id')">同步获取数据</button>
<button type="primary" @click="removeStorageSync('id')">同步移除数据</button>
</view>
</template>
<script>
export default{
methods:{
setStorageSync(key,data){
uni.setStorageSync(key,data);
},
getStorageSync(key){
const res=uni.getStorageSync(key)
console.log("获取到的数据为:"+res)
},
removeStorageSync(key){
uni.removeStorageSync(key)
}
}
}
</script>
图片的上传和预览
从本地相册选择图片或使用相机拍照
方法:uni.chooseImage(Object)
Object参数说明
预览图片
方法:uni.previewImage(Object)
Object参数说明
注意:上面的current代表的是当前的图片的路径
<template>
<view>
<button type="primary" @click="chooseImg()">上传图片</button>
<!-- 预览图片 -->
<image v-for="item in imgArr" :src="item" @click="previewImg(item)"></image>
</view>
</template>
<script>
export default{
data() {
return{
imgArr:[]
}
},
methods:{
chooseImg(){
uni.chooseImage({
count:5,
success:res=>{
this.imgArr=res.tempFilePaths
}
})
},
previewImg(data){
uni.previewImage({
current:data,
urls:this.imgArr,
loop:true,
indicator:"number"
})
}
}
}
</script>
条件编译跨端兼容
跨平台兼容
含义:uni-app已经将常用的组件,js API封装到框架中,开发者按照uni-app规范开发即刻保证多平台兼容,大部分业务均可直接满足,但是每个平台都有自己的一些特性,因此会存在着一些无法跨平台的情况
条件编译
含义:条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台
语法:#ifdef 平台标识 …… #endif
平台标识
<template>
<view>
<!-- #ifdef H5 -->
<view>我希望在H5页面中看见</view>
<!-- #endif -->
<!-- #ifdef MP-WEIXIN -->
<view>我希望在微信小程序页面中看见</view>
<!-- #endif -->
</view>
</template>
<script>
export default{
methods:{
onLoad(){
//#ifdef H5
console.log("我希望在H5内中打印")
//#endif
//#ifdef MP-WEIXIN
console.log("我希望在微信小程序内中打印")
//#endif
}
}
}
</script>
<style>
/* H5中的样式 */
/* #ifdef H5 */
view{
color: red;
}
/* #endif */
/* 微信小程序的样式 */
/* #ifdef MP-WEIXIN */
view{
color: blue;
}
/* #endif */
</style>
注意:条件编译要写在注释里面
uniapp中的导航跳转
声明式跳转
组件:navigator
属性值
open-type的有效值
编程式导航
保留当前页面,跳转到应用内的某个页面
语法:uni.navigateTo(object)
object参数说明
跳转到tabBar页面,并关闭其他所有的非tabBar页面
语法:uni.switchTab(object)
object参数说明
关闭当前页面,跳转到应用内的某个页面
语法:uni.redirectTo(object)
object属性
<template>
<view>
<view>声明式导航的学习</view>
<navigator url="/pages/detail/detail">跳转到详情页</navigator>
<!-- 因为这里的信息页为tabBar页面 -->
<navigator url="/pages/message/message" open-type="switchTab">跳转到信息页</navigator>
<view>编程式导航的学习</view>
<button @click="goDetail()">跳转至详情页</button>
<button @click="goMessage()">跳转至信息页</button>
</view>
</template>
<script>
export default{
methods:{
goDetail(){
uni.navigateTo({
url:"/pages/detail/detail"
})
},
goMessage(){
uni.switchTab({
url:"/pages/message/message"
})
}
}
}
</script>
注意:导航过程中也可以进行页面的传参,通过?和&拼接的形式,若取得上个页面传过来的参数则需要页面生命周期onLoad函数。
组件的创建和使用
前言:在uni-app中,可以通过创建一个后缀名为vue的文件,即创建一个组件成功,其他组件可以将该组件通过import的方式导入,再通过components进行注册即可
<template>
<view>
<view>使用组件工具类</view>
<!-- 使用组件 -->
<partName></partName>
</view>
</template>
<script>
//引入组件
import Part from "../../components/test.vue"
//注册组件
export default{
components:{
partName:Part
}
}
</script>
组件的生命周期
组件之间的通讯方式
父组件向子组件传值
<template>
<view>
<view>我是父组件</view>
<!-- 父组件向子组件传递title值 -->
<child :title="title"></child>
</view>
</template>
<script>
import child from "../../components/child.vue"
export default{
data(){
return{
title:"hello uniapp"
}
},
components:{
child:child
}
}
</script>
子组件从父组件接收值
<template>
<view>
<view>我是子组件</view>
<view>title的值为{{title}}</view>
</view>
</template>
<script>
export default{
//子组件接收父组件传递过来的title
props:['title']
}
</script>
子组件向父组件传值
<template>
<view>
<view>我是子组件</view>
<button @click="sendNum()">给父组件传值</button>
</view>
</template>
<script>
export default{
data(){
return{
num:6
}
},
methods:{
sendNum(){
//第一个参数传自定义事件名称,第二个参数传请求参数
this.$emit('myEvent',this.num)
}
}
}
</script>
父组件从子组件接收值
<template>
<view>
<view>我是父组件</view>
<child @myEvent="getNum"></child>
</view>
</template>
<script>
import child from "../../components/child.vue"
export default{
methods:{
//num用于接收触发了事件传过来的值
getNum(num){
console.log("子组件传过来的值为:"+num)
}
},
components:{
child:child
}
}
</script>
兄弟组件之间的相互传参
兄弟组件
<template>
<view>
<view>我是兄弟组件1</view>
<button @click="addNum()">修改组件2中的数据</button>
</view>
</template>
<script>
export default{
methods:{
addNum(){
//触发全局事件
uni.$emit("updateNum",10)
}
}
}
</script>
<template>
<view>
<view>我是兄弟组件2</view>
<view>组件2内num的值为{{num}}</view>
</view>
</template>
<script>
export default{
data(){
return{
num:0
}
},
created() {
//监听全局事件
uni.$on("updateNum",(num)=>{
this.num+=num
})
}
}
</script>
父组件
<template>
<view>
<view>我是父组件</view>
<part1></part1>
<part2></part2>
</view>
</template>
<script>
import part1 from "../../components/student1.vue"
import part2 from "../../components/student2.vue"
export default{
components:{
part1,part2
}
}
</script>
uni-ui组件库的基本使用
含义:uni-ui是DCloud提供的一个跨端ui库,他是基于vue组件的,flex布局的,无dom的全端ui库
以日历组件的使用为例
首先使用HbuilderX导入插件
然后就直接使用
<template>
<view>
<view>uni-ui组件库</view>
<uni-calendar
:insert="true"
:lunar="true"
:start-data="'2019-3-2'"
:end-data="'2019-5-20'"
@change="change"
></uni-calendar>
</view>
</template>
<script>
export default{
methods:{
change(e){
console.log("触发了change函数",e)
}
},
}
</script>