React的使用图片:通过symbol引用svg的组件化的使用

1,182 阅读2分钟

React的使用图片:通过symbol引用svg的组件化的使用

Snipaste_2021-08-12_20-17-31.png

效果

Codepen:svg-in-react

可以通过名称快速选用图标。

原理

symbol 引用


这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 这种用法其实是做了一个svg的集合,与上面两种相比具有如下特点:

  • 支持多色图标了,不再受单色限制。
  • 通过一些技巧,支持像字体那样,通过font-size,color来调整样式。
  • 兼容性较差,支持 ie9+,及现代浏览器。
  • 浏览器渲染svg的性能一般,还不如png。

普通项目中,一般引入svg是通过webpack进行打包引入。

import iconXXX from 'xxx.svg';

但这样琐碎而且不好写类型,容易出错。

而通过网站iconfont-阿里巴巴矢量图标库,生成包含svg合集的js并将其挂载到body,然后就可以通过svg的use属性一一选取里面的图标了。普通使用可以参考说明iconfont-阿里巴巴矢量图标库帮助中心,这里针对react进行了组件化封装和类型补全。

实现

封装组件

IconBase.tsx

import React from "react";

export type IconName = "like"|"star"|"share";

/** 图标的symbol引用的基础组件 */
export const IconBase = ({
  name,
  ...p
}: {
  name: IconName;
} & JSX.IntrinsicElements["svg"]) => {
  return (
    <svg className="icon-box" aria-hidden="true" {...p}>
      <use xlinkHref={"#icon-" + name}></use>
    </svg>
  );
};

解释:

  • IconName:对应引入的所有图标的名称,规定类型
  • p:透传一些svg原本的属性设置

加入全局css

 .icon-box{
    width: 1em;
    height: 1em;
    /* vertical-align: -0.15em; */
    fill: currentColor;
    overflow: hidden;
    display: block;
  }

使用

<IconBase name="like"></IconBase>

解释:

  • name:选取需要的图标的类型

总结

通过引入svg合集和组件化封装,图标的引入也非常好用。如果本文对你有帮助,欢迎点赞让更多的人看到。

Reference

  1. iconfont-阿里巴巴矢量图标库
  2. iconfont-阿里巴巴矢量图标库帮助中心