繁体   English   中英

Fabric js编辑通过输入添加到画布中的文本

[英]Fabric js edit text added in canvas via input

我在反应应用程序中使用fabricjs 和fabricjs-react。 我需要通过输入编辑文本。 但它不起作用。 也许我错过了什么? 但是当我在输入中输入文本时,画布没有更新,文本保持不变。 我究竟做错了什么? 如何访问fabricjs中的现有文本?

有我的代码https://codesandbox.io/s/sleepy-stitch-yvcr22

UPD:我尝试添加 ID 来做https://codesandbox.io/s/clever-christian-zxb5ge 有用。 也许有一些更通用的解决方案?

import React, { useEffect, useState } from 'react'
import { FabricJSCanvas, useFabricJSEditor } from 'fabricjs-react'
import { fabric } from 'fabric'


export default function App() {
  const { editor, onReady } = useFabricJSEditor()

  const [text, setText] = useState('')
  let headText = new fabric.Text("test", {
    fill: 'black',
    top: 50,
    left: 50,
  })

  const _onReady = (canvas) => {
    canvas.backgroundColor = 'yellow'
    canvas.setDimensions({
      width: 200,
      height: 200,
    })
    canvas.add(headText);
    canvas.renderAll()
    onReady(canvas)
  }

  useEffect(() => {
    if (editor) {
      headText.text = text
      editor.canvas.renderAll()
    }
  }, [text])

  return (
    <>
        <input onChange={(e) => setText(e.target.value)} />
        <FabricJSCanvas onReady={_onReady} />
    </>
  )
}

它不起作用的原因是每当调用 setText() 状态时,都会再次调用 App() 函数以呈现状态更改。

这就是问题所在; 对 App() 的任何子序列调用最终都会创建一个新的 headText 实例

let headText = new fabric.Text("test", {
    fill: 'black',
    top: 50,
    left: 50,
})

您的 useEffect 正在使用该新实例,而画布包含第一个实例。 因此,您尝试的任何更改都指的是错误的对象。

这个快速脏检查证明这是一个不同的对象:

useEffect(() => {
  if (editor) {
    editor.canvas.getObjects()[0].text = text;
    editor.canvas.renderAll()

    console.log(editor.canvas.getObjects()[0] === headText);
  }
}, [text])

解决方案是您需要为 headText 提供自己的状态,以便保留对 App() 对象引用的任何子序列调用。

const [headText, setTextObject] = useState(
new fabric.Text('test', {
   fill: 'black',
   top: 50,
   left: 50,
 }));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM