SVG スプライトと ReactJS を駆使したアイコン描画の達人ガイド

2024-05-22

SVG use タグと ReactJS を用いたスプライトの描画

概要

ReactJS で SVG スプライトを使用するには、svg タグと use 属性を用います。

手順

  1. SVG スプライトを作成する

    • すべてのアイコンを単一の SVG ファイルにまとめます。
    • 各アイコンに固有の id 属性を設定します。
  2. React コンポーネントを作成する

    • svg タグを使用して SVG スプライトを読み込みます。
    • use 属性を使用して、描画するアイコンを指定します。
    • xlinkHref 属性を使用して、SVG スプライトのパスを指定します。

import React from 'react';

const Icon = ({ iconId }) => (
  <svg>
    <use xlinkHref="/path/to/sprite.svg#${iconId}" />
  </svg>
);

const App = () => (
  <div>
    <Icon iconId="home" />
    <Icon iconId="user" />
  </div>
);

この例では、Icon コンポーネントは iconId props を受け取り、対応するアイコンを描画します。App コンポーネントは Icon コンポーネントを 2 回使用し、異なるアイコンを描画します。

利点

  • アイコンの管理が容易になる
  • 描画のパフォーマンスが向上する
  • コードの簡潔化
  • SVG スプライトは、アイコン以外にも、ロゴやその他のグラフィックに使用することができます。
  • ReactJS には、SVG スプライトを扱うためのライブラリがいくつか用意されています。



    SVG スプライトと ReactJS を用いたアイコン描画のサンプルコード

    <?xml version="1.0" encoding="UTF-8"?>
    <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
      <symbol id="home" viewBox="0 0 24 24">
        <path d="M12 7c-2.76 0-5 2.24-5 5v7h2v-7c0-2.76 2.24-5 5-5zM19 4v10h-10v-10z" />
      </symbol>
      <symbol id="user" viewBox="0 0 24 24">
        <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4c-2.21 0-4 1.79-4 4s1.79 4 4 4zM12 8c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2z" />
      </symbol>
    </svg>
    

    上記のコードは、home アイコンと user アイコンを含む SVG スプライトを作成します。各アイコンは symbol タグで定義され、固有の id 属性が設定されています。

    import React from 'react';
    
    const Icon = ({ iconId }) => (
      <svg>
        <use xlinkHref="/path/to/sprite.svg#${iconId}" />
      </svg>
    );
    
    const App = () => (
      <div>
        <Icon iconId="home" />
        <Icon iconId="user" />
      </div>
    );
    

    上記のコードは、Icon コンポーネントと App コンポーネントを定義します。

    • App コンポーネントは Icon コンポーネントを 2 回使用し、異なるアイコンを描画します。

    実行

    上記のコードを実行すると、以下の結果が表示されます。

    <svg>
      <use xlinkHref="/path/to/sprite.svg#home" />
    </svg>
    <svg>
      <use xlinkHref="/path/to/sprite.svg#user" />
    </svg>
    

    上記のように、Icon コンポーネントを使用して、SVG スプライトからアイコンを簡単に描画することができます。

    補足

    • 上記のコードはあくまで一例であり、必要に応じて変更することができます。



    SVG スプライトと ReactJS を用いたアイコン描画のその他の方法

    インライン SVG

    import React from 'react';
    
    const Icon = ({ iconId }) => {
      const iconMap = {
        home: (
          <svg width="24" height="24" viewBox="0 0 24 24">
            <path d="M12 7c-2.76 0-5 2.24-5 5v7h2v-7c0-2.76 2.24-5 5-5zM19 4v10h-10v-10z" />
          </svg>
        ),
        user: (
          <svg width="24" height="24" viewBox="0 0 24 24">
            <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4c-2.21 0-4 1.79-4 4s1.79 4 4 4zM12 8c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2z" />
          </svg>
        ),
      };
    
      return iconMap[iconId];
    };
    
    const App = () => (
      <div>
        <Icon iconId="home" />
        <Icon iconId="user" />
      </div>
    );
    

    上記のコードは、iconMap オブジェクトを使用して、各アイコンの SVG コードを定義します。Icon コンポーネントは iconId props を受け取り、対応する SVG コードを返します。

    require 関数

    import React from 'react';
    import homeIcon from './home.svg';
    import userIcon from './user.svg';
    
    const Icon = ({ iconId }) => {
      const icons = {
        home: homeIcon,
        user: userIcon,
      };
    
      const IconComponent = icons[iconId];
      return <IconComponent />;
    };
    
    const App = () => (
      <div>
        <Icon iconId="home" />
        <Icon iconId="user" />
      </div>
    );
    

    動的な SVG

    import React, { useState } from 'react';
    
    const Icon = ({ iconId }) => {
      const [icon, setIcon] = useState(null);
    
      useEffect(() => {
        fetch(`/path/to/icon/${iconId}.svg`)
          .then((response) => response.text())
          .then((svg) => setIcon(svg));
      }, [iconId]);
    
      if (!icon) {
        return null;
      }
    
      return (
        <svg dangerouslySetInnerHTML={{ __html: icon }} />
      );
    };
    
    const App = () => (
      <div>
        <Icon iconId="home" />
        <Icon iconId="user" />
      </div>
    );
    

    上記のコードは、useState フックと useEffect フックを使用して、アイコンを動的に読み込みます。Icon コンポーネントは iconId props を受け取り、対応するアイコンを /path/to/icon/${iconId}.svg から読み込みます。

    これらのライブラリは、SVG スプライトの読み込みや描画をより簡単にします。

    上記のように、SVG スプライトと ReactJS


    svg sprite reactjs


    Reactの仮想DOMでパフォーマンスを劇的に向上させる!仕組みとメリットを完全網羅

    従来のDOM操作と汚れたモデルチェック従来のWeb開発では、DOMを直接操作することでユーザーインターフェースを構築していました。しかし、DOM操作はコストが高く、パフォーマンスの低下を招きます。そこで、汚れたモデルチェックという手法が登場しました。これは、DOMの状態をモデルとして保持し、変更があった箇所のみを更新することで、パフォーマンスを向上させるものです。...


    React.js で Intersection Observer API を使って DOM 読み込みを検知

    DOM が読み込まれたことを検知するには、いくつかの方法があります。componentDidMount ライフサイクルメソッドは、コンポーネントが DOM にマウントされた後に呼び出されます。このメソッド内で、DOM 操作やデータフェッチなどの処理を行うことができます。...


    TextField にフォーカスを設定:React Material-UI のヒントとコツ

    autoFocus プロパティを使用する最も簡単な方法は、autoFocus プロパティを TextField コンポーネントに設定することです。これにより、コンポーネントがレンダリングされたときに自動的にフォーカスが設定されます。useRef フックと focus() メソッドを使用する...


    Reactでドキュメントタイトルを設定する3つの方法:useEffect Hook、React Helmet、その他

    document. title を直接操作するこれは最も簡単な方法ですが、コンポーネント間の状態管理が煩雑になる可能性があります。useTitle Hookは、タイトルの設定と状態管理を簡潔に記述できます。React Helmetは、ドキュメントタイトルだけでなく、metaタグやlinkタグなどの様々な要素を管理できるライブラリです。...


    SQL SQL SQL SQL Amazon で見る



    ReactJS で SVG を埋め込む: 初心者向けガイド

    このコードは、my-svg. svg ファイルの内容を MyComponent コンポーネント内にレンダリングします。SVG コードを直接コンポーネント内に記述することもできます。このコードは、円を描画する SVG コードを直接 MyComponent コンポーネント内に記述します。