3

我的问题:

如何获取.svg文件并将其与<svg>标签一起使用,因此我还可以交互地设置它的样式(例如在悬停时),而不是像我在标签示例中所做的那样<img>

目标:

创建一个缩略图视图,在我的主要路线上显示每个国家(149 个)的国旗'/'

问题:

我在我的 Express 代码中设置了一个静态路由,因此所有标志都可用。

server.js:

app.use('/flags', express.static(FLAGS_FILES));
app.get('/flags', async (req, res) => {
    let myFlags;

    await readdir('data/flag-icons/')
        .then((flags) => myFlags = flags)
        .catch(err => console.log('Error:', err))

    res.json(myFlags)
});

在客户端,我想获取每个 .svg 文件并将其内联到我的组件中。

我的 React 组件如下所示:

地图缩略图组件:

render(){
        const {flagcode} = this.props;
        const filepath = `/flags/${mapcode}/vector.svg`;

        console.log('filepath:', filepath);
        return (
            <MapThumbnailStyle>
                <img src={filepath} 
                     alt={flagcode} 
                     title={flagcode} 
                     width='40px' 
                     height='40px' 
                />
            </MapThumbnailStyle>
        );
    }
4

2 回答 2

3

https://github.com/gilbarbara/react-inlinesvg看起来对你有帮助。

于 2018-03-11T15:34:52.020 回答
1

在大多数情况下,您可以直接在函数内内联 SVG 文件的内容render,例如 -

TL;博士

react-svg-loader

它提供了一个 webpack-loader、一个 CLI 和一些其他工具,可以将 SVG 文件转换为 React 组件,该组件在 render 方法中包含 SVG 文件的内容。

这个想法的要点如下 -

矢量.svg

<svg>
  <circle cx="50" cy="50" r="25" stroke-width="5" />
</svg>

Vector.js

现在创建一个vector.js并复制 SVG 的内容,如下所示

import React from "react"
export default () => (
  <svg>
    <circle cx="50" cy="50" r="25" stroke-width="5" />
  </svg>
);

您可以在此处手动编辑一些元素或分配 id 来为它们设置动画。

地图缩略图组件

在您的 MapThumbnail 组件中,您可以将其作为 JS 导入并按照您想要的方式设置 SVG 样式 -

import Vector from "./path/to/vector";

// ...
// ...

render() {
  return <div>
    <Vector />
  </div>
}

这种将 SVG 转换为 React 组件的过程可以在一定程度上实现自动化,并由一些工具提供——其中一个工具是react-svg-loader。免责声明 - 我是 react-svg-loader 的作者。

于 2018-03-11T16:52:40.380 回答