【问题标题】:Why (react-)ref attribute does not work when appendChild is used in svg?为什么在 svg 中使用 appendChild 时 (react-)ref 属性不起作用?
【发布时间】:2019-10-21 14:51:26
【问题描述】:

我可以在 react 应用程序中使用 js 创建 svg 及其所有子组件(如 rect 等)。但是我不能给元素 ref 属性。如果我看到生成的源代码,它的 ref=[object Object],因此它不起作用。代码在 componentDidMount 中调用,在 appendChild 之后。所以它应该可以工作,因为它已经在 DOM 中呈现(不是吗?)。 ref 适用于 svg 元素(如果不是动态创建的)。有人能指引我正确的方向吗?

即使使用 React 的 createElement 函数也可以: React.createElement('rect', {key: "myKey", width: 100, height: 100, ref: myRef}) 但它不会创建一个真正的 DOM 节点,它可以与 appendChild 函数一起使用(错误消息是这样说的)。所以我也不能真正使用它。 clipPathRef.current 返回包含的 clipPath 元素,当然可以。 rect 元素被创建和渲染,它只是没有正确的 ref 属性。

const myRef = React.createRef(); 
    const newElement = document.createElementNS("http://www.w3.org/2000/svg", 'rect');
        newElement.setAttribute("width", 100);
        newElement.setAttribute("height", 100);
        clipPathRef.current.appendChild(newElement);

        newElement.setAttribute("ref", myRef);

        console.log(myRef);//outputs [current null]

【问题讨论】:

  • Ref是一个特殊的JSX属性,放在DOM节点上没有特殊属性

标签: reactjs svg react-ref


【解决方案1】:

这个 (newElement.setAttribute("ref", myRef)) 不起作用,因为 React 从不将 ref 属性分配为 html 属性。 React 将其从 props 中过滤出来,并在组件挂载、更新或卸载时自行管理。

查看您的代码示例,如果您始终创建 <rect> 元素,则无需使用 ref。您将新创建的元素放入其中的变量(例如newElement)与 ref 基本相同,但不限于 current 属性。

【讨论】:

  • 首先,感谢您的回答。我需要 ref 属性,因为我附加的 rect 元素需要使用 Greensock 动画库进行动画处理。访问要动画的元素的官方方法是在 React 应用程序中使用 ref(根据 Greensock)。当有 2 个矩形时,它们需要有 2 个不同的 refs 才能分别进行动画处理。
  • @Osiris128 暗示您使用多个元素意味着您不能使用React.createRef,因为它仅适用于一个组件。您必须使用数组并自行管理其中的元素。
  • 当然,我简化了上面的代码。每个元素都会有它自己唯一的 ref(使用 createRef 创建)保存在一个数组中。我看到一个答案,ref 是一个特殊的 JSX 东西,也许我需要放弃那个“appendChild”方法并以不同的方式解决这个问题。
  • 正如我所说,您不能将createRefref 属性与使用createElement(NS) 创建的简单html 元素一起使用,这不会改变。只需将创建元素的变量(例如newElement)添加到您的数组中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多