How to display svg icons(.svg files) in UI using React Component?

前端 未结 7 752
[愿得一人]
[愿得一人] 2020-11-29 22:28

I have seen lot libraries for svg on react but none gave me how to import a .svg in the react component , I have seen code which talk about bring the svg code in to react ra

相关标签:
7条回答
  • 2020-11-29 22:58

    If your SVG includes sprites, here's a component you can use. We have three or four groups of sprites... obviously you can pull that bit out if you only have one sprite file.

    The Sprite component:

    import React from 'react'
    import PropTypes from 'prop-types';
    
    export default class Sprite extends React.Component {
      static propTypes = {
        label: PropTypes.string,
        group: PropTypes.string,
        sprite: PropTypes.string.isRequired
      }
    
      filepath(spriteGroup)
      {
        if(spriteGroup == undefined) {  spriteGroup = 'base' }
        return "/asset_path/sprite_" + spriteGroup + ".svg";
      }
    
      render()
      {
        return(
          <svg aria-hidden="true" title={this.props.label}>
            <use xlinkHref={`${this.filepath(this.props.group)}#${this.props.sprite}`}></use>
          </svg>
        )
      }
    }
    

    And elsewhere in React you would:

    import Sprite from './Sprite';
    
    render()
    {
       ...
       <Sprite label="No Current Value" group='base' sprite='clock' />
    }
    

    Example from our 'base' sprite file, sprite_base.svg:

    <svg xmlns="http://www.w3.org/2000/svg">
      <defs>
        <symbol id="clock" viewBox="0 0 512 512">
          <path fill="currentColor" d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm216 248c0 118.7-96.1 216-216 216-118.7 0-216-96.1-216-216 0-118.7 96.1-216 216-216 118.7 0 216 96.1 216 216zm-148.9 88.3l-81.2-59c-3.1-2.3-4.9-5.9-4.9-9.7V116c0-6.6 5.4-12 12-12h14c6.6 0 12 5.4 12 12v146.3l70.5 51.3c5.4 3.9 6.5 11.4 2.6 16.8l-8.2 11.3c-3.9 5.3-11.4 6.5-16.8 2.6z" class="">
          </path>
        </symbol>
        <symbol id="arrow-up" viewBox="0 0 16 16">
          <polygon points="1.3,6.7 2.7,8.1 7,3.8 7,16 9,16 9,3.8 13.3,8.1 14.7,6.7 8,0 "> </polygon>
        </symbol>
        <symbol id="arrow-down" viewBox="0 0 16 16">
          <polygon points="14.7,9.3 13.3,7.9 9,12.2 9,0 7,0 7,12.2 2.7,7.9 1.3,9.3 8,16 "> </polygon>
        </symbol>
        <symbol id="download" viewBox="0 0 48 48">
          <line data-cap="butt" fill="none" stroke-width="3" stroke-miterlimit="10" x1="24" y1="3" x2="24" y2="36" stroke-linejoin="miter" stroke-linecap="butt"></line>
          <polyline fill="none" stroke-width="3" stroke-linecap="square" stroke-miterlimit="10" points="11,23 24,36 37,23 " stroke-linejoin="miter"></polyline>
          <line data-color="color-2" fill="none" stroke-width="3" stroke-linecap="square" stroke-miterlimit="10" x1="2" y1="45" x2="46" y2="45" stroke-linejoin="miter"></line>
        </symbol>
      </devs>
    </svg>
    
    0 讨论(0)
提交回复
热议问题