最近公司要開發(fā)一款電商小程序,匆忙看了一遍文檔就開始干活了。整體開發(fā)體驗個人感覺不太好,特別是如果之前習(xí)慣了Vue開發(fā),突然去開發(fā)小程序,感覺很雞肋。以下是我在開發(fā)中遇到的一些問題以及解決方法的總結(jié),僅供參考 引入iconfont在小程序中引入字體圖標(biāo)要比web麻煩一些,簡單說需要三步:
<icon class="iconfont icon-pay"></icon> 復(fù)制代碼 使用lessvscode有一個easy less插件,是我感覺使用less最簡單的方式
編譯后的結(jié)果 按鈕重置小程序中的按鈕功能強大,很多功能必須要用按鈕,比如彈出用戶授權(quán),調(diào)用客服功能。默認(rèn)的樣式一般無法滿足需求,可以把按鈕樣式統(tǒng)一重置,然后自己寫樣式 button { padding: 0; background: #fff; line-height: 0; &::after { border-color: transparent; } } .button-hover { background: #fff; } 復(fù)制代碼 支持async-awaitasync-await是ES7的語法,截止我寫這篇文章為止,小程序還是不支持async-await語法的,所以需要使用regenerator這個庫
const wxRequest = async (url, params = {}) => { Object.assign(params, { token: wx.getStorageSync('token') }) // 所有的請求,header默認(rèn)攜帶token let header = params.header || { 'Content-Type': 'application/json', 'token': params.token || '' } let data = params.data || {} let method = params.method || 'GET' // hideLoading可以控制是否顯示加載狀態(tài) if (!params.hideLoading) { wx.showLoading({ title: '加載中...', }) } let res = await new Promise((resolve, reject) => { wx.request({ url: url, method: method, data: data, header: header, success: (res) => { if (res && res.statusCode == 200) { resolve(res.data) } else { reject(res) } }, fail: (err) => { reject(err) }, complete: (e) => { wx.hideLoading() } }) }) return res } export { wxRequest } 復(fù)制代碼 使用方法: import regeneratorRuntime from '../../utils/regenerator-runtime/runtime-module.js' import { wxRequest } from '../../utils/util.js' Page({ data: { list:[], count: 0, page: 1, limit: 10 }, onLoad: function() { this.getList() // 請求已經(jīng)結(jié)束 做其他事 }, getList: async function() { await wxRequest(app.globalData.baseUrl + '/test',{ hideLoading: true, data: { limit: this.data.limit, page: this.data.page } }).then((ret) => { this.setData({ list: ret.data.data, count: ret.data.num }) }) } }) 復(fù)制代碼 封裝之后用起來還是很爽的,擴展起來也方便 動態(tài)設(shè)置data中某個值應(yīng)用場景:循環(huán)出來的列表,需要根據(jù)點擊項,動態(tài)改變列表中對應(yīng)id的數(shù)據(jù) // 動態(tài)傳遞id <block wx:for="{{list}}" wx:key="{{index}}"> <view catch:tap="onChangeName" data-id="{{item.id}}"></view> </block> Page({ data: { list:[{ id: 0, name: 'wang' },{ id: 1, name: 'li' }] }, onChangeName: function(event){ // 拿到id let id = event.target.dataset.id let key = `list[${id}].name`, val = 'zhang' // 設(shè)置值 this.setData({ [key]: val }) } }) 復(fù)制代碼 flex布局,溢出省略號無效訂單列表一般都是左邊一個圖片,右邊是標(biāo)題或描述。這時候圖片寬度是固定的,標(biāo)題長度自適應(yīng) .wrap { display: flex; } .sub { flex: 1; width: 0; // 寬度設(shè)為0 } .sub text { display: block; // 一定要設(shè)置成block } <view calss="wrap"> <image src="i.png"/> <view class="sub"> <text>一段文本一段文本一段文本一段文本一段文本一段文本</text> <view>其他</view> </view> </view> 復(fù)制代碼 組件事件傳遞任務(wù):父組件向子組件傳遞初始數(shù)據(jù),當(dāng)子組件點擊以后可以triggerEvent自定義事件,父組件執(zhí)行自定義事件,重新請求數(shù)據(jù)并傳給子組件 /* 子組件 */ <view> <view bind:tap="setId" data-id="1"></view> </view> properties: { list: { type: Array, default: [] } }, methods: { setId(e) { let id = e.currentTarget.dataset.id this.triggerEvent('deleteFav', id) } } /* 父頁面 */ <child bind:customEvent="deleteFav"></child> data: { list: [] }, deleteFav(e) { let id = e.detail // 獲取傳遞過來的數(shù)據(jù) // 根據(jù)id請求數(shù)據(jù),然后重新setData let newData = [1,2,3] this.setData({ list: newData }) } 復(fù)制代碼 使用wxParse解析HTML
Page({ data:{ contentHTML:'' // 解析后的HTML }, onLoad: function() { // 請求到的HTML數(shù)據(jù) let content = '<div>我是HTML代碼</div>', that = this; WxParse.wxParse('contentHTML', 'html', content, that, 0); } }) 復(fù)制代碼
<import src="../../utils/wxParse/wxParse.wxml"/> <view> <!-- 顯示內(nèi)容 --> <template is="wxParse" data="{{wxParseData:contentHTML.nodes}}" /> </view> 復(fù)制代碼 圖片等比例image標(biāo)簽有個mode屬性,可以設(shè)置圖片如何顯示,如果文檔看的不仔細(xì)還真容易發(fā)現(xiàn) <image src="test.png" mode="widthFix"/> 復(fù)制代碼 上拉加載和下拉刷新{ "onReachBottomDistance": 0, "enablePullDownRefresh": true } 復(fù)制代碼 data: { limit: 30, page: 1, list:[], count:0 }, // 下拉 onPullDownRefresh: function () { this.setData({ page: 1, list:[] }) this.getData() }, // 上拉 onReachBottom: function () { if(this.data.list.length >= this.data.count) { return false } this.setData({ page: this.data.page + 1 }) this.getData() wx.stopPullDownRefresh() }, getData: async function () { await wxRequest(app.globalData.baseUrl + '/test', { data: { page: this.data.page, limit: this.data.limit, } }).then((ret) => { let list = this.data.list.concat(ret.data.list) this.setData({ list: list, count: ret.data.count }) }) } 復(fù)制代碼 上傳圖片任務(wù):小程序上傳圖片到服務(wù)器,最多上傳三張,前端可以刪除圖片 效果圖如下 使用到的API有兩個:wx.uploadFile wx.chooseImage 示例WXML: <view class="sale after-pic"> <block wx:for="{{imgList}}" wx:key="{{index}}"> <view class="pic"> <image src="{{item}}" /> <icon type="clear" size="20" catchtap="clearImg" data-id="{{index}}"/> </view> </block> <image src="../../images/upload.png" catchtap="chooseImage" /> </view> <button catchtap="onSub">提交</button> 復(fù)制代碼 imgList是wx.chooseImage成功后返回的圖片臨時地址 示例JS Page({ data: { imgList:[] }, // 使用async await是因為圖片上傳是異步的 onSub: async function() { // 點擊提交后,開始上傳圖片 let imgUrls = [] for (let index = 0; index < this.data.imgList.length; index++) { await this.uploadFile(this.data.imgList[index]).then((res) => { // 這里要注意把res.data parse一下,默認(rèn)是字符串 let parseData = JSON.parse(res.data) imgUrls.push(parseData.data) // 圖片地址 }) } console.log(imgUrls) // 3張圖片上傳成功后,執(zhí)行其他操作 }, // 刪除某張圖片 clearImg: function (params) { let imgList = this.data.imgList let id = params.currentTarget.dataset.id // 圖片索引 imgList.splice(id, 1) // 刪除 this.setData({ imgList: imgList }) }, chooseImage: function (params) { wx.chooseImage({ count: 3, // 做多3張 sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: (res) => { // 存儲臨時地址 this.setData({ imgList: res.tempFilePaths }) } }) }, uploadFile: function (filePath) { // 返回Promise是為了解決圖片上傳的異步問題 return new Promise( (resolve, reject) => { wx.uploadFile({ url: app.globalData.baseUrl + '/file/upload', // 上傳地址 filePath: filePath, name: 'file', // 這里的具體值,問后端人員 formData: {}, header: { "Content-Type": "multipart/form-data" }, success: (res) =>{ // 圖片上傳成功后,后端會返回一個地址,可以把它存到imgUrls this.imgUrls.push(res.data.data) }, fail:(err) => { console.log(err) } }) }) } }) 復(fù)制代碼 動態(tài)標(biāo)題onLoad的時候動態(tài)設(shè)置標(biāo)題 wx.setNavigationBarTitle({ title: '新標(biāo)題' }) 復(fù)制代碼 結(jié)語以上是僅為我個人在開發(fā)過程中遇到的一些問題,若有錯誤還請批評指正,感謝閱讀. |
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)