總結(jié)微信小程序中遇到的一些坑

title

總結(jié)微信小程序開發(fā)中遇到的坑,一些坑你得一個(gè)一個(gè)的跳啊,/(ㄒoㄒ)/~~
aboutme
github
blog

1,頁面跳轉(zhuǎn)和參數(shù)傳遞實(shí)例

首先說一下我遇到的需求
有一個(gè)我的消息頁面,里面的數(shù)據(jù)都是后端返回的,返回的數(shù)據(jù)大致如下,有一個(gè)是數(shù)據(jù)url是要控制跳轉(zhuǎn)到哪個(gè)頁面,可能是tab頁面也可能是非tab頁面,但是微信小程序中跳轉(zhuǎn)到tab和非tab頁面用的api不是同一個(gè),但是在頁面中渲染肯定是要用到循環(huán)的,難道要再多個(gè)參數(shù)來判斷是跳轉(zhuǎn)到tab頁面還是非tab頁面?

[
    {
        "id": 2121,
        "title": "test",
        "body": "test",
        "url": "url",
        "pic": "pic",
        "created_at": "2017-07-01 12:34:56"
    }, {
        "id": 2122,
        "title": "test",
        "body": "test",
        "url": "url",
        "pic": "pic",
        "created_at": "2017-07-01 12:34:56"
    },
]
  • 后一般的小程序中我用的框架是wepy,底部的tab組件就是我自己寫的,沒有用到小程序自己提供的那一個(gè),因?yàn)槲覀冞€要實(shí)現(xiàn)一個(gè)需求,有消息時(shí),底部tab會(huì)出現(xiàn)小紅點(diǎn),還有以下彈窗要把底部tab覆蓋掉,這些需求如果用小程序提供的那一個(gè)tab組件的話根本實(shí)現(xiàn)不了;而且不用wepy框架的話,自己做一個(gè)tab實(shí)現(xiàn)的過程很惡心,小程序雖然實(shí)現(xiàn)了組件化,但是它實(shí)現(xiàn)的組件化并不像vue和react那樣實(shí)現(xiàn)的是真正的組件化,你需要哪個(gè)組件就直接import進(jìn)來,小程序的組件化實(shí)現(xiàn)可查看官方文檔,js,css和html都是要分別引入的
  • 自己實(shí)現(xiàn)的tab頁面整體是一個(gè)非tab頁面,所有整個(gè)小程序中就不存在絕對的tab頁面,所以用navigator這個(gè)組件,想要跳轉(zhuǎn)到tab頁面可以通過在url上拼接參數(shù)
<view class="mesList" wx:for="{{unReadList}}" wx:key="unique">
    <navigator url="/pages/index?tab=0" hover-class="none" >
        <text>{{item.body}}</text>
        <view class="messageTime">{{item.created_at}}</view>
    </navigator>
</view>

然后再index頁面的onload中判斷顯示哪個(gè)tab

onLoad(options) {
    if (options && options.tab) {
        this.tab = parseInt(options.tab);
        this.$apply();
    }
}

2,微信小程序授權(quán)處理

  • 微信小程序提示授權(quán)彈窗,如果用戶第一次點(diǎn)擊拒絕之后,一段時(shí)間將不會(huì)再次彈出來,然后用戶又不知道什么原因用不了小程序,這是個(gè)很糟糕的用戶體驗(yàn),我們應(yīng)該優(yōu)雅的處理這種情況
  • 采用的解決方法參考

3, 登錄問題的處理

  • 兩個(gè)登錄接口,一個(gè)get,判斷是否已經(jīng)還需要登錄,如果返回true,則需要登錄,如果返回false,則不需要登錄
  • 如果返回true,則需要去請求更一個(gè)post的登錄接口,這時(shí),你需要獲取第一個(gè)get請求的返回信息中的session,之后每次請求求都需要帶上他
  • 在返回true的時(shí)候還需要做一件事兒,就是把返回信息中的session存儲到storage,即調(diào)用setStorage,然后在之后每次請求數(shù)據(jù)的時(shí)候在headers里加上這個(gè)字段
function getStorage(key) {
    return new Promise(function (resolve, reject) {
        // 先判斷本地?cái)?shù)據(jù)存儲有沒有cookie
        wx.getStorage({
            key: key,
            success: function (res) {
                resolve(res.data);
            },
            fail: function (res) {
                resolve(null);
            },
        });
    });
}
function setStorage(key, value) {
    return new Promise(function (resolve, reject) {
        wx.setStorage({
            key: key,
            data: value,
            success: function (res) {
                // TODO: 不知道返回什么
                resolve(res.data);
            },
            fail: function (res) {
                reject(res.errMsg);
            },
        });
    });
}

4,wx.getStorage安卓手機(jī)上返回的錯(cuò)誤信息是getStorage:fail,ios返回getStorage:fail data not found

  • 在判斷一些api返回的錯(cuò)誤信息時(shí),最好不要通過判斷具體的錯(cuò)誤信息來處理錯(cuò)誤
function getStorage(key) {
    return new Promise(function (resolve, reject) {
        // 先判斷本地?cái)?shù)據(jù)存儲有沒有cookie
        wx.getStorage({
            key: key,
            success: function (res) {
                resolve(res.data);
            },
            fail: function (res) {
                resolve(null);
                // 下面注釋的部分即為剛開始犯的錯(cuò)誤,導(dǎo)致有可能ios或安卓或部分機(jī)型顯示不出數(shù)據(jù)
                // if (res.errMsg == 'getStorage:fail' || res.errMsg == 'getStorage:fail data not found') {
                //     console.log('沒有cookie');
                //     resolve(null);
                // } else {
                //     console.log('這是一個(gè)問題');
                //     reject(res.errMsg);
                // }
            },
        });
    });
}

5,小程序解決異步

  • 如果項(xiàng)目中沒有用到babal,小程序本身的支持只支持到es6的語法,所以解決異步的問題就不能使用es7的asyncawait,只能使用promise來解決異步,但是每個(gè)api上都進(jìn)行一次封裝(如下),這種做法太惡心了
function login() {
    return new Promise(function (resolve, reject) {
        wx.login({
            success: function (res) {
                resolve(res);
            },
            fail: function (res) {
                reject(res.errMsg);
            },
        });
    });
}

  • 基于微信的API的prototype上進(jìn)行了`promise``的封裝
function promiseify(func) {
    return (args = {}) => {
        return new Promise((resolve, reject) => {
            func.call(wx, Object.assign(args, {
                success: resolve,
                fail: reject,
            }));
        })
    }
}
for (const key in wx) {
    if (Object.prototype.hasOwnProperty.call(wx, key) && typeof wx[key] === 'function') {
        wx[`_${key}`] = promiseify(wx[key]);
    }
}

6,怎么保證在調(diào)用其他接口之前已經(jīng)調(diào)用過登錄的接口了

  • 我采用執(zhí)行隊(duì)列的方式來解決,問題可以簡化為有兩個(gè)按鈕,點(diǎn)擊第一個(gè)按鈕輸出這是第幾次輸出d1,但是必須在點(diǎn)擊完d2之后,isPrint變?yōu)?code>true時(shí),才允許輸出,在isPrintfalse的時(shí)候點(diǎn)擊d1,需要把要輸出的內(nèi)容暫時(shí)存儲起來,等isPrint變?yōu)?code>true時(shí),暫存起來的輸出現(xiàn)在才可以輸出出來
// html
  <div class="first">按鈕一</div>
  <div class="second">按鈕二</div>
// js
  const d1 = document.querySelector('.first');
  const d2 = document.querySelector('.second');
  let count = 0; // 用來記錄第幾次輸出
  let isPrint = false; // 是否允許輸出
  let arr = []; // 聲明一個(gè)數(shù)組,用來存儲

  function clickCount() {
    count++;
    console.log('這是第' + count + '次輸出d1');
  }
  d1.onclick = function () {
    console.log(isPrint);
    console.log(arr);
    if (isPrint) {
      if (arr.length === 0) {
        clickCount();
      } else {
        for (let i = 0, len = arr.length; i < len; i++) {
          arr[i]();
        }
      }
    } else {
      arr.push(clickCount);
      console.log('不允許輸出');
    }
  };
  d2.onclick = function () {
    isPrint = true;
    console.log(isPrint);
  }

6,小程序問題

  • 不支持跳轉(zhuǎn)外部鏈接
  • text可以解析/n,
  • 目前不支持識別圖中二維碼瑞侮,
  • 背景圖片不能用本地圖片蚊俺,
  • wx.navigateTo需要跳轉(zhuǎn)的應(yīng)用內(nèi)非 tabBar 的頁面的路徑
  • wx.switchTab跳轉(zhuǎn)到tabBar頁面,
  • wx.showToast(),icon只支持successloading,但是支持image,且image優(yōu)先級高于icon
  • tabBar頁面A navigatorTo 到頁面B,然后B switchTab 到A麦射,這里A會(huì)執(zhí)行onShow()
    但是我再從A跳到B再switchTab回來灯谣,A就不會(huì)再執(zhí)行onShow()了潜秋,

7,總結(jié)

  • 有時(shí)候在開發(fā)者工具上測試時(shí)是沒有問題的,但是真機(jī)測試卻有問題,所有開發(fā)過程中一定要在多個(gè)不同型號的手機(jī)上測試;很多時(shí)候IOS和安卓api返回的信息不同
  • 在手機(jī)上打開調(diào)試的時(shí)候是好的,但是關(guān)閉調(diào)試后就會(huì)出現(xiàn)各種bug,遇到這種情況一定要一步步的去排查原因

8,后采用wepy重構(gòu)小程序遇到的一些坑

wepy文檔
1,Q: 怎么在page組件和component組件中回去到getApp(),就是app里面定義的函數(shù),通過this.$parent只能拿到數(shù)據(jù)胎许,拿不到方法?
A:可以在this.$parent_proto上拿到方法,即this.$parent.onLogin
2, Q:怎么實(shí)現(xiàn)按需加載
A:在compoent組件中自定義生命周期函數(shù),并手動(dòng)觸發(fā)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末峻呛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辜窑,更是在濱河造成了極大的恐慌钩述,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谬擦,死亡現(xiàn)場離奇詭異切距,居然都是意外死亡朽缎,警方通過查閱死者的電腦和手機(jī)惨远,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來话肖,“玉大人北秽,你說我怎么就攤上這事∽钔玻” “怎么了贺氓?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長床蜘。 經(jīng)常有香客問我辙培,道長蔑水,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任扬蕊,我火速辦了婚禮搀别,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尾抑。我一直安慰自己歇父,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布再愈。 她就那樣靜靜地躺著榜苫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翎冲。 梳的紋絲不亂的頭發(fā)上垂睬,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音抗悍,去河邊找鬼羔飞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛檐春,可吹牛的內(nèi)容都是我干的逻淌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疟暖,長吁一口氣:“原來是場噩夢啊……” “哼卡儒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俐巴,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骨望,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后欣舵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擎鸠,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年缘圈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劣光。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糟把,死狀恐怖绢涡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遣疯,我是刑警寧澤雄可,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響数苫,放射性物質(zhì)發(fā)生泄漏聪舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一虐急、第九天 我趴在偏房一處隱蔽的房頂上張望过椎。 院中可真熱鬧,春花似錦戏仓、人聲如沸疚宇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敷待。三九已至,卻和暖如春仁热,著一層夾襖步出監(jiān)牢的瞬間榜揖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工抗蠢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留举哟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓迅矛,卻偏偏與公主長得像妨猩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子秽褒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容