视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
在react中使用svg的各种方法总结(附代码)
2020-11-27 15:04:47 责编:小采
文档
 这篇文章给大家介绍的内容是关于在react中使用svg的各种方法总结(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

优势

  • SVG可被非常多的工具读取和修改(比如vscode)

  • 不失真, 放大缩小图像都很清晰

  • SVG文件是纯粹的XML, 也是一种DOM结构

  • 使用方便, 设计软件可以直接导出

  • 兼容性

    上一张兼容性图表, 或到caniuse.com查看

    兼容性也不是什么大问题. 当然, 如果你的网站还是需要兼容这些旧式的浏览器, 社区上也有对应的方案, 比如张鑫旭的一些SVG向下兼容优雅降级技术

    使用方式

    方案多种多样, 适合你的需求的才是最优的

    直接在模板中使用

    const Home = () => (
     <div>
     <svg width={300} height={300}>
     <rect width="100%" height="100%" style={{ fill: 'purple', strokeWidth: 1, stroke: 'rgb(0,0,0)' }} />
     </svg>
     </div>
    )
    1. 如果每个svg要前端画, 对前端要求较高.

    2. 如果每个图标从设计师给的svg代码里面拷, 要改各种标签不说, 改错了还报错

    这样的方式并不友好

    把svg转成字体

    iconfont

    直接把代码复制到项目css中, 定制你的标签样式, 参考阿里官方的文章, 使用起来简单粗暴, 而且浏览器兼容性高. 但是需要手动上传(有其他方案欢迎补充), 另外如果要部署到阿里的cdn以外的环境需要先下载下来, 再上传到目标环境. 略显麻烦.

    此外还有icomoon等等都有提供类似的解决方案

    把svg转成react component

    请注意: 以下会包含typescript相关的配置

    项目构建前转换

    例:

    typescript-react-svg-icon-generator, 需要我们有一条前置命令去把svg做转换.

    // svg-generator.js
    
    const generator = require('typescript-react-svg-icon-generator')
    
    const config = {
     svgDir: './svg/',
     destination: './Icon/index.tsx'
    }
    generator(config)
    $ node ./svg-generator.js

    使用:

    import Icon from './Icon'
    export default class App extends Component {
     render() {
     return <Icon kind='close' color='#748' width={500} height={100} />
     }
    }

    此外, svgr(下面提到的)同样提供这种方案, 请自行查阅

    项目构建时转换

    例:

    @svgr/webpack

    嗯. 没错, 这是一个webpack loader.

    // webpack rules config
    {
     test: /\.svg$/,
     loader: '@svgr/webpack'
    }
    // 全局声明svg component定义
    declare interface SvgrComponent extends React.StatelessComponent<React.SVGAttributes<SVGElement>> {}
    
    declare module '*.svg' {
     const content: SvgrComponent
     export default content
    }
    import IconReact from '@assets/svg/react.svg'
    
    const Home = () => (
     <p>
     <IconReact width={180} height={180} color="purple" />
     </p>
    )

    这个方案好处不仅体现在构建时转换, 更重要的是它完全继承了SVGAttributes, 不需要额外的学习成本! 可参考项目ts-react-webpack4, 或脚手架steamer-react-ts

    此外, 还有react-svg, svg-react-loader等同样是以类似的方式实现的.

    相关文章推荐:

    svg path路径的作用:svg path在网页开发中的使用方法

    Storage Event如何实现页面间通信

    下载本文
    显示全文
    专题