const imgObj = canvas.createImage()
imgObj.src = path
控制台会报错: Cannot read property 'nodeId' of undefined
真的是巨坑啊
问题原因是:canvas为响应式变量,因此出现该问题
解决方案1:
如果使用reactive声明的可以使用toRaw转成非相应变量
注意:toRaw不能转换ref声明的变量,请将ref声明删除
解决方案2:
将img.src = path改写为 img.srcset = path

// 在自定义的绘图方法drawImage中,一定要重新用createSelectorQuery选择出画布节点实例canvas,然后使用里面的上下文ctx绘图。
// 1、不能用暴露到外部的响应式变量canvas.value.createImage()创建图片,应该是由于canvas.value=res[0].node赋值会导致一些原生方法createImage()失真(cloneDeep也不行,具体原因未查)。TypeError: Cannot read property 'createImage' of undefined,TypeError: Cannot read property 'nodeId' of undefined。
// 2、即使unref(canvas).createImage()可以创建图片,使用image.srcset = imgSrc可以在开发者工具画图,但部分真机运行会静默失败。
// 3、如果尝试其他响应式变量方法,只要image.src = imgSrc赋值不报错, 基本上真机也可以画出来。
// 行不通:
// image = unref(canvas).createImage()
// image.onload = ()=>{ ctx.value.drawImage(image,x,y,w,h)}
// image.srcset = img
// 可行:
const drawImage = function(img, x, y, w, h) { return new Promise((resolve, reject) => { // console.log(canvas.value) // console.log(ctx.value) const query = uni.createSelectorQuery().in(app.proxy) query.select('#myCanvas').fields({ node: true, size: true }).exec((res) => { const canvas = res[0].node const ctx = res[0].node.getContext('2d') const image = canvas.createImage() image.onload = () => { ctx.drawImage(image, x, y, w, h) resolve(true) } image.onerror = (err) => { resolve(false) } image.src = img }) }) }2D=>ctx.value.drawImage(image,sx,sy,sw,sh)
interface mixin CanvasDrawImage {
// drawing images
undefined drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy);
undefined drawImage(CanvasImageSource image, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
undefined drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);
};
--------------------------------------
typedef (HTMLOrSVGImageElement or
HTMLVideoElement or
HTMLCanvasElement or
ImageBitmap or
OffscreenCanvas or
VideoFrame) CanvasImageSource;
谢谢,新手忙活一下午没看出问题,改了三种方案都一直报错,多亏找到你