react中使用svg

611 阅读1分钟

react中使用svg

项目采用react-create-app生成,使用craco添加配置。

安装svg插件:

npm install svg-sprite-loader svgo-loader --dev

修改craco.config.js配置


const path = require('path');
const resolve = dir => path.resolve(__dirname, dir)
​
module.exports = {
  webpack:{
    alias: {
      '@': resolve('src')
    },
    configure: (webpackConfig, { env, paths }) => {
      webpackConfig.module.rules[1].oneOf = [
          ...[
              {
                  test: /.svg$/,
                  // 存放svg的文件夹
                  include: resolve('./src/static/svg'),
                  use: [
                    { loader: 'svg-sprite-loader', options: {} },
                    { loader: 'svgo-loader', options: {symbolId: "icon-[name]"} },
                  ],
              },
          ],
          ...webpackConfig.module.rules[1].oneOf,
      ];
      return webpackConfig;
    },
  },
  devServer: {
    open: false,
  },
}

引入全局的svg图片,在svg文件夹下创建index.js文件,代码如下:

const req = require.context('./', false, /.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

封装svg组件SvgIcon.jsx

import React, { memo, useMemo } from 'react'
import PropTypes from 'prop-types'
// 导入创建的index.js文件
import '@/static/svg/index.js'const index = memo((props) => {
    // name: svg文件名
    // className: 自定义的类名
    // svgClick:  点击的回调函数
​
  return (
      <svg className={className || 'svg-icon'}
        onClick={ svgClick }>
      <use xlinkHref={'#'+ name}></use>
    </svg>
  )
})
​
index.propTypes = {
  name: PropTypes.string,
  className: PropTypes.string,
  svgClick: PropTypes.func
}
​
export default index

在其他组件中使用

import SvgIcon from '@/components/svgIcon/index.jsx'const index = memo(() => {
  const svgClick = ()  => {
    console.log('svgClick');
  }
  return (
    <div>
    <SvgIcon name="clear" className='form-icon' svgClick={e =>svgClick() } />
    </div>
  )
})
​
export default index
​