一、概述

uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架。开发者通过编写 Vue.js 代码,uni-app 将其编译到iOS、Android、H5、微信小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台。做到一套代码,多端发行。

二、uni-app项目搭建

  1. 使用工具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 、组件的的引入

全局引入

  1. // 全局 CSS样式 的引入 app.vue内引入
  2. // App.vue
  3. @import './static/css/uni.css';
  4. // 实例 tab1页面 title
  5. // 全局组件的引入 main.js
  6. // 全局引入组件
  7. import pageHead from './components/page-head.vue'
  8. //组件的注册
  9. Vue.component('page-head', pageHead)

局部引入

  1. // 局部引入注册组件
  2. // script
  3. import uniSwiperDot from '@/components/uni-swiper-dot/uni-swiper-dot.vue'
  4. components: {
  5. uniSwiperDot
  6. },
  7. // html
  8. // <uni-swiper-dot></uni-swiper-dot>

组件(Component)是对数据和方法的简单封装

四、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-apponReady代替 vuemounted
  • 建议使用 uni-apponLoad 代替 vuecreated

3、路由跳转

路由

跳转方式 描述 触发方式
uni.navigateTo(OBJECT)打开新页面 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 调用 API uni.navigateTo 、使用组件
uni.redirectTo(OBJECT)页面重定向 关闭当前页面,跳转到应用内的某个页面。(不能跳转到tabBar)
调用 API uni.redirectTo 、使用组件
uni.navigateBack(OBJECT)页面返回 关闭当前页面,返回上一页面或多级页面。通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。 调用 API uni.navigateBack 、使用组件 、用户按左上角返回按钮、安卓用户点击物理back按键
uni.switchTab(OBJECT)tab 切换 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 调用 API uni.switchTab 、使用组件 、用户切换 Tab
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、接口调用

  1. // 默认方式
  2. uni.request({
  3. url: 'https://www.example.com/request',
  4. success: (res) => {
  5. console.log(res.data);
  6. }
  7. });
  8. // Promise
  9. uni.request({
  10. url: 'https://www.example.com/request'
  11. })
  12. .then(data => {//data为一个数组,数组第一项为错误信息,第二项为返回数据
  13. var [error, res] = data;
  14. console.log(res.data);
  15. })
  16. // Await
  17. function async request () {
  18. var [error, res] = await uni.request({
  19. url: 'https://www.example.com/request'
  20. });
  21. console.log(res.data);
  22. }

封装fly.js

6、iconfont的引用

在iconfont官网找到你需要用到的图标加入购物车,添加到你的项目
L772Q88M40I64FSGNX12BZ9.png

在我的项目中找到相应项目,下载至本地
image.png
下载后的文件解压,找到iconfont.css,将其复制到所需项目的common目录下
打开iconfont.css 将iconfont.css中的 @font-face 替换成网络资源
BGF7WXGMU_3$}EAZ}DDF%L4.png

接着在文件中引用
BBZR`A0RJ(B{))526Z3OBVI.png

也可以用线上方式引用
打开iconfont官网找到我的项目 ,复制相应图标代码
FE$LG27]_8T9NB48~$0QN66.png
![0~K)VXYTSS%L8%CV5EAY3Q.png
若添加新的图标,比较麻烦,需要重新下载文件至本地,与上述方法一致,
也可以重新复制网页上的代码,用第二种引用方式引用

7、下拉刷新 onPullDownRefresh

在 js 中定义 onPullDownRefresh 处理函数(和onLoad等生命周期函数同级),监听该页面用户下拉刷新事件。

  • 需要在 pages.json 里,找到的当前页面的pages节点,并在 style 选项中开启 enablePullDownRefresh
  • 当处理完数据刷新后,uni.stopPullDownRefresh 可以停止当前页面的下拉刷新。

image.png

在相应页面引用

  1. // 仅做示例,实际开发中延时根据需求来使用。
  2. export default {
  3. data: {
  4. text: 'uni-app'
  5. },
  6. onLoad: function (options) {
  7. setTimeout(function () {
  8. console.log('start pulldown');
  9. }, 1000);
  10. uni.startPullDownRefresh(); //刷新结束 图标隐藏
  11. },
  12. onPullDownRefresh() { //定义下拉时的动作 出现加载的图标
  13. console.log('refresh');
  14. setTimeout(function () {
  15. uni.stopPullDownRefresh();
  16. }, 1000);
  17. }
  18. }
  1. 👉👉 [动态禁用开启下拉刷新](https://ask.dcloud.net.cn/article/35134) 👈👈

默认原生的下拉刷新,App端原生的下拉刷新有2种样式可选择,下拉漏出雪花和下拉circle圈,没有办法设置刷新图标的位置,默认在顶部
使用 app-plus -> pullToRefresh 可以实现位置自定义 具体内容查看链接
下拉刷新控件的起始位置。仅对”circle”样式下拉刷新控件有效,用于定义刷新控件下拉时的起始位置。

  1. {
  2. "path" : "pages/index/index",
  3. "style" : {
  4. "navigationBarTitleText" : "uni-app",
  5. // "enablePullDownRefresh": true enablePullDownRefresh 与 pullToRefresh->support
  6. //同时设置时,后者优先级较高。
  7. "app-plus" : {
  8. "pullToRefresh" : {
  9. "support" : true,
  10. "offset" : "152px",
  11. "style" : "circle"
  12. }
  13. }
  14. }
  15. },

8、上拉加载 onReachBottom()

  1. onReachBottom(){ //页面到底时触发的函数
  2. console.log("加载中");
  3. if(){ // 翻页时更新页码pagenum+1,并触发新一轮请求,和第2部形成循环。
  4. uni.showLoading({
  5. title:'加载中'
  6. })
  7. }else{ //当翻到最后一页后 请求完成
  8. uni.showToast({
  9. title:"到底了"
  10. })
  11. }
  12. }

如果想要实现无感加载,还可以在.json文件中给onReachBottom()设定触发距离,这样不用拉到最底部就开始触发onReachBottom翻页:

  1. "onReachBottomDistance":300 //可以在当前页也可以全局设置

9、交互反馈

  • uni.showToast 显示消息提示框。
  • uni.showLoading 显示 loading 提示框,
  • uni.hideToast 隐藏消息提示框。
  • uni.hideLoading 隐藏 loading 提示框。
  • uni.showModal 显示模态弹窗,类似于标准 html 的消息框:alert、confirm。
  • uni.showActionSheet 隐藏

也可以引用插件市场里的modal

10、设备相关

获取设备相关

  1. uni.getSystemInfo({
  2. success: function (res) {
  3. console.log(res.windowWidth); //可使用窗口宽度
  4. console.log(res.windowHeight); //可使用窗口高度
  5. console.log(res.statusBarHeight) //状态栏高度
  6. } //根据需求调取 相应返回参数
  7. });

11、获取位置

  1. uni.getLocation({
  2. type: 'wgs84',
  3. geocode:true, //若想解析地址,要设置geocode为true 默认为false
  4. success: function (res) {
  5. console.log('当前位置的经度:' + res.longitude);
  6. console.log('当前位置的纬度:' + res.latitude);
  7. console.log('当前所在城市'+ res.address.city) //解析所得的地址
  8. }
  9. });

12、自定义组件

  1. //1、新建 组件.vue 文件
  2. //2、组件文档结构
  3. <template name="组件名称">
  4. <view>
  5. ......
  6. </view>
  7. </template>
  8. <script>
  9. export default {
  10. name: "组件名称",
  11. //属性
  12. props: {
  13. 属性名称: {
  14. type: String,//属性类型
  15. value: "值"
  16. },
  17. ......
  18. },
  19. //组件生命周期
  20. created:function(e){
  21. },
  22. methods: {
  23. 函数名称:function(obj){
  24. },
  25. }
  26. }
  27. </script>
  28. <style>
  29. //组件样式
  30. </style>

引用组件

  1. //1、引用组件
  2. import 组件名称 from "../../components/组件名.vue";
  3. //2、注册组件
  4. export default{
  5. components:{
  6. 组件名称
  7. },
  8. }
  9. //3、在试图模板中使用组件
  10. <组件名称 组件属性="对应的值"></组件名称>