【bug记录3】vue中使用Fabric.js,对对象定义Control事件偶尔失效

一、问题场景

我在使用Fabric.js创建了canvas容器后,在其中添加Image对象,并在原型链中修改其图形对象的控制图标和事件,发现control事件无法触发,转而进入到selection相关事件中

代码片段如下:

javascript 复制代码
 // // 添加右下角图标 缩放
      fabric.Object.prototype.controls.br = new fabric.Control({
        x: 0.5,
        y: 0.5,
        cursorStyle: 'default',
        mouseUpHandler: getXY,
        actionName: 'zoom',
        // @ts-ignore
        actionHandler: fabric.controlsUtils.scalingEqually,
        render: renderIcon(barZoom),
        // @ts-ignore
        cornerSize: 24
      })


//....

//创建图片对象
const image = new Image()
image.setAttribute('crossOrigin', 'anonymous')
image.src = item.imgSrc
image.onload = () => {
        //设置缩放倍数
        const imgZoom = 100 / image.width
        const rect = new fabric.Image(image, {
          left: 0,
          top: this.pageList[0].height! / 2,
          borderColor: '#19BCAA',
          borderScaleFactor: 2,
          // 控制角大小
          cornerSize: 30,
          hasBorders: true,
          padding: -2,
          // 指示对象控件(边框/控件)是否在叠加图像上方呈现
          // @ts-ignore
          controlsAboveOverlay: true,
          borderOpacityWhenMoving: 1,
          // 转角在画布Itext中是否透明
          transparentCorners: false,
          //允许控制事件
          hasControls: true,
          centeredScaling: true,
          allowTouchScrolling: true,
          lockScalingFlip: true, // 禁止翻转
          lockMovementX: true, //禁止横向拖动
          scaleX: imgZoom,
          scaleY: imgZoom
        })

        // 设置周边control不展示的点位。 ml:左,mb:下,mr:右,mt:上,mtr:旋转,tl:左上角,bl:左下角,tr:右上角,br:右下角
        rect.setControlsVisibility({
          bl: false,
          ml: false,
          mb: false,
          mr: false,
          mt: false,
          // br: false,
          // tl: false,
          mtr: false,
          tr: false
        })
        
        //canvas对象在前文代码已经完成创建
        Canvas.add(rect)
        Canvas.centerObject(rect)

        //此时设置object为活跃状态,被选中,从而允许control
        Canvas.setActiveObject(rect)
        Canvas.selectable = true
        Canvas.renderAll()
        // 选择
        rect.on('mousedown', e => {
          e.e.preventDefault()
          e.e.stopPropagation()
          //....
        })

        // 取消选择
        this.canvasList[0].qfzCanvas.on('selection:cleared', () => {
    
        })

二、问题解决

最后到处搜类似问题,找到一个帖子给了我启发:

在vue3项目使用fabric.js 图片缩放失效?-腾讯云开发者社区-腾讯云

发现可能与fabric.js处理vue响应式数据(转化为Proxy对象)存在漏洞有关。

🌟解决方法:

  • 和上面帖子说的一样,在往canvas对象里面add图形对象的时候,用markRaw将图形对象标记为原始对象,将避免其变为proxy
javascript 复制代码
 Canvas.add(markRaw(rect))
  • 直接将Canvas对象定义在全局或者setup中,而不是定义在vue的data属性里面。因为data会对数据自动绑定监听捏~而setup不会
相关推荐
光影少年9 分钟前
如果 React 组件的属性没有传值,它的默认值是什么?
前端·javascript·react.js
Keven_1118 分钟前
BUG:UVA116
算法·bug·图论
Q26433650231 小时前
【有源码】基于Spring Boot和Vue的在线考试与交流系统-教育信息化背景下在线考试与交流一体化平台
java·vue.js·spring boot·mysql·spring·毕业设计·课程设计
Helix2502 小时前
2026编程入门指南:零基础如何科学选择第一门编程语言?
java·c语言·javascript·零基础·编程语言·python入门·编程就业
鬼手点金2 小时前
opencode-隐私优先配置
服务器·前端·javascript·bug·openclaw
且从容.2 小时前
JS篇-----
java·javascript·jvm
吠品3 小时前
箭头函数为什么不能 new
开发语言·javascript·原型模式
苹果二3 小时前
使用Vue的指南
前端·javascript·vue.js
害人终害己3 小时前
‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
前端·javascript·vue.js
excel15 小时前
研究 Vue 3 源码的收获
前端·vue.js