React优雅的封装SvgIcon组件示例

让我详细讲解一下“React优雅的封装SvgIcon组件示例”的完整攻略。

什么是SvgIcon组件

SVG 是一种基于 XML 语言的矢量图形。在 web 中,SVG 图形可以通过一组 SVG 标记和属性来定义。SvgIcon 组件是一种常见的 React 组件,它可以用于在网站中使用 SVG 图标。

通常情况下,我们需要在网站中使用很多的 SVG 图标。如果每次需要展示 SVG 图标时都要手动输入对应的代码,这将是一件很麻烦的事情。因此,我们需要对 SVG 图标进行封装,以简化使用流程,提高代码复用性。

封装SvgIcon组件

编写基础组件

首先,我们需要编写一个基础的 SvgIcon 组件,这个组件应该至少包含以下代码:

import React from 'react';
import PropTypes from 'prop-types';

function SvgIcon(props) {
  const { icon, className, width, height, fill, ...rest } = props;
  return (
    <svg
      className={className}
      width={width}
      height={height}
      viewBox={`0 0 ${icon.width} ${icon.height}`}
      {...rest}
    >
      <path fill={fill} d={icon.path} />
    </svg>
  );
}

SvgIcon.propTypes = {
  icon: PropTypes.object.isRequired,
  className: PropTypes.string,
  width: PropTypes.number,
  height: PropTypes.number,
  fill: PropTypes.string,
};

export default SvgIcon;

这里的 SvgIcon 组件有一个 icon 属性,这个属性代表需要展示的 SVG 图标。它使用了 PropTypes 验证传入的参数类型,并使用了解构赋值来简化代码。

编写示例组件

接下来,我们需要编写一个封装了具体 svg 图标的组件,例如:

import React from 'react';
import SvgIcon from './SvgIcon';

const TwitterIcon = (props) => {
  const { size, className, style } = props;

  return (
    <SvgIcon
      icon={{
        width: 24,
        height: 24,
        path:
          'M21.98 7.998c-.755.335-1.56.56-2.398.663a4.27 4.27 0 0 0 1.854-2.355 8.483 8.483 0 0 1-2.695 1.03 4.241 4.241 0 0 0-7.23 3.86 12.064 12.064 0 0 1-8.766-4.452A4.25 4.25 0 0 0 4.27 10.98a4.235 4.235 0 0 1-1.924-.53v.054a4.247 4.247 0 0 0 3.409 4.156 4.273 4.273 0 0 1-1.918.07c.56 1.742 2.17 3.008 4.094 3.042a8.506 8.506 0 0 1-5.24 1.803 8.457 8.457 0 0 1-1.036-.064 12.027 12.027 0 0 0 6.53 1.92c7.817 0 12.105-6.672 11.798-12.675.81-.57 1.536-1.28 2.107-2.086z',
      }}
      className={className}
      style={{
        width: size,
        height: size,
        ...style,
      }}
    />
  );
};

TwitterIcon.defaultProps = {
  size: '24px',
  className: '',
  style: {},
};

export default TwitterIcon;

这里的 TwitterIcon 组件就是一个封装了具体 SVG 图标的组件,它通过引入和使用我们之前编写的 SvgIcon 组件来实现 SVG 图标的展示。

在网站中使用

使用封装好的组件非常简单,你只需要在需要使用 SVG 图标的地方引入对应的封装好的组件,就可以轻松地展示 SVG 图标了。例如:

import TwitterIcon from './icons/TwitterIcon';

function App() {
  return (
    <div>
      <TwitterIcon />
    </div>
  );
}

export default App;

上面的代码引入了我们之前编写的 TwitterIcon 组件,并在网站中展示了该组件对应的 SVG 图标。使用其他封装好的图标也同样简单,只需要引入对应的组件并在需要展示 SVG 图标的地方使用即可。

示例说明

示例一

在这个示例中,我们封装了一个 ShowIcon 组件,用于展示一个眼睛的 SVG 图标。这个图标有两个状态,一个是打开状态,一个是关闭状态。

我们可以通过这个组件非常方便地展示这个 SVG 图标,并且可以通过改变状态来切换 SVG 图标的展示。

import React, { useState } from 'react';
import SvgIcon from './SvgIcon';

const ShowIcon = (props) => {
  const [isHidden, setIsHidden] = useState(true);
  const { size, className, style } = props;

  const handleShowClick = () => {
    setIsHidden(!isHidden);
  };

  const icon = isHidden
    ? {
        width: 24,
        height: 24,
        path:
          'M19.38 4.627a1.262 1.262 0 0 0-1.793 0L12 10.207 6.413 4.627A1.263 1.263 0 0 0 4.62 6.42l5.58 5.581L4.62 17.585a1.262 1.262 0 0 0 1.792 1.792l5.58-5.581 5.58 5.581a1.262 1.262 0 0 0 1.792-1.792l-5.58-5.581 5.58-5.58a1.262 1.262 0 0 0 0-1.793z',
      }
    : {
        width: 24,
        height: 24,
        path:
          'M12 5.25c-4.098 0-7.714 2.12-9.808 5.324a1.502 1.502 0 0 0 0 1.67c2.094 3.205 5.71 5.325 9.808 5.325 4.099 0 7.814-2.12 9.908-5.324a1.502 1.502 0 0 0 0-1.67C19.814 7.37 16.198 5.25 12 5.25zm0 8.612a2.438 2.438 0 1 1 0-4.876 2.438 2.438 0 0 1 0 4.876z',
      };

  return (
    <SvgIcon
      icon={icon}
      className={className}
      style={{
        width: size,
        height: size,
        ...style,
      }}
      onClick={handleShowClick}
    />
  );
};

ShowIcon.defaultProps = {
  size: '24px',
  className: '',
  style: {},
};

export default ShowIcon;

示例二

在这个示例中,我们封装了一个 ReloadIcon 组件,用于展示一个刷新的 SVG 图标。这个图标可以带上动画效果,使得整个 SVG 图标在页面中呈现出较为动态的效果。

import React from 'react';
import SvgIcon from './SvgIcon';

const ReloadIcon = (props) => {
  const { size, className, style, isAni } = props;

  return (
    <SvgIcon
      icon={{
        width: 24,
        height: 24,
        path:
          'M17.78 3.355c-3.27-2.265-7.555-2.548-11.017-.8-3.46 1.745-6.164 4.95-7.237 8.694-.95 3.316-.576 6.902.937 9.855l.476.824h-2.71c-.64 0-1.16.52-1.16 1.16v3.04c0 .68.6 1.16 1.16.98l14.49-2.2c.56-.08 1.04-.6 1.04-1.24v-1.7c0-.68-.6-1.16-1.16-.98l-2.31.35c-1.428-3.274-4.12-6.016-7.503-7.646 3.09-1.168 6.47-.804 9.13 1.04 2.66 1.845 4.297 4.95 4.297 8.22v2.268c0 .68.52 1.16 1.16 1.04l3.66-.555c.68 0 1.16-.6.98-1.24L18.98 3.833c-.16-.64-.92-1.3-1.2-.478z',
      }}
      className={className}
      style={{
        width: size,
        height: size,
        animation: isAni ? 'spin 2s linear infinite' : '',
        ...style,
      }}
    />
  );
};

ReloadIcon.defaultProps = {
  size: '24px',
  className: '',
  style: {},
  isAni: false,
};

export default ReloadIcon;

这里的 ReloadIcon 组件还包含了一个动画效果 —— 每当用户点击 SVG 图标时,图标会旋转一圈。这里我们借助了 CSS 中的 animation 属性来实现这个动画效果。

我们也可以根据具体的实际需求来控制动画是否启动,实现 SVG 图标在不同场景下的动态展示效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:React优雅的封装SvgIcon组件示例 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • android递归压缩上传多张图片到七牛的实例代码

    针对这个话题,我们来一步步详细讲解下面的内容: 什么是递归压缩上传? 递归压缩上传就是将需要上传的多张图片按照递归的方式一张张压缩并上传到云存储服务中。这种方式可以避免手机内存不足的问题,并且可以节省上传时间和流量。 如何使用七牛云存储服务? 首先,要使用七牛云存储服务,我们需要注册账号,创建一个存储空间,并且在Android项目中导入七牛SDK。 depe…

    other 2023年6月27日
    00
  • offsetparent的解释

    offsetParent的解释 在HTML文档中,offsetParent是一个DOM属性,它指向最近的已定位的祖先元素(position不为static)。我们可以使用offsetParent来计算元素的相对位置。 offsetParent的特征 offsetParent的默认值是html元素本身 如果元素的父元素中没有定义position属性或者定义的p…

    其他 2023年3月29日
    00
  • zip伪加密(deprecated)

    zip伪加密(deprecated) 在过去,一些人使用Zip伪加密来保护其机密数据。然而,这种方法已经被证明是不安全的,因为它只是简单地让Zip文件看起来加密,并没有真正的对文件进行加密。 什么是Zip伪加密? Zip伪加密是一种不安全的对Zip文件进行加密的方法。使用此方法,您可以打开一个看起来是加密的Zip文件,但实际上Zip文件中存储的所有文件可以很…

    其他 2023年3月28日
    00
  • python语法学习之super(),继承与派生

    Python语法学习之super(),继承与派生 1. 继承与派生 在面向对象编程中,类可以通过继承来获得其他类的属性和方法。一个类继承自另一个类,叫做子类(派生类),被继承的类叫做父类(基类)。子类可以从父类继承属性和方法,同时还可以自定义自己的属性和方法。 在Python中,使用class语句定义一个类,其中class后面紧跟着类名。如果想让一个类继承另…

    other 2023年6月26日
    00
  • 封装好的一个万能检测表单的方法

    下面是封装一个万能检测表单的方法的完整攻略: 步骤一:确定需求和功能 首先,我们需要明确我们需要封装的函数应该具备哪些需求和功能。一般来说,我们会希望这个函数可以完成以下功能: 检测表单中各个输入框是否为空或符合要求; 根据表单类型和特定需求,对表单进行不同的验证,例如:是否为手机号码、是否为合法email地址、是否为数字等等; 在表单填写不符合要求时,会有…

    other 2023年6月25日
    00
  • 全面讲解CocosCreator热更新

    下面我将详细讲解“全面讲解CocosCreator热更新”的完整攻略。 概述 热更新(Hot Update)是一种在游戏运行时更新游戏内容的方式。在游戏开发过程中,经常会有需要更新内容的情况,例如修复bug或是增加新内容。热更新可以使得更新内容不需要再次发版,玩家可以在不需要重新下载和安装游戏的前提下更新游戏。在本篇攻略中,我们将讲解如何使用CocosCre…

    other 2023年6月27日
    00
  • shell编程编辑工具awk

    Shell编程编辑工具awk 什么是awk awk是一种编程语言,用于处理文本文件的数据。它是一种强大的文本分析和处理工具,可在Linux和其他操作系统上使用。awk的名称是由三位创始人的名字组成的:Aho、Weinberger和Kernighan。 awk被设计为适合用于处理、转换和分析数据。使用它的主要目的是从数据文件中提取有用信息。它的语法简单,易于学…

    其他 2023年3月29日
    00
  • vue2实现封装动态表单组件

    下面详细讲解如何使用vue2实现封装动态表单组件的攻略。 一、动态表单组件的概念 动态表单组件,是指一个通用性非常高的表单,它能够自动侦测数据类型,根据数据类型来展示不同的表单元素,并保存用户输入的数据。通俗地说,就是可以动态地生成表单控件,简化表单的开发。 二、封装动态表单组件的方法 使用Vue.js,我们可以非常简答地封装一个动态表单组件,分为以下几个步…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部