uni-app:是一个使用 Vue.js 开发所有前端应用的开源框架。一次开发,多端使用。
下载nodejs
,hbuilderx
;在DCloud开发者中心注册账号并创建应用,获取AppID。
Nodejs下载地址
hbuilderx下载地址
DCloud开发者中心注册账号地址
项目新建
在HBuilderX点击工具栏里的文件 -> 新建 -> 项目:
在HBuilderX中,点击工具栏里的运行 -> 选择运行的平台:
在HBuilderX中,点击工具栏里的发行 -> 原生app-云打包:
安卓打包,可以选择证书(hbuilder内置有证书),
iOS打包,证书需要去苹果网站申请。
uni-app中的生命周期有三种,应用生命周期
、页面生命周期
、组件生命周期
。
onLaunch:当uni-app 初始化完成时触发(全局只触发一次)
onShow:当 uni-app 启动,或从后台进入前台显示
onHide:当 uni-app 从前台进入后台
onError:当 uni-app 报错时触发
onInit:监听页面初始化,其参数同 onLoad 参数,为上个页面传递的数据,参数类型为 Object(用于页面传参),触发时机早于 onLoad
onLoad:监听页面加载,其参数为上个页面传递的数据,参数类型为 Object
onShow:监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面
onReady:监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
onHide:监听页面隐藏
onUnload:监听页面卸载
onResize:监听窗口尺寸变化
onPullDownRefresh:监听用户下拉动作,一般用于下拉刷新
onReachBottom:页面滚动到底部的事件,常用于下拉下一页数据
onTabItemTap:点击 tab 时触发,参数为Object
onPageScroll:监听页面滚动,参数为Object
beforeCreate:在实例初始化之后被调用
Created:在实例创建完成后被立即调用
beforeMount:在挂载开始之前被调用
Mounted:挂载到实例上去之后调用
beforeUpdate:数据更新时调用,发生在虚拟 DOM 打补丁之前
updated:由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子
beforeDestroy:实例销毁之前调用。在这一步,实例仍然完全可用
Destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁
该组件类似HTML中的组件,但只能跳转本地页面。目标页面必须在pages.json中注册。
在页面中跳转,需要用到uni.navigateTo
。
uni.navigateTo(i
// url : ' / pages/view/bilLDetail?bizcode=e';
url: `/pages/view/billDetail?bizCode=${e}
})
个人理解:
navigateTo 与redirectTo只能打开非tabBar页面
switchTab只能打开tabBar页面
reLaunch 可以打开任意页面
uni-app页面打开方式和小程序打开方式一样,唯一的区别在于前缀不一样。
pages.json文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、底部的原生tabbar等。
pages节点的第一项为应用入口页(即首页)。
应用中新增/减少页面,都需要对 pages 数组进行修改。
文件名不需要写后缀,框架会自动寻找路径下的页面资源。
{
"pages": [
//pages数组中第一项表示应用启动页
{
"path": "pages/index/index" ,
"style" : {
"navigationBarTitleText":“首页",//导航标题
"navigationBarBackgroundcolor": “#F8F8F8",//导航背景颜色
"navigationBarTextstyle": "black"",//导航字体颜色
"enablePullDownRefresh" : true,//下拉刷新
"app-plus": { l //App节点配置项
"titleview": {},
"animationType" : “fade-in",
"animationDuration": 300
}
}
}
],
"globalstyle" : {
"navigationBarTextstyle" : "black",//导航字体颜色
"navigationBarTitleText" : "uni-app",//导航标题
"navigationBarBackgroundcolor" : “#F8F8F8",//导航背景颜色
"backgroundcolor" : "#F8F8F8”//页面背景颜色
}
}
tabBar 设置底部 tab 的表现,该节点也是一个对象,里面的常用属性有:
color :tab 上的文字初始的颜色,
selectColor :tab 上的文字选中时的颜色,
height :tabbar的高度,默认50px,
list :tab 的列表,最少2个,最多5个 tab。
list接收一个数组,数组中的每个项都是一个对象。对象的属性有:
pagePath : 页面路径,必须在 pages 中先定义,
text :tab 上按钮文字。不填的话,就是一个图标
iconPath :图片路径,
selectedIconPath :选中时的图片路径。
import store from '../store/index.js'
let ajaxTimes = 0;
const baseUrl = '/api' //dev环境
const request = (url, method, data) => {
const session = uni.getStorageSync('SESSION');
return new Promise((resolve, reject) => {
if (ignore.indexOf(url) == -1) {
uni.showLoading({
title: '加载中',
mask: true
});
}
ajaxTimes++;
uni.request({
method: method,
url: baseUrl + url,
data: data,
xhrFields: {
},
header: {
'content-type': 'application/x-www-form-urlencoded',
'X-Auth-Token': session
},
dataType: 'json',
}).then((response) => {
let [error, res] = response;
ajaxTimes--;
if (res.statusCode == 200 && res.data.status == 200) {
if (ajaxTimes === 0) {
setTimeout(function() {
uni.hideLoading();
}, 300);
}
resolve(res.data);
}
else if (res.statusCode == 200 && res.data.status == 403) {
uni.hideLoading();
uni.showToast({
title: '登录失效!',
icon: 'none'
})
reject(res.data);
uni.reLaunch({
url: '/pages/views/login/login'
})
}
else {
if (ajaxTimes === 0) {
setTimeout(function() {
uni.hideLoading();
}, 300);
}
uni.showToast({
title: res.data.msg,
icon: 'none'
})
reject(res.data);
}
}).catch(error => {
uni.hideLoading();
uni.showToast({
title: '网络错误!',
icon: 'none'
})
let [err, res] = error;
reject(err)
})
});
};
export default {
baseUrl,
request,
}
// 该文件用于合并所有接口文件并批量导出所有的接口请求
const requireApi = require.context(
// api 的相对路径
'.',
// 是否查询子目录
false,
// 查询文件的后缀
/.js$/
)
let module = {} // 用于存放接口并一起导出
requireApi.keys().forEach((key,index) => {
if(key == './http.js') return // 过滤http.js文件
Object.assign(module,requireApi(key))
})
//导出所有接口请求
export default module
*选择器
;uni.request(...)
;