一、概述
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架。开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS、Android、H5、微信小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。做到一套代码,多端发行。
二、uni-app项目搭建
使用工具Hbuilderx[ Download](https://www.dcloud.io/hbuilderx.html)<br /> 演示
三、uni-app项目结构
1、项目目录简介
官网
┌─components uni-app组件目录
│ └─comp-a.vue 可复用的(comp-a.vue)组件
|─pages 业务页面文件存放的目录
│ ├─index
│ | └─index.vue index页面
│ └─list
│ └─list.vue list页面
├─static 存放应用引用静态资源(如图片、视频等)的目录,**注意:**静态资源只能存放于此
├─main.js Vue初始化入口文件
├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期
├─manifest.json 配置应用名称、appid、logo、版本等打包信息,详见
└─pages.json 配置页面路由、导航条、选项卡等页面类信息,详见
2、CSS 、组件的的引入
全局引入
// 全局 CSS样式 的引入 app.vue内引入// App.vue@import './static/css/uni.css';// 实例 tab1页面 title// 全局组件的引入 main.js// 全局引入组件import pageHead from './components/page-head.vue'//组件的注册Vue.component('page-head', pageHead)
局部引入
// 局部引入注册组件// scriptimport uniSwiperDot from '@/components/uni-swiper-dot/uni-swiper-dot.vue'components: {uniSwiperDot},// html// <uni-swiper-dot></uni-swiper-dot>
四、uni-app 项目内容
1、页面基本样式
(1)底部的原生tabbar pages.json tabBar
(2)Index页面 定义组件
2、生命周期
| 周期名称 | 说明 |
|---|---|
| onLaunch | 当uni-app 初始化完成时触发(全局只触发一次) |
| onShow | 当 uni-app 启动,或从后台进入前台显示 |
| onHide | 当 uni-app 从前台进入后台 |
| onError | 当 uni-app 报错时触发 |
| onPullDownRefresh | 监听用户下拉动作,一般用于下拉刷新,参考 |
| onReady | 监听页面初次渲染完成 |
- 建议使用
uni-app的onReady代替vue的mounted。 - 建议使用
uni-app的onLoad代替vue的created。
3、路由跳转
| 跳转方式 | 描述 | 触发方式 |
|---|---|---|
| uni.navigateTo(OBJECT)打开新页面 | 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 |
调用 API uni.navigateTo 、使用组件 |
| uni.redirectTo(OBJECT)页面重定向 | 关闭当前页面,跳转到应用内的某个页面。(不能跳转到tabBar) |
调用 API uni.redirectTo 、使用组件 |
| uni.navigateBack(OBJECT)页面返回 | 关闭当前页面,返回上一页面或多级页面。通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。 |
调用 API uni.navigateBack 、使用组件 |
| uni.switchTab(OBJECT)tab 切换 | 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 | 调用 API uni.switchTab 、使用组件 |
| uni.reLaunch(OBJECT)重加载 | 关闭所有页面,打开到应用内的某个页面。 | 调用 API uni.reLaunch 、使用组件 |
navigateTo,redirectTo只能打开非 tabBar 页面。switchTab只能打开tabBar页面。reLaunch可以打开任意页面。- 页面底部的
tabBar由页面决定,即只要是定义为tabBar的页面,底部都有tabBar。 - 不能在
App.vue里面进行页面跳转。 - H5端页面刷新之后页面栈会消失,此时
navigateBack不能返回,如果一定要返回可以使用history.back()。
4、数据处理
本地数据缓存
| 处理方式 | 代码说明 | 说明 |
|---|---|---|
| 存储数据 | uni.setStorage(OBJECT) | 异步将对象存储到本地缓存 |
| uni.setStorageSync(KEY,DATA) | 同步将键值对存储到本地缓存 | |
| 取出数据 | uni.getStorage(OBJECT) | 异步从缓存获取指定key的内容 |
| uni.getStorageSync(KEY) | 同步从缓存获取指定key的内容 | |
| uni.getStorageInfo(OBJECT) | 异步获取当前缓存的相关信息 | |
| 移除数据 | uni.removeStorage(OBJECT) | 异步移除缓存中的key |
| uni.removeStorageSync(KEY) | 同步移除缓存中的key | |
| 清空本地缓存 | uni.clearStorage() | 异步清空本地缓存 |
| uni.clearStorageSync() | 同步清空本地缓存 |
数据的传递(页面监听器)全局
| 方法 | 说明 |
|---|---|
| uni.$emit(eventName,OBJECT) | 触发全局的自定事件。附加参数都会传给监听器回调。 |
| uni.$on(eventName,callback) | 监听全局的自定义事件。事件可以由 uni.$emit 触发,回调函数会接收所有传入事件触发函数的额外参数。 |
| uni.$once(eventName,callback) | 监听全局的自定义事件。事件可以由 uni.$emit 触发,但是只触发一次,在第一次触发之后移除监听器。 |
| uni.$off([eventName, callback]) | 移除全局自定义事件监听器。 |
5、接口调用
// 默认方式uni.request({url: 'https://www.example.com/request',success: (res) => {console.log(res.data);}});// Promiseuni.request({url: 'https://www.example.com/request'}).then(data => {//data为一个数组,数组第一项为错误信息,第二项为返回数据var [error, res] = data;console.log(res.data);})// Awaitfunction async request () {var [error, res] = await uni.request({url: 'https://www.example.com/request'});console.log(res.data);}
6、iconfont的引用
在iconfont官网找到你需要用到的图标加入购物车,添加到你的项目
在我的项目中找到相应项目,下载至本地
下载后的文件解压,找到iconfont.css,将其复制到所需项目的common目录下
打开iconfont.css 将iconfont.css中的 @font-face 替换成网络资源
接着在文件中引用
也可以用线上方式引用
打开iconfont官网找到我的项目 ,复制相应图标代码![FE$LG27]_8T9NB48~$0QN66.png](/uploads/projects/moreface@ddymm3/215ac9b80d7006f23dd4e090e1526241.png)

在相应页面引用
// 仅做示例,实际开发中延时根据需求来使用。export default {data: {text: 'uni-app'},onLoad: function (options) {setTimeout(function () {console.log('start pulldown');}, 1000);uni.startPullDownRefresh(); //刷新结束 图标隐藏},onPullDownRefresh() { //定义下拉时的动作 出现加载的图标console.log('refresh');setTimeout(function () {uni.stopPullDownRefresh();}, 1000);}}
👉👉 [动态禁用开启下拉刷新](https://ask.dcloud.net.cn/article/35134) 👈👈
默认原生的下拉刷新,App端原生的下拉刷新有2种样式可选择,下拉漏出雪花和下拉circle圈,没有办法设置刷新图标的位置,默认在顶部
使用 app-plus -> pullToRefresh 可以实现位置自定义 具体内容查看链接
下拉刷新控件的起始位置。仅对”circle”样式下拉刷新控件有效,用于定义刷新控件下拉时的起始位置。
例
{"path" : "pages/index/index","style" : {"navigationBarTitleText" : "uni-app",// "enablePullDownRefresh": true enablePullDownRefresh 与 pullToRefresh->support//同时设置时,后者优先级较高。"app-plus" : {"pullToRefresh" : {"support" : true,"offset" : "152px","style" : "circle"}}}},
8、上拉加载 onReachBottom()
onReachBottom(){ //页面到底时触发的函数console.log("加载中");if(){ // 翻页时更新页码pagenum+1,并触发新一轮请求,和第2部形成循环。uni.showLoading({title:'加载中'})}else{ //当翻到最后一页后 请求完成uni.showToast({title:"到底了"})}}
如果想要实现无感加载,还可以在.json文件中给onReachBottom()设定触发距离,这样不用拉到最底部就开始触发onReachBottom翻页:
"onReachBottomDistance":300 //可以在当前页也可以全局设置
9、交互反馈
- uni.showToast 显示消息提示框。
- uni.showLoading 显示 loading 提示框,
- uni.hideToast 隐藏消息提示框。
- uni.hideLoading 隐藏 loading 提示框。
- uni.showModal 显示模态弹窗,类似于标准 html 的消息框:alert、confirm。
- uni.showActionSheet 隐藏
也可以引用插件市场里的modal
10、设备相关
获取设备相关
uni.getSystemInfo({success: function (res) {console.log(res.windowWidth); //可使用窗口宽度console.log(res.windowHeight); //可使用窗口高度console.log(res.statusBarHeight) //状态栏高度} //根据需求调取 相应返回参数});
11、获取位置
uni.getLocation({type: 'wgs84',geocode:true, //若想解析地址,要设置geocode为true 默认为falsesuccess: function (res) {console.log('当前位置的经度:' + res.longitude);console.log('当前位置的纬度:' + res.latitude);console.log('当前所在城市'+ res.address.city) //解析所得的地址}});
12、自定义组件
//1、新建 组件.vue 文件//2、组件文档结构<template name="组件名称"><view>......</view></template><script>export default {name: "组件名称",//属性props: {属性名称: {type: String,//属性类型value: "值"},......},//组件生命周期created:function(e){},methods: {函数名称:function(obj){},}}</script><style>//组件样式</style>
引用组件
//1、引用组件import 组件名称 from "../../components/组件名.vue";//2、注册组件export default{components:{组件名称},}//3、在试图模板中使用组件<组件名称 组件属性="对应的值"></组件名称>
