Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用React创建交互式SVG组件

使用React创建交互式SVG组件
EN

Stack Overflow用户
提问于 2015-12-26 05:25:22
回答 1查看 8.9K关注 0票数 12

假设我有一个SVG元素,其中包含所有美国州的路径。

代码语言:javascript
运行
AI代码解释
复制
<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标记的选项:使用生料装载机将其作为原始标记插入,并使用dangerouslySetInnerHTML创建一个组件。

代码语言:javascript
运行
AI代码解释
复制
var InlineSvg = React.createClass({
  render() {
    var svg = require('./' + this.props.name + '.svg');
    return <div dangerouslySetInnerHTML={{__html: svg}}></div>;
  }
});

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

代码语言:javascript
运行
AI代码解释
复制
var NewComponent = React.createClass({
  render: function() {
    return (
        <svg>
            <g id="nh">
                <title>New Hampshire</title>
                <path d="m 880.79902,142.42476 0.869,-1.0765 1.09022,..." id="NH" className="state nh" />
            </g>
            ...
        </svg>
    );
});

最后,假设除了SVG映射之外,还有一个简单的HTML列表显示所有状态。每当用户悬停在列表项上时,对应的SVG路径应移动填充颜色。

现在,我似乎无法理解的是如何更新React组件以反映悬停状态。当然,我可以深入到DOM中,按类名选择SVG状态并更改其颜色,但这似乎并不是这样做的“反应”方式。指手画脚会很感激的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-27 03:29:02

你需要做两件事:

1)在每个列表项上设置一个事件侦听器,以便将突出显示的项通知应用程序。

代码语言:javascript
运行
AI代码解释
复制
<li
    onMouseOver={() => this.handleHover('NH')}
    onMouseOut={() => this.handleUnhover()}
>
    New Hampshire
</li>

2)捕获数据,并将其传播给SVG组件。

这是更复杂的部分,这取决于你如何组织你的应用程序。

  • 如果整个应用程序是一个单独的反应性组件,那么handleHover将简单地更新组件状态。
  • 如果您的应用程序被划分为多个组件,那么handleHover将触发作为支柱传入的回调。

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

代码语言:javascript
运行
AI代码解释
复制
handleHover(territory) {
    this.props.onHighlight(territory);
}

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

假设您有一个包含SVG映射和列表的父组件,它可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
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>
        );
    }

}

这里的关键是highlighted状态变量。每次发生新的悬停事件时,highlighted的值都会发生变化。此更改将触发重呈现,新值将传递给MapDiagram,后者可以确定要突出显示的SVG的哪一部分。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34471758

复制
相关文章
react 创建组件以及组件通信
关于React.createClass方法与class App extends Component方法的区别
念念不忘
2019/03/29
9810
SVG - 创建SVG图片
SVG - 创建SVG图片 HTML5学堂:之前在绘图中使用到了SVG以及Canvas,因此决定最近将绘图类的知识和大家分享一下。从研究角度来说,SVG比Canvas要难很多。没有合适的中文文档,自己只能去翻译英文文档(唉,英语不好啊)。今天先来说说SVG的基本知识以及创建SVG的基本方法。 SVG是什么 W3C推荐的网页图形格式,类似于Flash,SVG是一种描述二维矢量图形的标记语言,但它是一种开发的以XML为基础的语言,不是一种私有语言。 SVG的支持程度 IE8-以及Android 2.3默认浏览器
HTML5学堂
2018/03/12
4.3K0
如何在react中使用svg icons
首先,react是支持svg,所以使用svg是没有问题的,但是到目前为止(版本为v15.3.0)还不支持svg的use标签,所以打算使用svg symbol还是趁早放弃,以下为官方的svg支持标签:
IMWeb前端团队
2019/12/04
1.6K0
如何在react中使用svg icons
React入门系列(三)创建组件
React创建组件有两种模式,原生JavaScript和JSX语法,后者是React推荐的构组件方式,因为,它能更加精确得定义包含属性的树状结构。
娜姐
2020/09/22
5510
使用typescript rollup storybook创建你的react组件库
mkdir mylibrary cd mylibrary npm init -y npx -p @storybook/cli sb init --type react npm i -D fork-ts
lilugirl
2021/03/11
2.2K0
使用typescript rollup storybook创建你的react组件库
如何在react中使用svg icons
该文介绍了如何在React组件中使用SVG图标。首先介绍了传统的使用方式,然后介绍了使用React组件的方式,最后通过一个名为`Mic`的组件示例展示了如何将SVG图标转换为React组件。通过使用Fis3插件,可以自动将SVG转换为React组件,从而简化了React项目中使用SVG的过程。
IMWeb前端团队
2017/12/29
2.8K0
如何在react中使用svg icons
React篇(020)-如何在 React 中创建组件?
答案:有两种可行的方法来创建一个组件: 1. Function Components: 这是创建组件最简单的方式。这些是纯 JavaScript 函数,接受 props 对象作为第一个参数并返回 React 元素:
齐丶先丶森
2022/05/12
3.2K0
「React 手册 」如何创建函数组件?
大家好,在前面的几篇相关文章里,我们一起学习了如何使用类的方式声明组件,以及如何属性传值和处理本地数据状态,本篇文章我们一起学习如何使用函数的方式进行声明组件。
前端达人
2019/12/30
2.9K0
「React 手册 」如何创建函数组件?
React入门四:React组件的使用
思考:项目中的组件多了后,该如何组织这些组件那? 选择1:将所有组件都写在一个js文件中 选择2:将所有组件都放到单独的js文件中 组件作为一个独立的个体,一般会放到一个单独的js文件中。
用户4793865
2023/01/12
1.4K0
使用storybook管理React组件
2018年10月storybook发布了4.0版本,在UI层支持、构建、移动端、stroy参数等多个方面进行了升级优化。本文已React的UI组件为例,演示如何新建/集成Storybook到项目中,并对UI组件进行全方位的管理,包括发布、demo文档、测试等。
IMWeb前端团队
2019/12/03
3.5K0
使用storybook管理React组件
React中创建组件的3种方式
那么问题来了,这三种方式有啥区别呢?这里说明一个问题,很多时候同一种效果往往有很多种实现方式,所以我们在学习的过程中要避免章节化思维,要对技术进行横向比较,这样能帮你更 加深入的理解各种方式的优缺点。
IT人一直在路上
2019/09/18
2.1K0
react源码分析:组件的创建和更新
因为初始化的源码文件部分所涵盖的内容很多,包括创建渲染、更新渲染、Fiber树的创建与diff,element的创建与插入,还包括一些优化算法,所以我就整个的React执行流程画了一个简单的示意图。
flyzz177
2022/10/19
1.3K0
使用 Fontawesome 的 React 组件
Fontawesome 是一套图表字体库框架,我们经常在项目中用到它的各式各样的图标,本文介绍的是如何使用其 React 组件形式的包应用到项目中。
我与梦想有个约会
2023/10/21
4080
使用 Fontawesome 的 React 组件
Fontawesome 是一套图表字体库框架,我们经常在项目中用到它的各式各样的图标,本文介绍的是如何使用其 React 组件形式的包应用到项目中。
我与梦想有个约会
2020/01/04
2.2K0
React中使用类组件
接下来我们需要渲染一些Dom,并且定义一些状态数据,在react中响应式数据定义在state变量中
用户6256742
2022/07/06
8220
react源码分析--组件的创建和更新
因为初始化的源码文件部分所涵盖的内容很多,包括创建渲染、更新渲染、Fiber树的创建与diff,element的创建与插入,还包括一些优化算法,所以我就整个的React执行流程画了一个简单的示意图。
flyzz177
2022/12/14
1.3K0
react源码之组件的创建和更新
因为初始化的源码文件部分所涵盖的内容很多,包括创建渲染、更新渲染、Fiber树的创建与diff,element的创建与插入,还包括一些优化算法,所以我就整个的React执行流程画了一个简单的示意图。
flyzz177
2022/12/05
1.2K0
React Native使用原生组件
概述 有时候App需要访问平台API,但React Native可能还没有相应的模块包装;或者你需要复用一些Java代码,而不是用Javascript重新实现一遍;又或者你需要实现某些高性能的、多线程的代码,譬如图片处理、数据库、或者各种高级扩展等等。 我们知道React Native本身对这种偏业务和底层调用是不关心的,这时候我们就想到了原生组件,我们通过调用原生组件,然后经过特定的封装来达到效果。如我们在原生开发中常见的Toast为例: 原生模块封装 假设我们希望可以从Javascript发起一个T
xiangzhihong
2018/02/05
2.3K0
【React】633- 使用 Hooks 优化 React 组件
由于我所在的业务是资讯内容类业务,因而在业务中会经常碰到如下场景:有一个内容列表,列表中需要按照一定的规则插入广告。除了获取广告数据,广告展现和点击后需要有打点上报逻辑。正常来说我们会这么写:
pingan8787
2020/06/24
1.3K0
【React】633- 使用 Hooks 优化 React 组件
使用TypeScript创建React应用
文章链接:https://bobbyhadz.com/blog/react-create-react-app-typescript[1]
chuckQu
2022/08/19
1.2K0

相似问题

React上传SVG文件并使用创建组件

114

使用弹出的创建-react app创建SVG Sprite组件

21

使用svg作为react组件

339

如何使用SVG React组件作为背景?

10

导入SVG作为react组件

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档