最新踩坑記錄canvas使用drawImage報(bào)的錯(cuò)

-
這個(gè)主要是在最新的api中canvas是使用wx.createSelectorQuery獲取的節(jié)點(diǎn),當(dāng)生成圖片的時(shí)候,不能使用wx.canvasToTempFilePath這個(gè)api,需要使用canvas.createImage()這個(gè)api創(chuàng)建圖片,在圖片的onload中使用ctx.drawImage第一個(gè)參數(shù)記得是當(dāng)前創(chuàng)建的圖片標(biāo)簽,不是圖片的路徑,否則就會(huì)提示上面的報(bào)錯(cuò)
image.png
1、寫class中的三木運(yùn)算符的時(shí)候不要進(jìn)行換行,否則編輯器報(bào)錯(cuò)
2、在小程序中使用flex進(jìn)行布局,在ios手機(jī)上,也就是ipone等機(jī)型,底部會(huì)有問題,我們需要加一個(gè)代碼padding-bottom: env(safe-area-inset-bottom);(可以加到當(dāng)前整個(gè)大的盒子中就可以)(可以百度這一句代碼,詳細(xì)的看看)將底部的安全距離進(jìn)行流出來,還有有時(shí)候底部固定,中間進(jìn)行overflow:auto;flex:1;的時(shí)候,底部的高度會(huì)沒有了,這個(gè)時(shí)候第一種就是將高度加多一點(diǎn),第二種就是外部不加高度,使用子元素的高度加margin或者是padding進(jìn)行頂一下
-
不加底部安全距離的
image.png -
加了底部安全距離的
image.png
3、自定義的底部彈窗,點(diǎn)擊陰影和關(guān)閉按鈕進(jìn)行隱藏,但是點(diǎn)擊其他的空白區(qū)域也會(huì)觸發(fā)冒泡事件,直接給白色的部分,大的盒子加上catchtap,這個(gè)點(diǎn)擊事件可以什么也不做,這樣的話,再點(diǎn)擊其他的空白區(qū)域就不會(huì)進(jìn)行觸發(fā)冒泡事件了



4、 當(dāng)我們使用點(diǎn)擊按鈕或者是三個(gè)點(diǎn)進(jìn)行分享,由于在生命周期中,沒有成功,失敗的回調(diào)函數(shù),我們不知道用戶有沒有點(diǎn)擊分享出去,點(diǎn)擊分享,在進(jìn)行取消,也是會(huì)被認(rèn)為是分享成功的,可以使用wx.showShareMenu這個(gè)解決,不過這個(gè)目前是測(cè)試版本,只支持安卓手機(jī),所以會(huì)有點(diǎn)問題
5、微信小程序中input框禁止輸入表情符號(hào)
-
注:在小米手機(jī)的輸入法上,表情會(huì)帶一個(gè)空格,會(huì)有點(diǎn)問題
//禁止input框中輸入表情符號(hào)
const emoji = function(data){//data就是input框中的value值
let reg = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/gi ;
if(data.match(reg)){
data = data.replace(reg,'');
}
return data;
}
6、websocket的注意事項(xiàng)(可以查看我的這篇文章)
7、在小程序中使用web-view的注意事項(xiàng)
- 首先需要?jiǎng)?chuàng)建一個(gè)頁面進(jìn)行使用web-view
<web-view src="https://www.baidu.com"></web-view>
- 還有登錄微信公眾平臺(tái),開發(fā)管理---->開發(fā)設(shè)置中將我們的業(yè)務(wù)域名進(jìn)行配置,注意是https的別加錯(cuò)了
- 注意:如果你的h5頁面更新的很頻繁,那么你直接使用時(shí)間戳的形式(加載h5頁面的時(shí)候會(huì)很慢),如果長時(shí)間才進(jìn)行更新一次,可以直接將隨機(jī)數(shù)進(jìn)行寫死就可以出來了
<web-view src="https://www.baidu.com/help.html?p=123'}}"></web-view>
<!-- <web-view src="https://www.baidu.com/help.html?p=timestamp'}}"></web-view> -->
- 每次更新h5后,因?yàn)橛芯彺娴脑颍覀円獙㈦S機(jī)數(shù)進(jìn)行修改,這樣的話,頁面就會(huì)是你修改后的了
- 我之前看好像還需要下載證書啥的需要進(jìn)行驗(yàn)證,這個(gè)的話,你可以百度下哈,這里直說修改h5后,頁面沒有進(jìn)行更新怎么解決的
小程序跳轉(zhuǎn)到其他的小程序,接收到的參數(shù),一般會(huì)在app.js中的onLaunch和onShow中都可以接收到
- 在這里說得是要在onShow中進(jìn)行接收,原因:在onlaunch中首次可以接收到,當(dāng)用戶點(diǎn)擊A小程序跳轉(zhuǎn)到B小程序,第一次參數(shù)是沒有問題的,用戶關(guān)閉B小程序,在次點(diǎn)擊A小程序跳轉(zhuǎn)到B小程序,(多次重復(fù)這個(gè)操作),就會(huì)導(dǎo)致我們參數(shù)接收的出現(xiàn)問題
小程序獲取用戶的運(yùn)動(dòng)步數(shù)的問題
使用wx.getSetting可以獲取用戶有沒有進(jìn)行授權(quán),在使用wx.authorize進(jìn)行獲取的某一個(gè)權(quán)限進(jìn)行彈框,提示用戶進(jìn)行授權(quán),也可以使用需要授權(quán)的api,也會(huì)進(jìn)行彈框提示的
-
注意:
1、這里當(dāng)彈框授權(quán)后,需要用戶進(jìn)行授權(quán),用戶點(diǎn)了拒絕之后,不可以再次調(diào)用授權(quán)的api進(jìn)行彈框提示用戶授權(quán)(此時(shí)會(huì)直接默認(rèn)是拒絕的狀態(tài)),我們可以進(jìn)行提示用戶,并且使用wx.openSetting直接打開設(shè)置的頁面,讓用戶進(jìn)行手動(dòng)的授權(quán)
2、獲取微信運(yùn)動(dòng)步數(shù)的時(shí)候,使用api獲取的是三十天內(nèi)的,也可以獲取到用戶當(dāng)天的步數(shù),但是需要用戶先點(diǎn)擊進(jìn)入微信運(yùn)動(dòng),在點(diǎn)擊進(jìn)入小程序,這樣我們拿到的數(shù)據(jù)就是最新的了,不然就需要等待微信的刷新機(jī)制進(jìn)行刷新后,我們才能獲取到用戶最新的步數(shù)(這樣的話,會(huì)有延遲,數(shù)據(jù)不是最新的問題,目前沒有好的解決辦法)
wx.getWeRunData({//獲取微信用戶運(yùn)動(dòng)步數(shù)的api
success:res=>{
console.log(res);
},
fail:msg=>{//用戶拒絕后的處理
console.log('用戶拒絕');
console.log(msg);
wx.showModal({
title:'需要授權(quán)才可以',
success:res=>{
if(res.confirm){
wx.openSetting({//直接打開到設(shè)置頁面,讓用戶自己手動(dòng)的進(jìn)行授權(quán)
success (res) {
console.log(res.authSetting['scope.werun']);//返回true,說明用戶授權(quán)了,返回false,說明用戶沒有或者是關(guān)閉了,需要進(jìn)行提示
}
})
}
}
})
}
})
=================使用wx.getSetting獲取用戶是否授權(quán)===============
wx.getSetting({
success(res) {
console.log('---------sasa-----------');
console.log(res.authSetting['scope.werun']);
if (!res.authSetting['scope.werun']) {
wx.authorize({
scope: 'scope.werun',
success () {
console.log('111');
},
fail:_msg=>{
// console.log((_msg));
}
})
}
},
fail:msg=>{
console.log('錯(cuò)誤');
console.log(msg);
},
complete:_s=>{
console.log(_s);
}
})
小程序中使用canvas,獲取不到node,這個(gè)我們要將canvas寫成是單標(biāo)簽就可以了(或者你直接將我的這段代碼直接進(jìn)行cv就可以了)
<view class="wrap">
<canvas type="2d" id="canvas" style="width: 100%; height: 100%;" />
</view>
onReady: function () {
// 使用 wx.createContext 獲取繪圖上下文 context
const query = wx.createSelectorQuery()
query.select('#canvas')
.fields({ node: true, size: true })
.exec((res) => {
console.log(res);
const canvas = res[0].node
const ctx = canvas.getContext('2d')
const dpr = wx.getSystemInfoSync().pixelRatio
canvas.width = res[0].width * dpr
canvas.height = res[0].height * dpr
ctx.scale(dpr, dpr)
ctx.fillRect(0, 0, 100, 100)
})
},
微信小程序中使用uCharts
-
根據(jù)項(xiàng)目的需求,選用了uCharts中的刻度表的功能,uCharts是使用uniapp編寫的插件,可以在全端使用,但是我當(dāng)時(shí)看了好幾遍的文檔,還是沒有看出來,在gitee上的項(xiàng)目實(shí)例中是可以顯示的,但是我想要其他的功能,不知道怎么整,最后只能根據(jù)項(xiàng)目實(shí)例中的UNIAPP,直接復(fù)制進(jìn)行簡單的一些修改就行,他有個(gè)小程序掃碼體驗(yàn),里面的每個(gè)功能都會(huì)顯示在那個(gè)頁面下,根據(jù)這個(gè)進(jìn)行查找就可以了,根據(jù)你的項(xiàng)目需求,或許還需要進(jìn)行簡單的修改下源碼
image.png 第一種是uCharts中提供的,進(jìn)行簡單的修改了下源碼
第二個(gè)是百度就有的,進(jìn)行簡單的修改了下
圖片中的紅色部分是項(xiàng)目中要有個(gè)圖片,這里就簡單的用了一個(gè)圖片進(jìn)行展示了
這個(gè)的源碼的話,就放到我的gitee上的倉庫了,有需要的小伙伴可以看看,這個(gè)是測(cè)試所以寫的沒怎么進(jìn)行優(yōu)化,可以湊活看哈https://gitee.com/fen-xin/progress-bar.git
微信小程序中生成小程序碼,長按手機(jī)不展示識(shí)別二維碼的情況
- 由于生成小程序碼是通過后臺(tái)請(qǐng)求微信返回的一個(gè)圖片路徑,然后使用canvas進(jìn)行畫上去的,并生成圖片,此時(shí)長按點(diǎn)擊沒有顯示識(shí)別二維碼,解決:1、可能是生成的小程序碼是個(gè)透明的,然后canvas中底部的背景不是白色的,所以導(dǎo)致的
在小程序中生成條形碼
- 一定要使用wxapp-barcode這個(gè)插件,使用wxbarcode這個(gè)插件生成的條形碼不會(huì)被識(shí)別,切記!?。?/li>
- 使用方法,首先下載安裝(將文件提取放到小程序的文件夾中)
npm i wxapp-barcode
-
下載下來的文件中有demo,作者寫的案例,不會(huì)的可以看看那個(gè)
image.png
使用scroll-view的上拉加載及頁面本身的下拉刷新的問題
- 當(dāng)我們下拉刷新時(shí),清空當(dāng)前數(shù)據(jù),加載后重新賦值,為了讓頁面回到頂部,此時(shí),你會(huì)發(fā)現(xiàn)接口被調(diào)用了兩遍
- 觸發(fā)下拉刷新的方法后,他加載的數(shù)據(jù)要是有10條,那么滿足scroll-view的上拉加載的條件,此時(shí),又會(huì)觸發(fā)一次
-
解決方法: 我們可以不讓當(dāng)前的數(shù)據(jù)為空,加載后,讓scroll-view的有個(gè)scroll-top為0 ,就可以滾動(dòng)到頂部了
image.png -
data 中進(jìn)行聲明
image.png -
數(shù)據(jù)加載出來之后,進(jìn)行重新賦值
image.png
在微信小程序中使用搜索功能,點(diǎn)擊歷史記錄要進(jìn)行排序,將當(dāng)前點(diǎn)擊的放到第一位
- 思路:
- 1、當(dāng)我們進(jìn)行搜索的時(shí)候,要進(jìn)行去重,還有進(jìn)行默認(rèn)不排序,歷史記錄進(jìn)行存儲(chǔ)
- 2、點(diǎn)擊歷史記錄的時(shí)候,進(jìn)行排序,存儲(chǔ)歷史記錄進(jìn)行覆蓋
- 3、每次進(jìn)入當(dāng)前的搜索頁面的 時(shí)候,在onshow中進(jìn)行獲取歷史記錄的存儲(chǔ)數(shù)據(jù),進(jìn)行排序,賦值



在微信小程序中,需要一直進(jìn)行頁面的跳轉(zhuǎn),但是navigateTo只能嵌套10層
- 使用getCurrentPages() 可以獲取當(dāng)前的頁數(shù),當(dāng)超過幾頁之后進(jìn)行關(guān)閉當(dāng)前頁面,在進(jìn)行跳轉(zhuǎn)


(要想實(shí)現(xiàn)canvas簽名可使用mini-smooth-signature這個(gè)插件)
- 使用canvas最新的api進(jìn)行繪制,需要獲取canvas的節(jié)點(diǎn)信息,返回null的問題
- 首先要有type和id,id不是canvas-id看清楚哦
- 要有默認(rèn)的高度和寬度,初始化的時(shí)候,可以將高度進(jìn)行重新賦值
<canvas type="2d" id="signature1" style="width:{{width1}}px;height:{{height1}}px;"></canvas>
data: {
width1: 320,
height1: 200,
},







