【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不会
相关推荐
cypking10 分钟前
解决 axios get请求瞎转义问题
vue.js
向阳25618 分钟前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
艾克马斯奎普特24 分钟前
Vue.js 3 渐进式实现之响应式系统——第一节:系列开篇与响应式基本实现
vue.js
梅子酱~28 分钟前
Vue 学习随笔系列二十二 —— 表格高度自适应
javascript·vue.js·学习
你的人类朋友32 分钟前
JS严格模式,启动!
javascript·后端·node.js
Carlos_sam42 分钟前
OpenLayers:如何控制Overlay的层级?
前端·javascript
莫循瑾木1 小时前
Vue3 Composition API 完全指南
前端·vue.js·前端工程化
初辰ge1 小时前
后端说“基本增删改查都写好了,就差切图仔对接口了!”——我一怒之下撸了个代码生成器
前端·vue.js
z_mazin1 小时前
JavaScript逆向魔法:Chrome开发者工具探秘之旅
javascript·chrome·爬虫
绿草在线1 小时前
Mock.js虚拟接口
开发语言·javascript·ecmascript