React优雅的封装SvgIcon组件示例

yizhihongxing

让我详细讲解一下“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日

相关文章

  • VB实现屏蔽文本框右键菜单的复制、粘贴等功能的方法

    首先,需要明确一点,禁用文本框右键菜单的复制、粘贴等功能,其实也就是禁用系统默认的快捷键,因此我们需要通过VB代码来修改系统默认快捷键,具体步骤如下: 步骤一:新建窗体并设置属性 首先,需要新建一个窗体,并在窗体中添加一个文本框控件,随后需要设置文本框控件的以下属性: Name:txtInput MultiLine:True EnableContextMen…

    other 2023年6月27日
    00
  • python将xml转换成json数据

    将XML转换为JSON是一种常见的数据转换方式,可以帮助您在不同的应用程序之间共享数据。Python提供了许多库来处理XML和JSON数据。以下是如何将XML转换为JSON的完整攻略,含两个示例说明。 步骤一:安装所需的库 在Python中将XML转换为JSON,您需要安装xmltodict库。您可以使用以下命令在终端中安装它: pip install xm…

    other 2023年5月9日
    00
  • JVM要双亲委派的原因及如何打破它

    JVM双亲委派模型是JVM运行时机制的重要部分。其基本思路是:在JVM中,每个类加载器都有一个父类加载器,在类加载时,会优先向父类加载器发起加载请求。直到父类加载器无法加载,才会由子类加载器进行加载。 为什么需要JVM双亲委派模型? 一方面,通过双亲委派模型可以避免类的重复加载,提高程序运行效率。另一方面,该模型可以保证类的安全性,防止恶意代码的注入。 如何…

    other 2023年6月27日
    00
  • 解析瀑布流布局:JS+绝对定位的实现

    解析瀑布流布局: JS+绝对定位的实现 瀑布流布局是一种常见的网页布局方式,它的特点是将内容按照一定的规则排列在不同的列中,形成类似瀑布流般的效果。本攻略将详细介绍如何使用JavaScript和绝对定位来实现瀑布流布局。 步骤一:HTML结构 首先,我们需要创建一个基本的HTML结构,用于容纳瀑布流布局的内容。以下是一个简单的示例: <div id=\…

    other 2023年9月5日
    00
  • C++11中std::move、std::forward、左右值引用、移动构造函数的测试问题

    C++11中move、forward、左右值引用、移动构造函数的测试问题 在 C++11 以前,当对象传递给函数时会发生对象的拷贝和移动,对于大对象的操作会对性能造成很大的影响。在 C++11 中,引入了右值引用和 move 语义,使得对象的复制和移动均可以通过引用来进行操作,避免了额外的拷贝操作,提高了程序的性能。而 std::forward 语义则是为了…

    other 2023年6月26日
    00
  • Linux中对lvm逻辑卷分区大小的调整教程(针对xfs与ext4不同文件系统)

    Linux中对LVM逻辑卷分区大小的调整教程 在Linux中,LVM(Logical Volume Manager)提供了一种方便和灵活的方式来管理磁盘设备。当我们需要扩展或收缩某个逻辑分区的空间时,LVM提供了强大的功能来实现这一点。 本文将介绍如何在Linux中使用LVM来调整逻辑卷分区的大小,包括对xfs和ext4不同文件系统的处理。 1. 查看逻辑卷…

    other 2023年6月27日
    00
  • Notepad++ 6.7.8.2更新内容 Notepad++ 6.7.8.2下载地址

    Notepad++ 6.7.8.2更新内容 Notepad++是一款开源的文本编辑器,提供了丰富的功能和插件支持。版本6.7.8.2是Notepad++的一个更新版本,下面是该版本的更新内容和下载地址。 更新内容 修复了一些已知的bug和问题,提高了软件的稳定性和性能。 更新了一些插件,增加了新的功能和特性。 改进了用户界面,提供更好的用户体验。 下载地址 …

    other 2023年8月5日
    00
  • Python封装解构以及丢弃变量

    Python封装解构以及丢弃变量 在 Python 中,我们可以使用封装和解构的方式对数据进行操作,同时也可以使用丢弃变量的方式来忽略数据中不需要的部分。 封装 封装可以将多个值打包成一个整体,常用的打包方式包括元组和列表。例如,我们可以将多个数值封装在元组中: >>> nums = (1, 2, 3) >>> print…

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