一、序
上一篇介紹了如何從零開發微信小程序,博客園審核變智障了,每次代碼都不算篇幅,好好滴一篇原創,不到3分鍾從首頁移出來了。這篇介紹一下組件封裝和我的踩坑歷程。
二、封裝微信小程序可復用組件
首先模塊化的思想是通用的,在這不做過多解釋了。直接上代碼,然后解釋代碼:
// wxml <view class="c-menu"> <view wx:for="{{menuList}}" wx:key="{{item}}" class="menuItem"> <navigator url="/pages/my{{item.path}}" class="navigator"> <image class="imgIcon" src="{{item.icon}}"></image> <view class="navigator-text" data-id="{{item.key}}" bindtap="handleMenuTap">{{item.name}}</view> </navigator> <image class="imgGo" src="../../image/youxiang.png"></image> </view> </view> // js Component({ properties: { menuList: { // 菜單列表 type: Array, value: [], }, menuEvent: { // 菜單點擊的自定義事件名稱 type: String, value: '', }, }, data: { }, ready: function () { }, methods: { handleMenuTap:function () { const { menuEvent } = this.data if (menuEvent) this.triggerEvent(menuEvent, {}) } } }) //json { "component": true } //wxss .c-menu{ width: 100%; background-color: white; margin-top: 10px; } .menuItem{ position: relative; box-sizing: border-box; } .navigator-text{ padding-left: 65px; } .navigator{ position: relative; box-sizing: border-box; width: 100%; height: 60px; line-height: 60px; border-bottom: 2px solid #F7F7F7; } .imgGo{ position: absolute; width: 18px; height: 18px; top: 22px; right: 15px; } .imgIcon{ position: absolute; width: 29px; height: 29px; top: 15px; left: 18px; }
首先介紹思路:
這是一個簡單菜單組件;輸入菜單數據 menuList , 暴露出 菜單點擊事件的回調 menuEvent。
然后介紹一下小程序封裝組件的特殊之處:
1、json 配置文件需要配置 "component": true , 表名這是個組件
2、js 里面使用 Component({})方法構造組件
3、properties 組件接收的屬性在這里面聲明,包括數據類型和默認值
4、生命周期通常用 ready 代表其准備完畢。
最后介紹一下組件使用的方法:
1、在要用組件的json文件
"usingComponents": {
"menu": "/components/menu/index"
}
2、在wxml里面使用,並准備好組件需要的數據
<menu menuList="{{menuList}}"></menu>
這就是微信小程序封裝組件的大致流程。大同小異,只是給大家說一下他特殊的地方而已
三、小程序的坑——小程序與其他web應用的不同之處 ps: 這里只描述問題,並提供解決問題的方法,詳細的了解請查官方文檔
1、問題: map 等原生組件的覆蓋問題。 在小程序里面,原生組件默認展示層級最該,也就是video、map等組件會覆蓋我們的標簽,即便是定位調節 z-index 什么的都沒用
解決:用 cover-view cover-image 包裹內容,就可以覆蓋在原生組件之上了。注意 這2個標簽內容不能嵌套view等標簽,具體使用,請看官方文檔。
2、問題:wxss 無法使用本地資源,即 background-image 不能直接使用相對路徑展示圖片。
解決:將圖片轉成base64展示,或者不使用背景圖,直接使用圖片。例: background-image: url("base64: .......")
3、問題:大多數 js 插件無法使用
原因:小程序用的是不完整的瀏覽器對象,大多數 BOM DOM 對象的api無法使用,故:沒辦法的事情
4、問題:使用npm包費勁
解決:請看我上一篇博客,詳解微信小程序開發
5、問題:只支持到ES6,不支持ES7。像 async 等這些東西都用不了。
解決:這個比較蛋疼了。(1)這里只提供解決的思路。引入 regenerator 這個包 ,或者其他包都行。(2)開發環境自己搭建gulp打包環境,自己把js代碼轉ES5,注意關閉小程序自帶的轉換。
6、問題:獲取用戶信息改版了,wx.authorize 等api不好使
解決:現在必須用button按鈕 <button open-type="getUserInfo" bindgetuserinfo="sweepCode">掃碼</button>
7、問題:wx.request 請求,無法攜帶cookie,或者每次請求攜帶的都不一樣,而且不同版本開發者工具設置cookie的報文字段不同
解決:
header: { 'content-type': 'application/json', 'cookie': wx.getStorageSync("cookie") }, success: function (res) { if (url === '/api/cdz/user/weixin/login') { const cookie = res.header["set-cookie"] || res.header["Set-Cookie"]; if (cookie) wx.setStorageSync("cookie", cookie); } resolve(res.data); }, fail: function (res) { // fail調用接口失敗 if (url === '/api/cdz/user/weixin/login') { const cookie = res.header["set-cookie"] || res,header["Set-Cookie"]; if (cookie) wx.setStorageSync("cookie", cookie); } reject({ error: '網絡錯誤', code: 0 }); }
8、問題:map 組件的使用,map是騰訊地圖,和 百度、高德什么的,這些地圖坐標系不同,經緯度的相互使用需要轉化
解決:用這個包 coordtransform 包很小,用法很簡單
9、問題:小程序偽類 :active 不支持
解決:view、button、navigator 這3個支持 hover-class 屬性,用法和 active 一樣
10、問題:上述問題,平時好用,但是如果按鈕在原生組件上面的話,又不好使了
解決:cover-view 無法嵌套普通標簽。他又不支持 hover-class,所以只能js+wxss,自己寫按鈕激活事件了
11、問題:小程序的事件點擊不允許傳參數。GoMy無法像vue react之類的一樣寫箭頭函數直接傳參
<cover-view class="myCover" data-id="my" bindtap="goMy"></cover-view>
解決:通過data-id這個屬性綁定關鍵參數,觸發函數再去取出來
以上就是我遇到的一些問題,后序再有,會再補充