摘要:前言最近公司要開(kāi)發(fā)一款電商小程序,匆忙看了一遍文檔就開(kāi)始干活了。整體開(kāi)發(fā)體驗(yàn)個(gè)人感覺(jué)不太好,特別是如果之前習(xí)慣了開(kāi)發(fā),突然去開(kāi)發(fā)小程序,感覺(jué)很雞肋。
前言
最近公司要開(kāi)發(fā)一款電商小程序,匆忙看了一遍文檔就開(kāi)始干活了。整體開(kāi)發(fā)體驗(yàn)個(gè)人感覺(jué)不太好,特別是如果之前習(xí)慣了Vue開(kāi)發(fā),突然去開(kāi)發(fā)小程序,感覺(jué)很雞肋。以下是我在開(kāi)發(fā)中遇到的一些問(wèn)題以及解決方法的總結(jié),僅供參考
引入iconfont在小程序中引入字體圖標(biāo)要比web麻煩一些,簡(jiǎn)單說(shuō)需要三步:
下載iconfont,把iconfont.css復(fù)制到iconfont.wxss,在app.wxss中引入
查看iconfont在unicode模式下的在線鏈接,替換iconfont.wxss中的鏈接為遠(yuǎn)程鏈接
在wxml文件中引入對(duì)應(yīng)的icon class
使用less
vscode有一個(gè)easy less插件,是我感覺(jué)使用less最簡(jiǎn)單的方式
vscode安裝easy less插件
創(chuàng)建一個(gè)less目錄,用于存放less文件
文件頭部添加編譯注釋 // out: ../pages/index/index.wxss, compress: true, sourceMap: false
ctrl + s保存后自動(dòng)編譯
編譯后的結(jié)果
按鈕重置小程序中的按鈕功能強(qiáng)大,很多功能必須要用按鈕,比如彈出用戶授權(quán),調(diào)用客服功能。默認(rèn)的樣式一般無(wú)法滿足需求,可以把按鈕樣式統(tǒng)一重置,然后自己寫(xiě)樣式
button { padding: 0; background: #fff; line-height: 0; &::after { border-color: transparent; } } .button-hover { background: #fff; }支持async-await
async-await是ES7的語(yǔ)法,截止我寫(xiě)這篇文章為止,小程序還是不支持async-await語(yǔ)法的,所以需要使用regenerator-runtime這個(gè)庫(kù)
下載regenerator-runtime并放到utils目錄下
在util.js引入import regeneratorRuntime from "./regenerator-runtime/runtime-module"
封裝wxRequest,讓它支持async-await
const wxRequest = async (url, params = {}) => { Object.assign(params, { token: wx.getStorageSync("token") }) // 所有的請(qǐng)求,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 }
使用方法:
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() // 請(qǐng)求已經(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 }) }) } })
封裝之后用起來(lái)還是很爽的,擴(kuò)展起來(lái)也方便
動(dòng)態(tài)設(shè)置data中某個(gè)值應(yīng)用場(chǎng)景:循環(huán)出來(lái)的列表,需要根據(jù)點(diǎn)擊項(xiàng),動(dòng)態(tài)改變列表中對(duì)應(yīng)id的數(shù)據(jù)
// 動(dòng)態(tài)傳遞idflex布局,溢出省略號(hào)無(wú)效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 }) } })
訂單列表一般都是左邊一個(gè)圖片,右邊是標(biāo)題或描述。這時(shí)候圖片寬度是固定的,標(biāo)題長(zhǎng)度自適應(yīng)
.wrap { display: flex; } .sub { flex: 1; width: 0; // 寬度設(shè)為0 } .sub text { display: block; // 一定要設(shè)置成block }組件事件傳遞一段文本一段文本一段文本一段文本一段文本一段文本 其他
任務(wù):父組件向子組件傳遞初始數(shù)據(jù),當(dāng)子組件點(diǎn)擊以后可以triggerEvent自定義事件,父組件執(zhí)行自定義事件,重新請(qǐng)求數(shù)據(jù)并傳給子組件
/* 子組件 */使用wxParse解析HTMLproperties: { list: { type: Array, default: [] } }, methods: { setId(e) { let id = e.currentTarget.dataset.id this.triggerEvent("deleteFav", id) } } /* 父頁(yè)面 */ data: { list: [] }, deleteFav(e) { let id = e.detail // 獲取傳遞過(guò)來(lái)的數(shù)據(jù) // 根據(jù)id請(qǐng)求數(shù)據(jù),然后重新setData let newData = [1,2,3] this.setData({ list: newData }) }
下載wxParse,放到utils目錄下
在JS頁(yè)面引入:import WxParse from "../../utils/wxParse/wxParse"
Page({ data:{ contentHTML:"" // 解析后的HTML }, onLoad: function() { // 請(qǐng)求到的HTML數(shù)據(jù) let content = "我是HTML代碼", that = this; WxParse.wxParse("contentHTML", "html", content, that, 0); } })
顯示解析內(nèi)容
圖片等比例
image標(biāo)簽有個(gè)mode屬性,可以設(shè)置圖片如何顯示,如果文檔看的不仔細(xì)還真容易發(fā)現(xiàn)
上拉加載和下拉刷新
{ "onReachBottomDistance": 0, "enablePullDownRefresh": true }
data: { limit: 30, page: 1, list:[], count:0 }, // 下拉 onPullDownRefresh: function () { this.setData({ page: 1, list:[] }) this.getData() wx.stopPullDownRefresh() }, // 上拉 onReachBottom: function () { if(this.data.list.length >= this.data.count) { return false } this.setData({ page: this.data.page + 1 }) this.getData() }, 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 }) }) }上傳圖片
任務(wù):小程序上傳圖片到服務(wù)器,最多上傳三張,前端可以刪除圖片
效果圖如下
使用到的API有兩個(gè):wx.uploadFile wx.chooseImage
示例WXML:
imgList是wx.chooseImage成功后返回的圖片臨時(shí)地址
示例JS
Page({ data: { imgList:[] }, // 使用async await是因?yàn)閳D片上傳是異步的 onSub: async function() { // 點(diǎn)擊提交后,開(kāi)始上傳圖片 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) => { // 存儲(chǔ)臨時(shí)地址 this.setData({ imgList: res.tempFilePaths }) } }) }, uploadFile: function (filePath) { // 返回Promise是為了解決圖片上傳的異步問(wèn)題 return new Promise( (resolve, reject) => { wx.uploadFile({ url: app.globalData.baseUrl + "/file/upload", // 上傳地址 filePath: filePath, name: "file", // 這里的具體值,問(wèn)后端人員 formData: {}, header: { "Content-Type": "multipart/form-data" }, success: (res) => { resolve(res) }, fail: (err) => { reject(err) console.log(err) } }) }) } })動(dòng)態(tài)標(biāo)題
onLoad的時(shí)候動(dòng)態(tài)設(shè)置標(biāo)題
wx.setNavigationBarTitle({ title: "新標(biāo)題" })結(jié)語(yǔ)
以上是僅為我個(gè)人在開(kāi)發(fā)過(guò)程中遇到的一些問(wèn)題,若有錯(cuò)誤還請(qǐng)批評(píng)指正,感謝閱讀
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96233.html
微信小程序開(kāi)發(fā)總結(jié) 基礎(chǔ)的配置及視圖層、邏輯層自己看文檔 [微信小程序文檔][1] 這里只說(shuō)一下自己的經(jīng)驗(yàn)總結(jié) 提醒 微信小程序不運(yùn)行在瀏覽器,所以不能操作Dom,也沒(méi)有document、window對(duì)象 每一個(gè)頁(yè)面路徑最多五層 eg:頁(yè)面A->頁(yè)面B->頁(yè)面C->頁(yè)面D->頁(yè)面E->(頁(yè)面F是跳轉(zhuǎn)不出來(lái)的) 注:不經(jīng)過(guò)redirect,redirect后的頁(yè)面算是第一層,但是沒(méi)有-返回-按鈕...
微信小程序開(kāi)發(fā)總結(jié) 基礎(chǔ)的配置及視圖層、邏輯層自己看文檔 [微信小程序文檔][1] 這里只說(shuō)一下自己的經(jīng)驗(yàn)總結(jié) 提醒 微信小程序不運(yùn)行在瀏覽器,所以不能操作Dom,也沒(méi)有document、window對(duì)象 每一個(gè)頁(yè)面路徑最多五層 eg:頁(yè)面A->頁(yè)面B->頁(yè)面C->頁(yè)面D->頁(yè)面E->(頁(yè)面F是跳轉(zhuǎn)不出來(lái)的) 注:不經(jīng)過(guò)redirect,redirect后的頁(yè)面算是第一層,但是沒(méi)有-返回-按鈕...
微信小程序開(kāi)發(fā)總結(jié) 基礎(chǔ)的配置及視圖層、邏輯層自己看文檔 [微信小程序文檔][1] 這里只說(shuō)一下自己的經(jīng)驗(yàn)總結(jié) 提醒 微信小程序不運(yùn)行在瀏覽器,所以不能操作Dom,也沒(méi)有document、window對(duì)象 每一個(gè)頁(yè)面路徑最多五層 eg:頁(yè)面A->頁(yè)面B->頁(yè)面C->頁(yè)面D->頁(yè)面E->(頁(yè)面F是跳轉(zhuǎn)不出來(lái)的) 注:不經(jīng)過(guò)redirect,redirect后的頁(yè)面算是第一層,但是沒(méi)有-返回-按鈕...
閱讀 3071·2021-09-22 15:52
閱讀 2939·2019-08-30 15:55
閱讀 2730·2019-08-30 15:53
閱讀 2486·2019-08-30 13:21
閱讀 1655·2019-08-30 13:10
閱讀 2516·2019-08-26 12:09
閱讀 2604·2019-08-26 10:33
閱讀 1837·2019-08-23 18:06