首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将事件添加到组件中的svg字符串并呈现它

将事件添加到组件中的svg字符串并呈现它
EN

Stack Overflow用户
提问于 2021-02-10 00:38:28
回答 1查看 55关注 0票数 0

基本上,我需要向svg中的特定元素添加事件侦听器,我在组件中以param的形式接收这些元素

代码语言:javascript
复制
export default function RoomPlan({ svg, startDate, endDate}) {
  const [selectedDesk, setSelectedDesk] = useState(null);
  const [previouslySelectedDesk, setPreviouslySelectedDesk] = useState(null);

  var doc = new DOMParser().parseFromString(svg, "text/xml");

  var elements = Array.from(doc.querySelectorAll('#desk rect'));

  if (elements) {
    elements.forEach(function (el) {
      el.addEventListener("click", function(){alert('hi')});
    })
  }

  return (
    <div>
      <h2 className={css.labels}>Select desk</h2>
      <div id={css.roomPlan} dangerouslySetInnerHTML={{ __html: new XMLSerializer().serializeToString(doc)}}></div>
      <div className={css.bookingButtons}>
        <Button id={css.cancelButton}>CANCEL</Button>
        <Button onclick={bookDesk(selectedDesk)}>BOOK DESK</Button>
      </div>
    </div>
  );

我将其作为普通字符串获取,然后将其解析为DOM,然后添加我的eventListeners并将其序列化。但是使用这种方法,象牙不会出现,也不会触发。所以问题是:如何使用string -> DOM -> addedEvents ->渲染svg

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-10 01:31:06

只有在react将标记呈现到DOM中之后,才能附加事件处理程序。要实现这一点,您可以查找react ref with callback

代码语言:javascript
复制
const ref = useCallback(node => {
    if (node !== null) {
      /* do your magic here: node.querySelectorAll('#desk rect') ... */
    }
  }, []);


<div id={css.roomPlan} dangerouslySetInnerHTML={{ __html: svg}} ref={ref}></div>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66123180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档