小程序mpvue圖片繪制水印_開發筆記:使用 mpvue 開發斗圖小程序

之前用過?wepy?框架寫了個小程序?GitHub - yshkk/shanbay-mina: 基于 wepy 框架的 “扇貝閱讀” 微信小程序?,感覺寫法上類似 vue,但不那么徹底。現在美團點評發布的?mpvue?支持開發者可以用 vue 的語法開發微信小程序,正好有強需求需要一個斗圖小程序,所以就嘗試了下。

掃碼體驗

截圖

開發細節和坑

使用?iView Weapp?組件庫

相關代碼 pages/index/main.js 第 8 行

將組件庫的 dist 目錄拷貝到自己項目 static 目錄,然后在需要用到組件的頁面配置?usingComponents?即可。開發期間可能對組件的樣式不太滿意,或者一些蜜汁問題(比如 input 下邊框突然消失?issue?),要改的話方式非常詭異?相關 issue?,所以粗暴點的方式就是直接改組件庫里的 wxss 文件。

v-show 和 v-model 不好使

相關代碼 pages/index/index.vue 第 4 行

關于?v-show?相關?issue?,所以只能用?v-if?替代。使用?v-if?會銷毀不顯示的組件,但有個場景是期望保留原來的組件,因此只能曲線救國在組件外層包一個?< view >?使用?:style="{display?condition?'block':'none'}"?的方式(其實最好是用 keep-alive 的方法,可惜 mpvue 不支持)。

v-model?就很奇怪了,好像 input 不能雙向綁定,原因是自定義組件就沒有支持?v-model?,所以得手動 update data。同理使用組件庫 input 后不能使用?v-focus?。(相關?issue?)

模板語法里不能調用 methods 方法

相關代碼 components/homppage.vue 第 52 行

可以說是血坑了,一直以為我使用姿勢有誤,費了好長時間。后來才從?articles / 美團小程序框架 mpvue 蹲坑指南. md at master · noahlam/articles · GitHub?看到原來這是 mpvue 不支持。 當時的場景是這樣的: 在圖片列表里,給被用戶 “收藏” 過的圖片加個額外的 className,該 className 可以給圖片加個粉色邊框,這樣就能在圖片列表中一眼看到哪些是被收藏過的。data 里有一個表示所有圖片的數組?imageList?和一個表示收藏列表的數組?favoriteList?。起初的寫法是

復制代碼

其中?isFavorite?是在 methods 里的一個方法,判斷當前圖片 url 是否在?favoriteList?里。然而這樣寫一直不 work,后來只能換個方案:在 computed 里跟據?imageList?和?favoriteList計算出 一個叫?imageListWithFavorite?的數組,遍歷這個數據即可:joy: 雖然很丑陋但是還能用。

將用戶收藏同步到本地存儲

相關代碼 components/homppage.vue 第 63 行

用戶收藏的表情會放到微信提供的 storage,類似瀏覽器的 localstorage,這樣在關閉小程序以后下次來還能看到自己的收藏,因此在組件需要 watch?favoriteList?的變更并調用?wx.setStorage?方法。但是不知為何直接 watch?favoriteList?并不會觸發相應函數,而 watch ‘favoriteList.length’就能觸發,希望有大佬能指點下。

watch: {

'favoriteList.length': {

// 將變化更新到本地存儲

handler: function (val, oldval) {

this.updateStorage({method: val > oldval ? 'ADD' : 'DELETE'})

}

}

}

復制代碼

表情包圖片制作

相關代碼 pages/maker/index.vue

思路是初始化一個 canvas,將表情模版(一張圖片,url 從跳轉過來的頁面的 query 里取得)繪制到 canvas 上,用戶打字 / 設置顏色字體 的時候調用?updateCanvas?。最后調用?wx.canvasToTempFilePath?方法輸出成圖片。 關鍵代碼如下

ctx = wx.createCanvasContext('maker') // 選擇當前 canvas

...

updateCanvas () {

ctx.drawImage(this.path, 0, 0, 300, 300) //path 為當前表情包的路徑

ctx.setTextAlign('center') // 必須每次在 updateCanvas 重新設置,否則模擬器上生效但真機下不會生效

ctx.setFontSize(this.fontSize)

ctx.setFillStyle(this.currentColor)

ctx.fillText(this.txt, this.x, this.y)

ctx.draw()

},

復制代碼

有幾個小坑:

將圖片繪制到 canvas 時指定的圖片不能是一個遠端圖床的鏈接,必須先本地下載下來(調用?wx.getImageInfo?獲取圖片,得到本地一個臨時 path)才能繪制。

canvas 指定的大小單位是 px,而用 css 控制的單位是 rpx(mpvue 用了?px2rpx-loader?,就算在 css 里寫成 px 也會被編譯成 rpx)。

小程序 canvas 的?save?和?restore?功能在這里很雞肋,每次都需要完全重繪一次。特別是用戶拖動文字更新文字坐標的功能,?touchmove?事件一直觸發,就一直更新 canvas,小程序里沒有?requestAnimationFrame?的方法,所以就自己得~~ 從網上找~~ 封裝一個,在拖動時起到節流的效果。

canvas 輸出的圖片只支持 jpg 或者 png,因此即使用 gif 圖的模版也只能生成靜態的表情包,殘念。

總結

大體上使用 mpvue 的體驗還是挺好的。mpvue 和 wepy 的寫法上比較類似,mpvue 對 vue 開發者來說更友好容易上手,wepy 更接近于原生小程序。雖然框架的出現屏蔽了一些原生小程序寫起來很丑陋的地方,?但是不管用什么框架,原生小程序的文檔還是需要掌握的?,有一大堆的坑等著要踩,有時候不得不從編譯出的文件里面找原因。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457495.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql int類型的長度值

整數類型的存儲和范圍(來自mysql手冊) 類型字節最小值最大值(帶符號的/無符號的)(帶符號的/無符號的)TINYINT1-1281270255SMALLINT2-3276832767065535MEDIUMINT3-83886088388607016777215INT4-2147483648214748364704294967295BIGINT8-92233720368547758089223372036854775807…

龍王我當定了(一個在QQ刷龍王的腳本)

自從學了python&#xff0c;龍王再也沒丟過&#xff0c;就是經常被打, QQ 和 TIM 都可以&#xff0c;發送時要把聊天窗口打開。 # 如果import報錯&#xff0c;那可以pip下載這幾個模塊試一試 import win32gui import win32con import win32clipboard as w import random from…

時序數據合并場景加速分析和實現 - 復合索引,窗口分組查詢加速,變態遞歸加速...

時序數據合并場景加速分析和實現 - 復合索引&#xff0c;窗口分組查詢加速&#xff0c;變態遞歸加速 作者 digoal 日期 2016-11-28 標簽 PostgreSQL , 數據合并 , 時序數據 , 復合索引 , 窗口查詢 背景 在很多場景中&#xff0c;都會有數據合并的需求。 例如記錄了表的變更明細…

navicat for mysql 數據庫備份與還原

一, 首先設置, 備份保存路徑 工具 -> 選項 點開 其他 -> 日志文件保存路徑 二. 開始備份 備份分兩種, 一種是以sql保存, 一種是保存為備份 SQL保存 右鍵點擊你要備份的數據庫, -> 轉儲SQL文件 選擇位置和文件名 開始轉儲 導入 建議 刪除所有表 或 重新建數據庫 同導出…

DES的原理及python實現

DES加密算法原理及實現 DES是一種對稱加密算法【即發送者與接收者持有相同的密鑰】&#xff0c;它的基本原理是將要加密的數據劃分為n個64位的塊&#xff0c;然后使用一個56位的密鑰逐個加密每一個64位的塊&#xff0c;得到n個64位的密文塊&#xff0c;最后將密文塊拼接起來得…

python按身高體重排隊_LeetCode-python 406.根據身高重建隊列

題目鏈接難度&#xff1a;中等 類型&#xff1a; 數組假設有打亂順序的一群人站成一個隊列。 每個人由一個整數對(h, k)表示&#xff0c;其中h是這個人的身高&#xff0c;k是排在這個人前面且身高大于或等于h的人數。 編寫一個算法來重建這個隊列。注意&#xff1a;總人數…

遠程連接mysql數據庫,1130問題

遠程或使用非127.0.0.1和localhost地址連接時&#xff0c;出現代號為1130問題&#xff0c; ERROR 1130: Host 192.168.2.159 is not allowed to connect to this MySQL server 猜想這是沒有授權&#xff0c;將mysql數據庫中user表中host列的localhost改為%&#xff0c;重新啟動…

華為手機充滿有提醒嗎_2020手機充電速度排名:最快21分鐘充滿,華為第15名

5G手機扎堆出現&#xff0c;中國5G基站數量也是不斷增多&#xff0c;中國移動曾經表態&#xff0c;2020年底將會在全國地級市覆蓋5G網絡&#xff0c;全民5G時代終于到來&#xff01;從目前國內手機出貨量數據來看&#xff0c;5G手機占比已經達到了六成以上&#xff0c;國產5G手…

關于移動手機端富文本編輯器qeditor圖片上傳改造

日前項目需要在移動端增加富文本編輯&#xff0c;上網找了下&#xff0c;大多數都是針對pc版的&#xff0c;不太兼容手機&#xff0c;當然由于手機屏幕小等原因也限制富文本編輯器的眾多強大功能&#xff0c;所以要找的編輯器功能必須是精簡的。 找了好久&#xff0c;發現qedit…

【python】生成器

生成器 直接總結 創建生成器的方法 生成器表達式&#xff1a;(i for i in [1, 2])yield: 函數中出現yield這個函數就是生成器&#xff0c;函數&#xff08;生成器&#xff09;執行到yield時會返回yield后面的值&#xff0c;并暫停&#xff0c;知道下次被喚醒后會從暫停處接著…

python redis 性能測試臺_Redis性能測試

Redis 性能測試Redis 性能測試是通過同時執行多個命令實現的。Redis性能測試主要是通過src文件夾下的redis-benchmark來實現(Linux系統下)語法redis 性能測試的基本命令如下&#xff1a;redis-benchmark [option] [option value]實例以下實例同時執行 10000 個請求來檢測性能&a…

Java IO 系統

Java IO系統 File類 用來處理文件目錄&#xff0c;既可以代表一個特定文件的名稱&#xff0c;也可以代表一組文件的名稱&#xff0c;如果代表的是一個文件組&#xff0c;可以調用File.list()方法返回一個字符數組。 list()不傳遞任何參數時返回該目錄下所有文件或文件名的字…

Linux Crontab 任務管理工具命令以及示例

Crontab 是 Linux 平臺下的一款用于循環執行例行任務的工具,Linux 系統由 cron (crond) 這個系統服務來控制任務 , Linux系統本來就有很多的計劃任務需要啟動 , 所以這個系統服務是默認開機啟動的 。 Linux 為使用者提供的計劃任務的命令就是 Crontab Crontab 是 Linux 下用來周…

Linux 網絡編程詳解一(IP套接字結構體、網絡字節序,地址轉換函數)

IPv4套接字地址結構 struct sockaddr_in {uint8_t sinlen;&#xff08;4個字節&#xff09;sa_family_t sin_family;&#xff08;4個字節&#xff09;in_port_t sin_port;&#xff08;2個字節&#xff09;struct in_addr sin_addr;&#xff08;4個字節&#xff09;char sin_zer…

地籍cad的lisp程序大集合_AutoCAD-LISP程序100例

{:soso_e179:}AutoCAD-LISP程序100例.JPG (143.82 KB, 下載次數: 28)2011-10-18 14:42 上傳有說明很好&#xff01;頂如果您使用 AutoCAD,下面的內容對您一定有幫助。在某些方面能大大提高您的工作效率。下面的程序均以源程序方式給出&#xff0c;您可以使用、參考、修改它。bg…

javascript中數組的22種方法

前面的話數組總共有22種方法&#xff0c;本文將其分為對象繼承方法、數組轉換方法、棧和隊列方法、數組排序方法、數組拼接方法、創建子數組方法、數組刪改方法、數組位置方法、數組歸并方法和數組迭代方法共10類來進行詳細介紹對象繼承方法數組是一種特殊的對象&#xff0c;繼…

javascript/jquery高度寬度詳情解說分析

為什么80%的碼農都做不了架構師&#xff1f;>>> 一、window對象表示瀏覽器中打開的窗口 二、window對象可以省略 一、document對象是window對象的一部分 二、瀏覽器的HTML文檔成為Document對象 window.location和document.location window對象的location屬性引用的…

農用地包括哪些地類_土地地類一覽表

一級類二級類三級類含義編號三大類名稱編號名稱編號名稱1農用地指直接用于農業生產的土地&#xff0c;包括耕地&#xff0c;園地&#xff0c;林地&#xff0c;牧草地及其他的農業用地11耕地指種植農作物、土地&#xff0c;包括熟地、新開發復墾整理地&#xff0c;休閑地、輪歇地…

紅黑樹插入時的自平衡

紅黑樹插入時的自平衡 紅黑樹實質上是一棵自平衡的二叉查找樹&#xff0c;引入帶顏色的節點也是為了方便在進行插入或刪除操作時&#xff0c;如果破壞了二叉查找樹的平衡性能通過一系列變換保持平衡。 紅黑樹的性質 每個節點要么是紅色&#xff0c;要么是黑色根節點必須是黑…

說一下自己對于 Linux 哲學的理解

查閱了一些資料&#xff0c;官方的哲學思想貌似是&#xff1a; 一切皆文件由眾多單一目的的小程序&#xff0c;一個程序只實現一個功能&#xff0c;多個程序組合完成復雜任務文本文件保存配置信息盡量避免與用戶交互什么&#xff0c;你問我的理解&#xff1f;哲學思想&#xff…