uni-app移动端开发技巧总结(一)

简介: uni-app移动端开发技巧总结

一.pages.json常用配置总结


pages.json 文件用来对 uni-app 进行全局配置,决定页面文件的路径、窗口样式、原生的导航栏、**底部的原生tabbar **等。


1. pages 设置页面路径及窗口表现


pages节点的第一项为应用入口页(即首页)

应用中新增/减少页面,都需要对 pages 数组进行修改

文件名不需要写后缀,框架会自动寻找路径下的页面资源

pages 节点接收一个数组,数组每个项都是一个对象。该对象的属性值有:


(1) path : 配置页面的路径,字符串类型


(2) style :配置该页面独有的一些窗口表现 ,对象类型


2.tabBar 设置底部 tab 的表现


该节点也是一个对象,里面的常用属性有:


(1) color :tab 上的文字初始的颜色


(2) selectColor :tab 上的文字选中时的颜色


(3) fontSize :文字大小,默认10px


(4) height :tabbar的高度,默认50px


(5)iconWidth 图标默认宽度


(6) list :tab 的列表,最少2个,最多5个 tab


list 接收一个数组,数组中的每个项都是一个对象。对象的属性有:


pagePath : 页面路径,必须在 pages 中先定义

text :tab 上按钮文字。不填的话,就是一个图标

iconPath :图片路径

selectedIconPath :选中时的图片路径

(7) midButton: 中间按钮


仅在 list 项为偶数时有效,有以下属性:


width :中间按钮的宽度

height :中间按钮的高度,可以大于 tabBar 高度,达到中间凸起的效果

text :中间按钮的文字

iconPath :中间按钮的图片路径

iconWidth :中间图标的宽度。(高度等比缩放)

!注意! :midButton没有pagePath,需监听点击事件,自行处理点击后的行为逻辑。监听点击事件为调用API:uni.onTabBarMidButtonTap


3. globalStyle和style的常用属性


globalStyle和style都是对象类型的节点,大部分的样式写在两个节点里都是可行的。主要用于设置窗口的表现,一个是全局的,一个是单独页面的。有如下的属性:


navigationBarBackgroundColor :导航栏背景颜色(同状态栏背景色)。默认#000000(即黑色)


navigationBarTextStyle :导航栏标题颜色及状态栏前景颜色,仅支持 black/white。默认white(白色)


navigationBarTitleText : 导航栏标题文字内容


bounce :页面回弹效果,设置为 “none” 时关闭效果。(建议在全局设为"none")


scrollIndicator : 右侧滚动条显示策略,设置为 “none” 时不显示滚动条。按情况设置。


navigationStyle : 导航栏样式,仅支持 default/custom。默认为"default"。"custom"即取消默认的原生导航栏,使用自定义导航栏。


app-plus :设置编译到 App 平台的特定样式。是一个对象类型的属性


(1)app-plus常用属性:


bounce : 页面回弹效果,设置为 “none” 时关闭效果。


titleNView : 导航栏。对象格式。如果取为false,则取消导航栏。


titleNView的常用属性:

backgroundColor :导航栏的背景颜色,会覆盖掉navigationBarBackgroundColor


titleColor :标题文字颜色,可以设置更多rgb的颜色。


titleText :标题文字内容


titleSize :标题文字字体大小


autoBackButton :标题栏控件是否显示左侧返回按钮


titleIcon :标题图标,位于标题的左部


titleIconRadius : 标题图标圆角,取值格式为"XXpx",其中XX为像素值(逻辑像素),如"10px"表示10像素半径圆角。


titleAlign :标题在导航栏上的位置。可取值: (“center”-居中对齐; “left”-居左对齐;)


autoBackButton :是否显示左侧返回按钮 ,默认为true,取消返回按钮,设为false


二.常用功能和开发技巧总结


1.关闭导航栏返回按钮


在要关闭返回按钮的style中添加如下的代码:


"app-plus":{
        "titleNView":{
          "autoBackButton":false
        }
      }


2.禁止屏幕旋转时横屏


在App.vue中的onLaunch生命周期函数中添加如下的代码:


onLaunch: function () {  
    // 锁定竖屏  
    plus.screen.lockOrientation("portrait-primary");  
}


3.设置应用的启动时间


在App.vue中的onLaunch生命周期函数中添加如下的代码:


setTimeout(() => {
    plus.navigator.closeSplashscreen();
}, 2000);


4.禁止手机某页面右滑返回

在对应页面的vue文件中添加onBackPress生命周期函数,并返回true。


onBackPress(e) {//禁止返回
      return true;
    }


5.注册功能的总结


当点击注册按钮时,先要判断账号密码的格式是否符合要求。如果判断后,发现格式不符合要求的话,就要弹出Toast消息提示框,提示相应的错误。

消息提示框uni.showToast


uni.showToast({
            title:'提示信息',
            icon:"none",//提示框的类型,一般都为none
            position:"bottom",//提示框的位置。
              duration:600//消息显示时间的毫秒数
          })


如果注册填写的账号密码格式填写正确,点击注册按钮时就向服务器发送请求,如果注册成功的话,就显示Toast消息提示框,消息提示框的icon不用填,设置一个duration显示时间。之后设置一个定时器,用于页面的跳转,跳转到login登录页面。如果账号注册失败也要显示失败的Toast提示。


示例代码如下:


          // 发送注册的请求
          this.$post(api.USER_REGISTER,{
            userName:this.username,
            password:this.password,
            phonenumber:this.phoneNum,
            sex:this.sex
          }).then(res =>{
            //请求成功
            if(res.code == 200){
            //显示成功的Toast
              uni.showToast({
                title:'注册成功!',
                duration:600
              })
              //跳转到注册页面
              setTimeout(function(){
                uni.navigateTo({
                  url:'./login'
                })
              },600)
            }else{
              //显示错误的Toast信息
              uni.showToast({
                title:res.msg,
                icon:"none",
                position:'bottom'
              })
            }
          })


6.封装请求和API


uni-app有提供发起http请求的功能的api但是,应用各页面很多时候要发起非常多的请求,为了简化代码,所以要封装请求和API。把封装的代码放在根目录下的common目录下。

uni-app发起请求的方法uni.request(OBJECT)


uni.request({
    method:'请求的方式', // GET,POST,PUT等
    url:'请求的url地址',
    header:{}, //请求头,是一个对象类型
    data:{}, //请求的参数
    dataType:'json', //一般都设为json,会尝试对返回的数据做一次 JSON.parse
    success:function(){}, //接口请求成功时执行的回调函数
    fail:function(){} // 接口调用失败时执行时执行的回调函数
})

把请求的代码封装在common下的request.js模块下:

下面是示例代码:


//把模块内定义的方法暴露出去
export default{
  // 封装get请求的发送
  get(url,data){
    // 同步获取本地的token
    let token = uni.getStorageSync('token');
    // 封装get请求
    return new Promise((resolve,reject)=>{
      uni.request({
        method:'GET',
        url:url,
        data:data,
        header:{
          'authorization':token
        },
        dataType:'json',
        success: (res) => {
          console.log("get--success")
          // 401:未授权(登录已过期)
          if(res.data.code === 401){
            // 移除本地的token
            uni.removeStorageSync('token');
            // 显示模态弹窗
            uni.showModal({
              title:'提示',
              content:'登录认证已过期,请重新登录!',
              success: (res) => {
                // 1.如果用户点击了确认,跳转到登录页面
                if(res.confirm){
                  uni.navigateTo({
                    url:'/pages/startUp/login.vue'
                  });
                }else if(res.cancel){
                  // 用户点击了取消,则什么也不做
                  console.log("用户点击了取消")
                }
              }
            });
          }
          resolve(res.data);
        },
        fail: (err) => {
          console.log(err)
          uni.showToast({
            title:"网络连接超时,请下拉刷新!",
            icon:"none",
            duration:1500
          });
          reject(err)
        }
      })
    });
  },
  //封装一个post请求
  post(url,data){
    // 同步获取本地的token指令
    let token = uni.getStorageSync('token')
    return new Promise((resolve,reject)=>{
      uni.request({
        method:'POST',
        url:url,
        data:data,
        header:{
          'content-type':'application/json',
          'authorization':token
        },
        dataType:'json',
        success:function(res){
          console.log("post---success")
          console.log("post---url:"+url)
          console.log("post---code:"+res.data.code)
          if(res.data.code === 401){
            uni.removeStorageSync('token');
            uni.showModal({
              title:'提示',
              content:"登录已过期,请重新登录!",
              success: (res) => {
                if(res.confirm){
                  uni.navigateTo({
                    url:'/pages/startUp/login.vue'
                  })
                }else if(res.cancel){
                  console.log('用户点击取消');
                }
              }
            });
          }
          resolve(res.data)
        },
        fail: (err) => {
          console.log("失败")
          uni.showToast({
            title:"接口请求失败,请稍后再试!",
            icon:"none"
          })
          reject(err)
        }
      });
    });
  },
  // 封装一个put请求
  put(url,data){
    let token = uni.getStorageSync('token');
    return new Promise((resolve,reject)=>{
      uni.request({
        method:'PUT',
        url:url,
        data:data,
        header:{
          'content-type':'application/json',
          'authorization':token
        },
        dataType:'json',
        success: (res) => {
          if(res.data.code === 401){
            uni.removeStorageSync('token')
            uni.showModal({
              title:'提示',
              content:'登录已过期,请重新登录!',
              success: (res) => {
                if(res.confirm){
                  uni.navigateTo({
                    url:'/pages/startUp/login.vue'
                  })
                }else if(res.cancel){
                  console.log("用户点击取消")
                }
              }
            });
          }
          resolve(res.data)
        },
        fail: (err) => {
          uni.showToast({
            title:"接口请求失败,请稍后再试",
            icon:'none'
          })
          reject(err)
        }
      })
    })
  }
}


其中的每一个请求的方法都返回promise。

之后,还要根据接口文档来封装一个apiUtil.js的接口模块,下面是示例代码:


var ip = uni.getStorageSync('serverIp');
var baseUrl = 'http://'+ ip;
export default{
  SERVER_BASE:baseUrl,
  //用户登录
  USER_LOGIN:baseUrl + '/prod-api/api/login',
  //注册
  USER_REGISTER:baseUrl + '/prod-api/api/register',
  // 获取用户个人信息
  GET_USER_INFO:baseUrl+ '/prod-api/api/common/user/getInfo',
  // 获取首页轮播图
  GET_INDEX_BANNER_IMG:baseUrl+'/prod-api/api/rotation/list',
  // 获取所有服务信息
  GET_SERVICE_INFO:baseUrl+'/prod-api/api/service/list'
}


ip是每一个请求都有的IP地址,通过获取注册时的本地存储里面获取。baseurl对ip地址和http请求拼接一下。

最后就是暴露当前封装的API接口。

封装好这两个模块后,还好把这两个模块在main.js中进行导入和对vue的原型进行绑定。示例代码如下


//导入封装好的模块
import request from './common/request.js'
import api from './common/apiUtil.js'
// 将起绑定到Vue的原型上面去
Vue.prototype.$api = api
Vue.prototype.$get = request.get
Vue.prototype.$post = request.post
Vue.prototype.$put = request.put


7.本地数据缓存


(1) uni.setStorage( OBJECT )

将数据存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个异步接口。

OBJECT 参数说明:


image.png

示例代码:


uni.setStorage({
  key: 'storage_key',
  data: 'hello',
  success: function () {
    console.log('success');
  }
});


(2) uni.setStorageSync( KEY , DATA )

将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。

参数说明


image.png


示例代码:


uni.setStorageSync('storage_key', 'hello');



(3) uni.getStorage( OBJECT )

从本地缓存中异步获取指定 key 对应的内容。

OBJECT 参数说明:


image.png


success函数传入的参数说明:


参数名 参数类型 说明
data Any key 对应的值


示例代码如下:


uni.getStorage({
  key: 'storage_key',
  success: function (res) {
    console.log(res.data);
  }
});


相关文章
|
2月前
|
缓存 移动开发 JavaScript
如何优化UniApp开发的App的启动速度?
如何优化UniApp开发的App的启动速度?
600 139
|
2月前
|
移动开发 JavaScript weex
UniApp开发的App在启动速度方面有哪些优势和劣势?
UniApp开发的App在启动速度方面有哪些优势和劣势?
364 137
|
2月前
|
数据采集 JavaScript 前端开发
开发比分App?你缺的不是程序员
开发体育比分App,关键不在代码,而在懂体育、懂数据、懂用户。明确定位、理清需求、选好数据源,再找专业的产品、数据与技术人才协同,才能少走弯路。程序员最后入场,效率最高。
234 154
|
3月前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
172 0
|
5月前
|
人工智能 文字识别 小程序
旅游社用什么工具收报名 + 资料?不开发 App 也能自动收集信息
本文探讨了旅游行业中报名信息收集的常见痛点及解决方案,重点介绍了二维码表单工具在提升信息收集效率、简化操作流程方面的优势。通过对比多种工具,分析其适用场景与实际应用逻辑,为一线旅游从业者提供高效、低成本的执行参考。
|
6月前
|
容器
HarmonyOS NEXT仓颉开发语言实战案例:外卖App
仓颉语言实战分享,教你如何用仓颉开发外卖App界面。内容包括页面布局、导航栏自定义、搜索框实现、列表模块构建等,附完整代码示例。轻松掌握Scroll、List等组件使用技巧,提升HarmonyOS应用开发能力。
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
332 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
308 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
5月前
|
Rust 安全 前端开发
Github 轻松斩获30k+ Star,桌面应用开发太丝滑啦,Tauri框架能重塑桌面App开发?别错过,抓紧上车
Tauri 是一个基于 Rust 的开源框架,用于构建轻量级、高性能、安全的跨平台桌面及移动应用。它利用系统 WebView 渲染前端界面,后端由 Rust 编写,具备出色的性能和安全性。相比 Electron,Tauri 应用体积更小、启动更快,且默认权限更安全。它支持 React、Vue、Svelte 等主流前端框架,并提供自动更新、CLI 工具链、资源注入优化等功能,适用于生产力工具、开发者工具、数据分析、AI 应用等多种场景。目前 Tauri 在 GitHub 上已获得超过 30,000 Star,社区活跃,是现代桌面应用开发的理想选择。
616 0

热门文章

最新文章