【问题标题】:Snap.svg in React - how to access the svg in a lifecycle method?React 中的 Snap.svg - 如何在生命周期方法中访问 svg?
【发布时间】:2017-11-04 12:50:26
【问题描述】:

我有一个 svg 地图组件,我想在道具更改时对其进行更新。 在某些路径上添加和减去类……诸如此类。

Snap.svg 似乎是要走的路。如果有人知道更好的方法,我想听听!

所以这是我的渲染方法,用皱眉标记的两行是我想要在诸如ComponentWillReceiveProps 之类的生命周期方法中工作的那一行

render() {
    var map = Snap('#map');
    Snap.load("images/map.svg", function(data){
        if (map) {
            map.append(data);
            const a2047 = map.select('#a2047');               <---- :(
            a2047.attr({stroke:'yellow', strokeWidth:'6px'})  <---- :(
        }
    })

    return (
        <div className="map" id="map"/>
    );
}

问题是,map 除了在这个Snap.load 回调中之外,在其他任何地方都不起作用。我尝试了几种方法,使用statewindow.mapthis.map...,我得到了诸如“选择不是函数”之类的错误。

如何访问ComponentWillReceiveProps中的地图?

或者 Snap.svg 甚至是该应用程序的最佳选择?

【问题讨论】:

  • 这样做了 - 谢谢 - 但 Snap.load 会根据道具的每一次变化创建一个新地图。目前正在寻找最佳解决方案...
  • 或许在状态中设置一个“已加载”标志?

标签: reactjs svg snap.svg


【解决方案1】:

您正在使用 Snap.svg 进行直接 DOM 操作,rendercomponentWillReceiveProps 都不是这样做的好地方。我建议您在 componentDidUpdate 中执行此操作,它会在组件渲染后立即调用。但这不会为初始渲染调用。所以我们必须在componentDidUpdatecomponentDidMount 中都进行这种DOM 操作。为了防止重复相同的代码,您可以将此操作保留在另一个公共类方法中,并从componentDidUpdatecomponentDidMount 中调用它。此外,由于此时您的道具已更新,您只需在新类方法中使用this.props 即可访问它们。

示例:

// @sigfried added to answer his comment below
import Snap from 'snapsvg-cjs';

export default class Mermaid extends Component {
  svgRender() {
    let element = Snap(this.svgDiv)
    Snap.load("images/map.svg", function(data){
      if (element) {
        element.append(data);
      }
    });
  }
  componentDidMount() {
    this.svgRender();
  }
  componentDidUpdate() {
    this.svgRender();
  }
  render() {
    return  <div ref={d=>this.svgDiv=d} />
  }
}

【讨论】:

  • 感谢先生让我的结构变得更好。现在一切正常。最初的问题 - 如何访问现有地图,已通过使用 this.map = map 解决
  • @dwilbank 很高兴它对您有所帮助
  • 抱歉,我很抱歉,但是你们中的一个人(@dwilbank 或 @tharaka-wijebandara)可以发布解决方案的样子吗?我最不清楚的部分是渲染返回中的内容。它应该是空的吗? (然后可能会删除原始问题中注释掉的内容。)Snap 真的应该使用它的 id 找到它吗?裁判不是更好吗?
  • @Sigfried 感谢您提供的示例。我在这个问题的背景下更容易理解。是的。 ref 会更好。我不知道 Snap 也接受 dom 元素而不是选择器字符串。
  • 太棒了。绝对比我的版本更容易理解。
猜你喜欢
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2018-03-06
相关资源
最近更新 更多