React 引入本svg,制作相应SvgIcon组件

React 引入本svg,制作相应SvgIcon组件

1.webpack.config.js引入对应loader

(1)下载loader:npm install svg-sprite-loader --save

(2)在webpack配置中配置以下信息(一定要在file-loader之前配置啊啊啊啊啊啊)

{
    test: /\.svg$/,
    loader: "svg-sprite-loader",
    //只处理指定svg的文件(所有使用的svg文件放到该文件夹下)
    // include: path.resolve(__dirname, "../src/icons"), 
    include: paths.iconsPath,
    options: {
    symbolId: "icon-[name]" 
    //symbolId和use使用的名称对应
    //<use xlinkHref={"#icon-" + iconClass} />
    }
},

2. icons文件夹

(1)文件目录

--icons
	--svg
		--404.svg
		--bug.svg
		....
	--index.js

(2)index.js

const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
console.log("require,svg,"+req)
requireAll(req)

3.SvgIcon组件

import React from "react";
import PropTypes from 'prop-types'
import './style.scss'

// 这一段照网上的意思是不需要加的,但是加了才显示出来,所以,各位
const req = require.context('../../../icons/svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
console.log("require,svg,"+req)
requireAll(req)

export default class SvgIcon2 extends React.Component{

  static propTypes = {
    iconClass: PropTypes.string.isRequired,
    className: PropTypes.string
  }

  static defaultProps = {
    className: ''
  }
  get isExternal() {
    if (!this.props.iconClass) return false
    return /^(https?:|mailto:|tel:)/.test(this.props.iconClass)
  }
  get iconName() {
    return `#icon-${this.props.iconClass}`
  }
  get svgClass() {
    if (this.props.className) {
      return 'svg-icon ' + this.props.className
    } else {
      return 'svg-icon'
    }
  }
  get styleExternalIcon() {
    return {
      mask: `url(${this.props.iconClass}) no-repeat 50% 50%`,
      WebkitMask: `url(${this.props.iconClass}) no-repeat 50% 50%`
    }
  }

  render() {
    return (
      <>
      {
        this.isExternal ?
          <div style={this.styleExternalIcon} className="svg-external-icon svg-icon" /> :
          <svg className={this.svgClass} aria-hidden="true">
            <use xlinkHref={this.iconName} />
          </svg>
      }
      </>
    )
  }
}

未完待续…偷个懒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值