我已经序列化了Canvas对象,它是我通过canvas.toJSON()获得的,在反序列化canvas.loadFromJSON(jsonObj, canvas.renderAll.bind(canvas))之后,我不能在Canvas中操作对象,它们是不可 Select 的.

Expecting behavior:个 反序列化之后,所有对象都必须像序列化之前一样是可 Select 和可管理的.

我在codesandbox年内复制了一期

How to reproduce:

  1. 单击序列化
  2. 单击[设计]按钮
  3. try 抓取、旋转或更改下部图像的大小

也许我做错了什么?将乐于提供任何帮助和建议.

推荐答案

经过一番研究,我发现了问题出在哪里.

Why I couldn't manipulate deserialized object? Because there were 2 canvas html elements. As we can see from screenshot, there are 2 canvases. First one (green border) with image and the second (red border) is empty. And all my interaction was with empty (red) canvas. If I delete second canvas I can interact with image object. enter image description here

useEffectStrictMode个回调中有Why did it happen?个调用两次,这就是为什么我得到嵌套的画布html元素的原因.

How to fix it?有几种变通方法可以摆脱它.

  1. go 掉StrictMode.显而易见,简单,但不想要的解决方案.
  2. 在组件外部使用标志变量.
let wasCalled = false;
export default function App() {
// ...
useEffect(() => {
  if (wasCalled) {
    return;
  }
  wasCalled = true;
// ...
},[])

也许还有更好的解决方案,比如以其他方式初始化画布实例,但目前对我来说还可以.

Reactjs相关问答推荐

eslint -无法解析模块的路径@web3modal/ethers/react导入/no-unresolved

Formik验证不适用于物料UI自动完成

为什么我的React App.js只在页面刷新时呈现3次?

useCallback()是否应该用于作为prop传递给子组件的函数,即使该组件包装在memo()中?

在transformResponse中使用来自其他查询的缓存

用于获取带有事件处理程序的API的动态路由

蚂蚁 Select .列表弹出窗口不会';有时不会出现

当我无法引用模态组件时,如何使模态组件在 Next.js/React 中管理自己的状态?

如何使用服务器中的数据自动填充表单字段?

React-dom 的钩子调用无效.我能做些什么?

Primereact 的日历组件在每个月 12 日之后使用非唯一键生成

一周前刚开始学习React,一直在调试为什么输入框在每次输入后都没有焦点

需要在窗口调整大小时更新 React 组件

Material UI:使用 mui 手风琴时出现props 类型失败:isValidElement 不是函数

Mui CardMedia 的图片组件

如何根据react 中的 map 功能一次只打开一个弹出窗口?

将鼠标悬停在仅适用于该类的第一个实例的 p5.js 类上

多次响应获取发送请求

Context Api React 的问题

在渲染不显示子元素之后,再次渲染时,子元素状态数据完全消失了.为什么会这样以及如何防止它发生?