知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當前位置>首頁 » 新聞資訊 » 小程序相關(guān) >
讓微信小程序開發(fā)如魚得水
發(fā)表時間:2021-1-11
發(fā)布人:葵宇科技
瀏覽次數(shù):78
在接觸的微信小程序開發(fā)過程中,不難發(fā)現(xiàn)微信小程序為了方便開發(fā)人員入手對很多底層api進行了很好的封裝,比如針對接口請求的wx.request()
,針對路由跳轉(zhuǎn)和頁面導航的wx.switchTab、wx.navigateTo···
等。雖然在一定程度上簡化了開發(fā),但是對于項目工程的系統(tǒng)化構(gòu)建還是不夠的,因此本人在對比以前基于Vue開發(fā)項目的經(jīng)驗和自身的開發(fā)習慣,總結(jié)出如下3點可供參考:
- 1、全局變量和配置信息統(tǒng)一管理;
- 2、封裝路由守衛(wèi)相關(guān)api:
vue-router
的router.beforeEach()
和router.afterEach()
真的香; - 3、接口請求公共信息進一步提取封裝;
- 4、封裝接口的請求和響應攔截api:
axios
的axios.interceptors.request.use()
和axios.interceptors.response.use()
用過的都說好;
從上述四點出發(fā),對微信小程序初始化工程進行規(guī)范優(yōu)化,能夠很大程度提高開發(fā)效率和進行項目維護管理。封裝的好處不只體現(xiàn)在調(diào)用的方便上,也體現(xiàn)在管理的方便上,同時,公共操作集中處理,很大程度減少繁雜重復代碼。
一、項目初始化
???新建微信小程序項目,在項目下新建如下目錄和文件:
config文件夾:統(tǒng)一管理可配置的信息和變量;
- erroList.js:接口報錯
錯誤碼
匹配列表文件; - globalData.js:
全局變量
統(tǒng)一管理文件(相當于vuex); - keys.js:可配置系統(tǒng)信息管理文件(全局常量命名等);
- erroList.js:接口報錯
- pages文件夾:小程序頁面文件管理文件夾(每個頁面一個子文件夾目錄);
router文件夾:路由管理文件件;
- router.js:對微信小程序
5種路由導航
api的封裝; - routerConfig.js:頁面路由名稱和路徑匹配配置文件;
- routerFilter.js:路由前置
攔截
封裝;
- router.js:對微信小程序
servers文件件:接口請求服務管理文件夾;
apis文件夾:request請求封裝管理和接口api配置管理文件夾;
- request.js:對
wx.request
的Promise
封裝; - xxx.js:對應模塊的接口管理文件;
- request.js:對
- requestFilter.js:接口
請求和響應攔截
封裝文件;
- 其他都是初始化默認文件;
二、路由跳轉(zhuǎn)和路由守衛(wèi)封裝
1、路由跳轉(zhuǎn)封裝
微信小程序官方文檔為開發(fā)者提供了5種路由跳轉(zhuǎn)的api,每一種都有其特殊的用法:
根據(jù)其用法,我們對路由api進行如下封裝:微信小程序路由跳轉(zhuǎn)最后對應push、replace、pop、relaunch、switchTab
;routes
對應routeConfig.js中路由路徑的配置;routerFilter
對應routerFilter.js文件,對路由跳轉(zhuǎn)之前的邏輯進行處理;
routeConfig.js(每次新增頁面后需要手動添加):
export const routes =
{
INDEX: "/pages/index/index",
TEST: "/pages/test/test",
}
export default {...routes};
routerFilter.js:
export default () => {
···
//路由跳轉(zhuǎn)前邏輯處理
}
router.js(routerFilter負責路由跳轉(zhuǎn)前公共操作處理,在success和fail中對路由跳轉(zhuǎn)后的公共操作進行處理):
import routes from "../router/routerConfig";
import routerFilter from "./routerFilter"
/**
* 對wx.navigateTo的封裝
* @param {路由} path
* @param {參數(shù)} 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 {參數(shù)} 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 {參數(shù)} 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頁面跳轉(zhuǎn)test頁面
gotoTest(){
wx.router.push("TEST")
}
三、接口請求Promise封裝
??對于同一個項目而言,微信小程序apiwx.request()
中很多參數(shù)都是相同的,如果直接使用,需要將這些重復參數(shù)一遍又一遍的copy,雖然copy很簡單,但是當有一個參數(shù)改變了需要找到所有接口一個一個修改,維護起來費勁,再者看著也難受呀;
??借鑒axios
對請求的封裝,將wx.request()
封裝為Promise
形式豈不美哉:
request.js:
import formatError from "../requestFilter"
const app = getApp()
/**
* 接口請求封裝
* @param {請求方式} method
* @param {請求的url} url
* @param {請求傳遞的數(shù)據(jù)} data
*/
const request = (method, url, data) => {
//設(shè)置請求頭
const header = {
···
}
//promise封裝一層,使得調(diào)用的時候直接用then和catch接收
return new Promise((resolve, reject) => {
wx.request({
method: method,
url: app.globalData.host + url, //完整的host
data: data,
header: header,
success(res) {
//對成功返回的請求進行數(shù)據(jù)管理和統(tǒng)一邏輯操作
···
resolve(res.data)
},
fail(err) {
wx.showToast({
title: '網(wǎng)絡異常,稍后再試!',
mask: true,
icon: 'none',
duration: 3000
})
}
})
})
}
export default request;
具體使用
以user.js為例:
import request from "./request";
// 獲取用戶openid
export const usrInfos = data => request("POST", "/user/usrInfos", data);
index頁面調(diào)用:
//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)
})
}
})
四、接口的請求和響應攔截封裝
??axios
的axios.interceptors.request.use()
和axios.interceptors.response.use()
分別對應接口請求前的攔截處理和數(shù)據(jù)響應后的攔截處理;根據(jù)這個原理我們對微信小程序的響應也做攔截封裝,對接口請求返回錯誤進行統(tǒng)一管理輸出:
request.js
import formatError from "../requestFilter"
const app = getApp()
···
const request = (method, url, data) => {
···
return new Promise((resolve, reject) => {
wx.request({
···
success(res) {
//對成功返回的請求進行數(shù)據(jù)管理和統(tǒng)一邏輯操作
if(res.statusCode === 200){ //請求返回成功
if(res.data && res.data.code === "SUCCESS"){ //后端對接口請求處理成功,返回數(shù)據(jù)給接口調(diào)用處
resolve(res.data) //then接收
}else{ //后端對也請求判斷后認為不合邏輯報錯
formatError(res) //統(tǒng)一的報錯處理邏輯
reject(res.data) //catch接收
}
}else{
reject(res.data) //catch接收
}
},
fail(err) { //請求不通報錯
wx.showToast({
title: '網(wǎng)絡異常,稍后再試!',
mask: true,
icon: 'none',
duration: 3000
})
}
})
})
}
export default request;
requestFilter.js
requestFilter.js中可以做很多對報錯的處理,這里用一個簡單的toast處理示范下:
/**
* 對接口返回的后端錯誤進行格式轉(zhuǎn)化
* @param {接口成功返回的數(shù)據(jù)} res
*/
const formatError = (err =>{
wx.showToast({
title: err.message,
mask: false,
icon: 'none',
duration: 3000
})
}
export default formatError;
對報錯進行統(tǒng)一處理需要明確數(shù)據(jù)規(guī):
- 制定統(tǒng)一的報錯碼管理規(guī)范;
- 制定前后端統(tǒng)一的接口請求數(shù)據(jù)返回格式;
五、全局數(shù)據(jù)管理
??對于數(shù)據(jù)的管理在小項目的開發(fā)中顯得不那么重要,但是隨著項目越來越大,數(shù)據(jù)越來越多,一個很好的數(shù)據(jù)管理方案能夠有效地避免很多bug,這也是vuex能夠在vue生態(tài)中占有一席之地的原因。秉承著合理管理數(shù)據(jù)的原則,對于該封裝的數(shù)據(jù)堅決封裝,對于該分模塊管理的配置堅決分塊管理:
globalData.js
微信小程序中全局的數(shù)據(jù)管理放在app.js
的globalData
屬性中,當數(shù)據(jù)太多或者app.js邏輯太復雜時,將全局數(shù)據(jù)提取出來單獨管理的確是個好方案:
export default {
···
host: "http://www.wawow.xyz/api/test", //接口請求的域名和接口前綴
hasConfirm: "" //是否已經(jīng)有了confirm實例
currentPage: ""
···
}
keys.js
keys.js屬于個人開發(fā)中的習慣操作,將項目中可能用到的一些常量名稱在此集中管理起來,十分方便調(diào)用和修改維護:
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.js
App({
//監(jiān)聽小程序初始化
onLaunch(options) {
//獲取小程序初始進入的頁面信息
let launchInfos = wx.getLaunchOptionsSync()
//將當前頁面路由存入全局的數(shù)據(jù)管理中
this.globalData.currentPage = launchInfos.path
},
···
//全局數(shù)據(jù)存儲
globalData: globalData
})
使用
在頁面代碼邏輯中可以通過app.globalData.host
,wx.$KEYS.TOKEN
方式進行調(diào)用;
六、總結(jié)
??上述關(guān)于微信小程序開發(fā)的幾個方面都是在實踐中學習和總結(jié)的,技術(shù)層面的實現(xiàn)其實很容易,但是個人覺得開發(fā)規(guī)范項目工程構(gòu)建才是一個項目的重要基礎(chǔ);完善的規(guī)范能夠有效的提高開發(fā)效率和開發(fā)者之間非必要的扯皮
!合理的項目工程構(gòu)建能夠優(yōu)化開發(fā)邏輯,提高代碼邏輯易讀性,減少后期項目的管理時間,同時給予項目更大的擴展性。
相關(guān)案例查看更多
相關(guān)閱讀
- 企業(yè)網(wǎng)站
- 昆明小程序公司
- 云南科技公司
- 報廢車管理系統(tǒng)
- 小程序表單
- 網(wǎng)站建設(shè)制作
- 云南網(wǎng)站建設(shè)專家
- 云南小程序開發(fā)公司
- 開發(fā)微信小程序
- 云南小程序開發(fā)制作
- 河南小程序制作
- php網(wǎng)站
- flex
- 網(wǎng)站排名
- 網(wǎng)絡公司排名
- 小程序技術(shù)
- 小程序的開發(fā)公司
- 云南微信小程序開發(fā)
- 云南小程序開發(fā)費用
- 文山小程序開發(fā)
- web開發(fā)技術(shù)
- web前端
- 全國前十名小程序開發(fā)公司
- 保山小程序開發(fā)
- 云南建設(shè)廳網(wǎng)站
- 汽車報廢軟件
- 網(wǎng)站排名優(yōu)化
- 汽車報廢管理
- 云南網(wǎng)站建設(shè)首選
- 云南網(wǎng)站制作哪家好