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

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

Apr 15, 2021 am 09:46 AM
微信小程式開發

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

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

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

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

#微信小程式小結

  在接觸的微信小程式開發過程中,不難發現微信小程式為了方便開發人員入手對很多底層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。如有侵權,請聯絡admin@php.cn刪除

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用