React优雅的封装SvgIcon组件示例

目录
  • React如何优雅的封装SvgIcon组件
    • 第一步:安装svg-sprite-loader
    • 第二步:配置webpack
    • 第三步:创建icons/svg文件夹,并且加载所有svg文件
    • 第四步:创建 SvgIcon 组件
    • 第五步:在组件中使用 SvgIcon
    • 注意可能会遇到的bug
  • 总结

React如何优雅的封装SvgIcon组件

相信使用过vue的伙伴们,或多或少都接触或使用过vue-element-admin,其中许多封装都不禁让人拍案叫绝,因为本人之前是vue入门前端的,所以对vue-element-admin许多封装印象深刻,现在从vuereact之后,一直想把vue-element-admin里面的封装组件复刻到react当中使用,这次是SvgIcon组件的react封装版本;

第一步:安装svg-sprite-loader

  • npm 安装
npm i svg-sprite-loader -D
  • yarn 安装
yarn add svg-sprite-loader -D

第二步:配置webpack

      {
        test: /.svg$/,
        loader: "svg-sprite-loader",
        include: path.resolve(__dirname, "../src/icons"),
        options: {
          symbolId: "icon-[name]"
        }
      },
      {
        test: /.(eot|woff2?|ttf|svg)$/,
        exclude: path.resolve(__dirname, "../src/icons"), // 不处理 svg类型文件
        use: [
          {
            loader: "url-loader",
            options: {
              name: "[name]-[hash:5].min.[ext]",
              limit: 10000,
              outputPath: "font",
              publicPath: "font"
            }
          }
        ]
      },

第三步:创建icons/svg文件夹,并且加载所有svg文件

index.ts中方法

const requireAll = (requireContext: __WebpackModuleApi.RequireContext) =>
  requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /.svg$/)
requireAll(req)
export {} // 默认到处,ts如若不导出,会警告

第四步:创建 SvgIcon 组件

import React from 'react'
import PropTypes from 'prop-types'
import './index.scss'
const SvgIcon = (props: { iconClass: string; svgClass: string; fill: string ;click: MouseEventHandler<HTMLElement>}) => {
  const { iconClass, fill, svgClass,click } = props
  return (
    <i aria-hidden="true" onClick={click}>
      <svg className={`svg-class ${svgClass}`}>
        <use xlinkHref={'#icon-' + iconClass} fill={fill} />
      </svg>
    </i>
  )
}
SvgIcon.propTypes = {
  // svg名字
  iconClass: PropTypes.string.isRequired,
  // 自定义类名
  svgClass: PropTypes.string,
    //自定义方法
  click: PropTypes.func,
  // 填充颜色
  fill: PropTypes.string,
}
SvgIcon.defaultProps = {
  fill: 'currentColor',
  svgClass: '',
  click: () => {},
}
export default SvgIcon

第五步:在组件中使用 SvgIcon

import React from 'react'
import SvgIcon from '@/components/SvgIcon'
const Index = () => {
  return (
    <div>
      <SvgIcon iconClass="矿泉水" />
    </div>
  )
}
export default Index

最终效果:

注意可能会遇到的bug

如果按照以上步骤操作的话,图表还是不出来,有可能是webpack中的配置出来问题;

一般来说打印requireAll(req)出现以下一个数组才算成功,如果不是,你需要检查下你的webpack是否将svg进行其他操作,导致无法正常解析;

出现以下情况,可能你在你的webpack中配置了一些配置项将svg进行base64转码了,导致svg无法正常解析;

此时检查你的webpack:

总结

以上就是个人在react中模拟vue-element-admin封装SvgIcon组件,以后个人会带来更多的组件封装,更多关于React封装SvgIcon组件的资料请关注我们其它相关文章!

(0)

相关推荐

  • React日期时间显示组件的封装方法

    本文实例为大家分享了React日期时间显示组件的封装具体代码,供大家参考,具体内容如下 时间日期展示器 import ProtoType from 'prop-types'; import { useState, useEffect } from 'react'; import './index.css' /**时间选择器  * @luoronghao  * 参数说明  * timzone:时区(1-24)  * calendar:日期类型{solar(阳历),lunar(阴历)}  * dat

  • svgicon组件使用方法示例详解

    目录 场景 编写SvgIcon组件 组件文件结构 icons文件结构 vue.config.js配置 最终效果 场景 最近在研发产品的过程中,ued切了很多svg的图片:咱们在使用过程中除了背景图再就是使用<img :src="url"/>进行使用. 在你进行公共组件编写的时候,使用图片路径这种方式编写完组件发布之后:在再项目中引入已发布的组件,在你运行代码的时候图片路径会附带上当前运行的域名,导致图片显示不出来. 那么怎么解决这种问题呢? 和UED进行沟通让他们把这种sv

  • 浅析vue cli3 封装Svgicon组件正确姿势(推荐)

    vue cli3 手把手教学封装Svgicon组件 第一步:在src文件下新建一个放置svg文件的文件夹 第二步:在components文件下新建一个Svg组件 这是一个 文件夹 专门用来存放项目里面需要使用的svg文件,比如 a.svg b.svg - svg组件源码 <template> <svg :class="svgClass" aria-hidden="true"> <use :xlink:href="iconNam

  • 字节封装React组件手机号自动校验格式FormItem

    目录 Situation 背景 Target 目标 Action 行动 Result 结果 Review 复盘 Situation 背景 多人开发的老项目里面,很多地方都写了验证手机格式的需求,代码各有千秋.百花齐放 实现:有的写在公共组件库里,有的是单独开发局部组件支持,有的直接手写不复用,有的抽离正则到utils再引入 正则:正则校验也各有千秋,比如/^\d{11}/./1\d10/./1[2−9]\d9/./^1\d{10}/./^1[2-9]\d{9}/./1\d10/./1[2−9]\

  • 从零搭建react+ts组件库(封装antd)的详细过程

    目录 整体需求 开发与打包工具选型 使用webpack作为打包工具 使用babel来处理typescript代码 使用less-loader.css-loader等处理样式代码 项目搭建思路 整体结构 方案思路 项目搭建实施 初始化 Babel引入 了解Babel webpack的基于babel-loader的处理流程 引入React相关库(externals方式) 编写组件代码 编译打包组件库 效果演示 处理样式(less编译与css导出) 依赖引入 配置webpack 编写样式代码 编译组件

  • jsoneditor二次封装实时预览json编辑器组件react版

    目录 前言 设计思路 正文 jsoneditor的使用 结合react进行二次封装 前言 做为一名前端开发人员,掌握vue/react/angular等框架已经是必不可少的技能了,我们都知道,vue或react等MVVM框架提倡组件化开发,这样一方面可以提高组件复用性和可扩展性,另一方面也带来了项目开发的灵活性和可维护,方便多人开发协作.接下来文章将介绍如何使用react,开发一个自定义json编辑器组件.我们这里使用了jsoneditor这个第三方库,官方地址: jsoneditor 通过实现

  • React优雅的封装SvgIcon组件示例

    目录 React如何优雅的封装SvgIcon组件 第一步:安装svg-sprite-loader 第二步:配置webpack 第三步:创建icons/svg文件夹,并且加载所有svg文件 第四步:创建 SvgIcon 组件 第五步:在组件中使用 SvgIcon 注意可能会遇到的bug 总结 React如何优雅的封装SvgIcon组件 相信使用过vue的伙伴们,或多或少都接触或使用过vue-element-admin,其中许多封装都不禁让人拍案叫绝,因为本人之前是vue入门前端的,所以对vue-e

  • 如何在vue中更优雅的封装第三方组件详解

    目录 一.需求场景描述 二.关键技术点介绍 1.v-bind="$attrs" 2.v-on="$listeners" 三.封装el-image的代码示例 总结 一.需求场景描述 实际开发的时候,为了减少重复造轮子,提高工作效率,节省开发时间成本, 免不了会使用ui组件库,比如在web前端很受欢迎的element-ui. 但有的时候,我们需要在原组件的基础上做些改造,比如一个image组件, 我们需要统一在图片加载失败的时候展示的特定图,每次使用组件都加一遍, 麻烦

  • React手写一个手风琴组件示例

    目录 知识点 结构分析 AccordionItem子组件 Accordion容器组件 知识点 emotion语法 react语法 css语法 typescript类型语法 结构分析 根据上图,我们来分析一下,一个手风琴组件应该包含一个手风琴容器组件和多个手风琴子元素组件.因此,假设我们实现好了所有的逻辑,并写出使用demo,那么代码应该如下: <Accordion defaultIndex="1" onItemClick={console.log}> <Accordi

  • Vue封装svg-icon组件使用教程

    目录 一.SVG可缩放矢量图形 二.SVG在vue项目中的配置与使用 一.SVG可缩放矢量图形 SVG(Scalable Vector Graphics)可缩放矢量图形,是一种用于描述基于二维的矢量图形的 XML 标记语言,其基本矢量显示对象包括矩形.圆.椭圆.多边形.直线.任意曲线等,还能显示文字对象和嵌入式外部图像(包括 PNG.JPEG.SVG 等).实际项目中大多数图标都是使用的 SVG 图标文件,其主要有以下几个优点: 1.内容可读,文件是纯粹的 XML. 2.图像文件小,可伸缩性强.

  • 详解asp.net core封装layui组件示例分享

    用什么封装?这里只是用了TagHelper,是啥?自己瞅文档去 在学习使用TagHelper的时候,最希望的就是能有个Demo能够让自己作为参考 怎么去封装一个组件? 不同的情况怎么去实现? 有没有更好更高效的方法? 找啊找啊找,最后跑去看了看mvc中的TagHelpers,再好好瞅了瞅TagHelper的文档 勉强折腾了几个组件出来,本来想一个组件一个组件写文章的,但是发现国庆已经结束了~ Demo下载 效果预览 代码仅供参考,有不同的意见也忘不吝赐教 Checkbox复选框组件封装 标签名称

  • 使用React实现轮播效果组件示例代码

    前言 我发现React和AngularJS思想完全不同,AngularJS是基于双向绑定,在Modal层中定制数据,然后双向改变.但是React是通过prop和state来改变view层的状态.下面是我写的一个轮播图组件,可以直接看一下.代码很简单.原理就是通过React在componentDidMount后改变setState,来动态改变css样式. 说明以下:看gif很卡,但是实际效果还是很好的. 以下是示例代码 LunBo.js require('styles/App.css'); req

  • Vue3 Composition API优雅封装第三方组件实例

    目录 前言 一.对于第三方组件的属性props.事件events 二.对于第三方组件的插槽slots 三.对于第三方组件的方法methods 前言 对于第三方组件,如何在保持第三方组件原有功能(属性props.事件events.插槽slots.方法methods)的基础上,优雅地进行功能的扩展了? 以Element Plus的el-input为例: 很有可能你以前是这样玩的,封装一个MyInput组件,把要使用的属性props.事件events和插槽slots.方法methods根据自己的需要再

  • React封装CustomSelect组件思路详解

    目录 思路和前提 编码与实现 处理createContext与useContext 对content的封装和拆分: DispatchRender, Controls 先说Controls, 包含控制行: 重置, 确定 DispatchRender 用于根据type分发对应的render子组件,这是一种编程思想,在次可以保证父子很大程度的解耦,再往下子组件不再考虑type是什么,父组件不需要考虑子组件有什么. 单选框的render子组件的具体实现 由来: 需要封装一个通过Popover弹出框里可以

随机推荐