使用React创建交互式SVG组件

假设我有一个SVG元素,其中包含所有美国州的路径.
<svg>
    <g id="nh">
        <title>New Hampshire</title>
        <path d="m 880.79902,142.42476 0.869,-1.0765 1.09022,..." id="NH" class="state nh" />
    </g>
    ...
</svg>

SVG数据保存在扩展名为.svg的单独文件中.假设我想创建该映射的React组件,并完全控制它,以便我可以根据一些外部输入修改各个状态的样式.

使用Webpack,据我所知,我有两个加载SVG标记的选项:使用raw-loader将其作为原始标记插入,并使用dangerouslySetInnerHTML创建一个组件:

var InlineSvg = React.createClass({
  render() {
    var svg = require('./' + this.props.name + '.svg');
    return <div dangerouslySetInnerHTML={{__html: svg}}></div>;
  }
});

或手动将标记转换为有效的JSX:

var NewComponent = React.createClass({
  render: function() {
    return (
        <svg>
            <g id="nh">
                <title>New Hampshire</title>
                <path d="m 880.79902,..." id="NH" className="state nh" />
            </g>
            ...
        </svg>
    );
});

最后,让我们说除了SVG地图之外,还有一个包含所有状态的简单HTML列表.每当用户将鼠标悬停在列表项上时,相应的SVG路径应该移动填充颜色.

现在,我似乎无法弄清楚如何更新React SVG组件以反映悬停状态.当然,我可以进入DOM,通过类名选择SVG状态并更改其颜色,但这似乎不是“反应”方式.一个手指将非常感激.

PS.我正在使用Redux来处理组件之间的所有通信.

你需要做两件事:

1)在每个列表项上设置一个事件监听器,以通知您的应用程序突出显示的项目.

<li
    onMouSEOver={() => this.handleHover('NH')}
    onMouSEOut={() => this.handleUnhover()}
>
    New Hampshire
</li>

2)捕获数据,并将其传播到SVG组件.

这是一个更复杂的部分,它取决于你如何构建你的应用程序.

>如果您的整个应用程序是单个React组件,那么handleHover将只更新组件状态
>如果您的应用程序分为多个组件,则handleHover将触发作为prop传递的回调

让我们假设后者.组件方法可能如下所示:

handleHover(territory) {
    this.props.onHighlight(territory);
}

handleUnhover() {
    this.props.onHighlight(null);
}

假设您有一个包含SVG映射和列表的父组件,它可能看起来像这样:

class MapWrapper extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            highlighted: null;
        };
    }

    setHighlight(territory) {
        this.setState({
            highlighted: territory
        });
    }

    render() {
        const highlighted = { this.state };
        return (
            <div>
                <MapDiagram highlighted={highlighted} />
                <TerritoryList onHighlight={(terr) => this.setHighlight(terr)} />
            </div>
        );
    }

}

这里的关键是突出显示的状态变量.每次发生新的悬停事件时,都会突出显示值的更改.此更改会触发重新渲染,新值将传递到MapDiagram,然后可以确定要突出显示的SVG的哪个部分.

相关文章

导入moment 使用方式 年月日,时分秒 星期几 相对时间 7天后 2小时后 明天 将毫秒转换成年月日
@ 一、前言 为什么介绍redux-actions呢? 第一次见到主要是接手公司原有的项目,发现有之前的大佬在处理...
十大React Hook库 原文地址:https://dev.to/bornfightcompany/top-10-react-hook-libraries-4065 原文...
React生命周期 React的生命周期从广义上分为挂载、渲染、卸载三个阶段,在React的整个生命周期中提供很...
React虚拟DOM的理解 Virtual DOM是一棵以JavaScript对象作为基础的树,每一个节点可以将其称为VNode,用...
React中JSX的理解 JSX是快速生成react元素的一种语法,实际是React.createElement(component, props, ....