首頁 >微信小程式 >小程式開發 >讓微信小程式開發如魚得水(實例)

讓微信小程式開發如魚得水(實例)

coldplay.xixi
coldplay.xixi轉載
2021-04-15 09:46:222520瀏覽

讓微信小程式開發如魚得水(實例)

  關於微信小程式開發一直想寫一篇相關的文章總結和記錄下,結果拖延症犯了遲遲沒有下筆;這不最近天氣不錯,於是找一個空閒的下午將這篇文章輸出下(好像跟天氣沒啥關係),那我們就開始吧!

注意:本文預設開發者對微信小程式開發有一定語法基礎。 小程式開發文件

相關免費學習推薦:微信小程式開發

#微信小程式小結

  在接觸的微信小程式開發過程中,不難發現微信小程式為了方便開發人員入手對很多底層api進行了很好的封裝,例如針對介面請求的wx.request(),針對路由跳轉和頁面導航的wx.switchTab、wx.navigateTo···等。雖然在某種程度上簡化了開發,但是對於專案工程的系統化建置還是不夠的,因此本人在對比以前基於Vue開發專案的經驗和自身的開發習慣,總結出如下3點可供參考:

  • 1、全域變數與設定資訊統一管理;

  • #2、封裝路由守衛相關api:vue-routerrouter.beforeEach()router.afterEach()真的香;

  • 3、介面請求公用資訊進一步擷取封裝;

  • 4、封裝介面的請求和回應攔截api:axiosaxios.interceptors.request.use()axios. interceptors.response.use()用過的都說好;

#從上述四點出發,對微信小程式初始化工程進行規範優化,能夠很大程度提高開發效率和進行專案維護管理。封裝的好處不僅體現在呼叫的方便上,也體現在管理的方便上,同時,公共操作集中處理,很大程度減少繁雜重複程式碼。

一、專案初始化

   新建微信小程式項目,在專案下新建下列目錄與檔案:

  • config資料夾:統一管理可設定的資訊和變數;
    • erroList.js:介面報錯錯誤碼符合清單檔案;
    • globalData.js:全域變數統一管理檔案(相當於vuex);
    • keys.js:可設定係統資訊管理檔案(全域常數命名等);
  • pages資料夾:小程式頁面檔案管理資料夾(每個頁面一個子資料夾目錄);
  • router資料夾:路由管理檔案件;
    • router.js:對微信小程式5種路由導航api的封裝;
    • routerConfig.js:頁面路由名稱和路徑匹配設定檔;
    • routerFilter.js:路由前置攔截封裝;
  • servers檔案件:介面請求服務管理資料夾;
    • apis資料夾:request請求封裝管理和介面api配置管理資料夾;
      • request.js:對wx.requestPromise封裝;
      • xxx.js:對應模組的介面管理檔;
    • requestFilter.js:介面請求和回應攔截封裝檔;
  • 其他都是初始化預設檔;

二、路由跳轉與路由守衛封裝

#1、路由跳轉封裝

  微信小程式官方文件為開發者提供了5種路由跳轉的api,每一種都有其特殊的用法:

  根據其用法,我們對路由api進行以下封裝:微信小程式路由跳轉最後對應push、replace、pop、relaunch、switchTab;routes對應routeConfig.js中路由路徑的設定;routerFilter對應routerFilter.js文件,對路由跳轉之前的邏輯進行處理;

routeConfig.js(每次新增頁面後需要手動新增):

export const routes = 
  {
    INDEX: "/pages/index/index",
    TEST: "/pages/test/test",
  }export default {...routes};

routerFilter.js:

export default () => {
  ···  //路由跳转前逻辑处理}

router.js(routerFilter負責路由跳轉前公共操作處理,在success和fail中對路由跳轉後的公共操作進行處理):

import routes from "../router/routerConfig";import routerFilter from "./routerFilter"/**
 * 对wx.navigateTo的封装
 * @param {路由} path 
 * @param {参数} params 
 * @param {事件} events 
 */const push = (path, params, events) => {
  routerFilter()
  wx.navigateTo({
    url: routes[path] + `?query=${JSON.stringify(params)}`,
    events: events,
    success(res) {
      console.log(res);
    },
    fail(err) {
      console.log(err);
    }
  })}/**
 * 对wx.redirectTo的封装
 * @param {路由} path 
 * @param {参数} params 
 */const replace = (path, params) => {
  routerFilter()
  wx.redirectTo({
    url: routes[path] + `?query=${JSON.stringify(params)}`,
    success(res) {
      console.log(res);
    },
    fail(err) {
      console.log(err);
    }
  })}/**
 * 对wx.navigateBack的封装
 * @param {返回的层级} number 
 */const pop = (number) => {
  routerFilter()
  wx.navigateBack({
    delta: number,
    success(res) {
      console.log(res);
    },
    fail(err) {
      console.log(err);
    }
  })}/**
 * 对wx.reLaunch的封装
 * @param {路由} path 
 * @param {参数} params 
 */const relaunch = (path, params) => {
  routerFilter()
  wx.reLaunch({
    url: routes[path] + `?query=${JSON.stringify(params)}`,
    success(res) {
      console.log(res);
    },
    fail(err) {
      console.log(err);
    }
  })}/**
 * 对tabbar的封装
 * @param {路由} path 
 */const switchTab = (path) => {
  routerFilter()
  wx.switchTab({
    url: routes[path],
    success(res) {
      console.log(res);
    },
    fail(err) {
      console.log(err);
    }
  })}module.exports = {
  push,
  replace,
  pop,
  relaunch,
  switchTab}

#2、全域註冊和使用

app.js中對封裝的路由api進行全域註冊:

import router  from "./router/router.js"//全局注册wx.router = router

在頁面邏輯中使用:

//index页面跳转test页面 gotoTest(){
   wx.router.push("TEST")}

三、介面請求Promise封裝

  對於同一個專案而言,微信小程式apiwx.request()中許多參數都是相同的,如果直接使用,需要將這些重複參數一遍又一遍的copy,雖然copy很簡單,但是當有一個參數改變了需要找到所有接口一個一個修改,維護起來費勁,再者看著也難受呀;

  借鉴axios对请求的封装,将wx.request()封装为Promise形式岂不美哉:

request.js:

import formatError from "../requestFilter"const app = getApp()/**
 * 接口请求封装
 * @param {请求方式} method 
 * @param {请求的url} url 
 * @param {请求传递的数据} data 
 */const request = (method, url, data) => {
  //设置请求头
  const header = {
    ···  }
  //promise封装一层,使得调用的时候直接用then和catch接收
  return new Promise((resolve, reject) => {
    wx.request({
      method: method,
      url: app.globalData.host + url, //完整的host
      data: data,
      header: header,
      success(res) {
        //对成功返回的请求进行数据管理和统一逻辑操作
        ···        resolve(res.data)
      },
      fail(err) {
        wx.showToast({
          title: '网络异常,稍后再试!',
          mask: true,
          icon: 'none',
          duration: 3000
        })
      }
    })
  })}export default request;

具体使用

以user.js为例:

import request from "./request";// 获取用户openidexport const usrInfos = data => request("POST", "/user/usrInfos", data);

index页面调用:

//index.js//获取应用实例const app = getApp()import { usrInfos } from "../../servers/apis/user"Page({
  onLoad: function () {
    //获取用户信息
    usrInfos({
      uid: "xxxx"
    })
      .then(res => {
        console.log(res)
      })
      .catch(err => {
        console.log(err)
      })
  }})

四、接口的请求和响应拦截封装

  axiosaxios.interceptors.request.use()axios.interceptors.response.use()分别对应接口请求前的拦截处理和数据响应后的拦截处理;根据这个原理我们对微信小程序的响应也做拦截封装,对接口请求返回错误进行统一管理输出:

request.js

import formatError from "../requestFilter"const app = getApp()···const request = (method, url, data) => {
  ···  return new Promise((resolve, reject) => {
    wx.request({
      ···      success(res) {
        //对成功返回的请求进行数据管理和统一逻辑操作
        if(res.statusCode === 200){ //请求返回成功
          if(res.data && res.data.code === "SUCCESS"){ //后端对接口请求处理成功,返回数据给接口调用处
            resolve(res.data)  //then接收
          }else{		//后端对也请求判断后认为不合逻辑报错
            formatError(res)   //统一的报错处理逻辑
            reject(res.data) 	//catch接收
          } 
        }else{
          reject(res.data)		//catch接收
        }
      },
      fail(err) {		//请求不通报错
        wx.showToast({
          title: '网络异常,稍后再试!',
          mask: true,
          icon: 'none',
          duration: 3000
        })
      }
    })
  })}export default request;

requestFilter.js

requestFilter.js中可以做很多对报错的处理,这里用一个简单的toast处理示范下:

/**
 * 对接口返回的后端错误进行格式转化
 * @param {接口成功返回的数据} res 
 */const formatError = (err =>{
  wx.showToast({
    title: err.message,
    mask: false,
    icon: 'none',
    duration: 3000
  })}export default formatError;

对报错进行统一处理需要明确数据规:

  • 制定统一的报错码管理规范;
  • 制定前后端统一的接口请求数据返回格式;

五、全局数据管理

  对于数据的管理在小项目的开发中显得不那么重要,但是随着项目越来越大,数据越来越多,一个很好的数据管理方案能够有效地避免很多bug,这也是vuex能够在vue生态中占有一席之地的原因。秉承着合理管理数据的原则,对于该封装的数据坚决封装,对于该分模块管理的配置坚决分块管理:

globalData.js

微信小程序中全局的数据管理放在app.jsglobalData属性中,当数据太多或者app.js逻辑太复杂时,将全局数据提取出来单独管理的确是个好方案:

export default {
  ···
  host: "http://www.wawow.xyz/api/test", //接口请求的域名和接口前缀 
  hasConfirm: "" //是否已经有了confirm实例
  currentPage: ""
  ···}

keys.js

keys.js属于个人开发中的习惯操作,将项目中可能用到的一些常量名称在此集中管理起来,十分方便调用和修改维护:

export default {
  ···  TOKEN: "token",
  STORAGEITEM: "test"
  ···}

全局引用和注册

引入app.js:

import router  from "./router/router.js"import keys from "./config/keys"import globalData from "./config/globalData"//全局注册wx.router = router
wx.$KEYS = keys//app.jsApp({
  //监听小程序初始化
  onLaunch(options) {
    //获取小程序初始进入的页面信息
    let launchInfos = wx.getLaunchOptionsSync()
    //将当前页面路由存入全局的数据管理中
    this.globalData.currentPage = launchInfos.path  },
  ···  //全局数据存储
  globalData: globalData})

使用

在页面代码逻辑中可以通过app.globalData.hostwx.$KEYS.TOKEN方式进行调用;

六、总结

  上述关于微信小程序开发的几个方面都是在实践中学习和总结的,技术层面的实现其实很容易,但是个人觉得开发规范项目工程构建才是一个项目的重要基础;完善的规范能够有效的提高开发效率和开发者之间非必要的扯皮!合理的项目工程构建能够优化开发逻辑,提高代码逻辑易读性,减少后期项目的管理时间,同时给予项目更大的扩展性。

相关学习推荐:小程序开发教程

以上是讓微信小程式開發如魚得水(實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除