之前用過(guò) wepy 框架寫了個(gè)小程序 GitHub - yshkk/shanbay-mina: 基于 wepy 框架的 “扇貝閱讀” 微信小程序 ,感覺(jué)寫法上類似 vue,但不那么徹底?,F(xiàn)在美團(tuán)點(diǎn)評(píng)發(fā)布的 mpvue 支持開(kāi)發(fā)者可以用 vue 的語(yǔ)法開(kāi)發(fā)微信小程序,正好有強(qiáng)需求需要一個(gè)斗圖小程序,所以就嘗試了下。 掃碼體驗(yàn)截圖開(kāi)發(fā)細(xì)節(jié)和坑使用 iView Weapp 組件庫(kù)相關(guān)代碼 pages/index/main.js 第 8 行 將組件庫(kù)的 dist 目錄拷貝到自己項(xiàng)目 static 目錄,然后在需要用到組件的頁(yè)面配置 usingComponents 即可。開(kāi)發(fā)期間可能對(duì)組件的樣式不太滿意,或者一些蜜汁問(wèn)題(比如 input 下邊框突然消失 issue ),要改的話方式非常詭異 相關(guān) issue ,所以粗暴點(diǎn)的方式就是直接改組件庫(kù)里的 wxss 文件。 v-show 和 v-model 不好使相關(guān)代碼 pages/index/index.vue 第 4 行 關(guān)于 v-show 相關(guān) issue ,所以只能用 v-if 替代。使用 v-if 會(huì)銷毀不顯示的組件,但有個(gè)場(chǎng)景是期望保留原來(lái)的組件,因此只能曲線救國(guó)在組件外層包一個(gè) < view > 使用 :style="{display?condition?'block':'none'}" 的方式(其實(shí)最好是用 keep-alive 的方法,可惜 mpvue 不支持)。 v-model 就很奇怪了,好像 input 不能雙向綁定,原因是自定義組件就沒(méi)有支持 v-model ,所以得手動(dòng) update data。同理使用組件庫(kù) input 后不能使用 v-focus 。(相關(guān) issue ) 模板語(yǔ)法里不能調(diào)用 methods 方法相關(guān)代碼 components/homppage.vue 第 52 行 可以說(shuō)是血坑了,一直以為我使用姿勢(shì)有誤,費(fèi)了好長(zhǎng)時(shí)間。后來(lái)才從 articles / 美團(tuán)小程序框架 mpvue 蹲坑指南. md at master · noahlam/articles · GitHub 看到原來(lái)這是 mpvue 不支持。 當(dāng)時(shí)的場(chǎng)景是這樣的: 在圖片列表里,給被用戶 “收藏” 過(guò)的圖片加個(gè)額外的 className,該 className 可以給圖片加個(gè)粉色邊框,這樣就能在圖片列表中一眼看到哪些是被收藏過(guò)的。data 里有一個(gè)表示所有圖片的數(shù)組 imageList 和一個(gè)表示收藏列表的數(shù)組 favoriteList 。起初的寫法是 <image v-for="img in imageList" :src="img.url" :class="isFavorite(img.url)?'image-favorite':'image'" 復(fù)制代碼 其中 isFavorite 是在 methods 里的一個(gè)方法,判斷當(dāng)前圖片 url 是否在 favoriteList 里。然而這樣寫一直不 work,后來(lái)只能換個(gè)方案:在 computed 里跟據(jù) imageList 和 favoriteList計(jì)算出 一個(gè)叫 imageListWithFavorite 的數(shù)組,遍歷這個(gè)數(shù)據(jù)即可:joy: 雖然很丑陋但是還能用。 將用戶收藏同步到本地存儲(chǔ)相關(guān)代碼 components/homppage.vue 第 63 行 用戶收藏的表情會(huì)放到微信提供的 storage,類似瀏覽器的 localstorage,這樣在關(guān)閉小程序以后下次來(lái)還能看到自己的收藏,因此在組件需要 watch favoriteList 的變更并調(diào)用 wx.setStorage 方法。但是不知為何直接 watch favoriteList 并不會(huì)觸發(fā)相應(yīng)函數(shù),而 watch ‘favoriteList.length’就能觸發(fā),希望有大佬能指點(diǎn)下。 watch: { 'favoriteList.length': { // 將變化更新到本地存儲(chǔ) handler: function (val, oldval) { this.updateStorage({method: val > oldval ? 'ADD' : 'DELETE'}) } } } 復(fù)制代碼 表情包圖片制作相關(guān)代碼 pages/maker/index.vue 思路是初始化一個(gè) canvas,將表情模版(一張圖片,url 從跳轉(zhuǎn)過(guò)來(lái)的頁(yè)面的 query 里取得)繪制到 canvas 上,用戶打字 / 設(shè)置顏色字體 的時(shí)候調(diào)用 updateCanvas 。最后調(diào)用 wx.canvasToTempFilePath 方法輸出成圖片。 關(guān)鍵代碼如下 ctx = wx.createCanvasContext('maker') // 選擇當(dāng)前 canvas ... updateCanvas () { ctx.drawImage(this.path, 0, 0, 300, 300) //path 為當(dāng)前表情包的路徑 ctx.setTextAlign('center') // 必須每次在 updateCanvas 重新設(shè)置,否則模擬器上生效但真機(jī)下不會(huì)生效 ctx.setFontSize(this.fontSize) ctx.setFillStyle(this.currentColor) ctx.fillText(this.txt, this.x, this.y) ctx.draw() }, 復(fù)制代碼 有幾個(gè)小坑:
總結(jié)大體上使用 mpvue 的體驗(yàn)還是挺好的。mpvue 和 wepy 的寫法上比較類似,mpvue 對(duì) vue 開(kāi)發(fā)者來(lái)說(shuō)更友好容易上手,wepy 更接近于原生小程序。雖然框架的出現(xiàn)屏蔽了一些原生小程序?qū)懫饋?lái)很丑陋的地方, 但是不管用什么框架,原生小程序的文檔還是需要掌握的 ,有一大堆的坑等著要踩,有時(shí)候不得不從編譯出的文件里面找原因。 |
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)