React HooksとCSSモジュールを使ってボタン要素のスタイルをトグル

2024-05-11

React でクリック時にクラスを切り替える方法

React で要素をクリックしたときに、その要素の CSS クラスを切り替えることはよくあるシナリオです。これは、ボタンの状態を表したり、要素の外観を動的に変更したりするために役立ちます。

以下、2つの主要な方法と、それぞれの利点と欠点について詳しく説明します。

方法 1: state と setState を使用する

この方法は、要素の状態を管理するために React の statesetState フックを使用します。状態は、コンポーネント内のデータを表すオブジェクトであり、setState を使用して更新できます。

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isActive: false
    };
  }

  handleClick = () => {
    this.setState(prevState => ({
      isActive: !prevState.isActive
    }));
  };

  render() {
    const { isActive } = this.state;
    const className = isActive ? "active" : "";
    return (
      <button onClick={this.handleClick} className={className}>
        ボタン
      </button>
    );
  }
}

利点:

  • 状態を使用して要素の状態を明確に管理できます。
  • 他の状態更新と簡単に組み合わせることができます。
  • コンポーネントのレンダリングを再トリガーする必要があるため、パフォーマンスに影響を与える可能性があります。
  • 初心者にとっては理解しにくい場合があります。

方法 2: useRef と classList を使用する

この方法は、React の useRef フックと DOM 要素の classList プロパティを使用して、要素のクラスを直接操作します。

const MyComponent = () => {
  const buttonRef = useRef(null);

  const handleClick = () => {
    buttonRef.current.classList.toggle("active");
  };

  return (
    <button ref={buttonRef} onClick={handleClick}>
      ボタン
    </button>
  );
};
  • パフォーマンスが優れています。
  • 状態を使用しないため、理解しやすい場合があります。
  • 状態を管理できないため、複雑なロジックには適していない場合があります。
  • useRef フックと classList API に慣れている必要がある

パフォーマンスが重要で、状態を管理する必要がない場合は、方法 2 が適しています。一方、状態を使用して要素の状態を明確に管理する必要がある場合は、方法 1 が適しています。

その他の考慮事項

  • アクセシビリティ: キーボードやスクリーンリーダーなどの補助技術を使用したユーザーでも要素にアクセスできるように、適切な ARIA 属性を使用する必要があります。 *パフォーマンスの最適化: 大規模なリストをレンダリングする場合は、shouldComponentUpdate メソッドを使用して不要なレンダリングを回避することを検討してください。



React でクリック時にクラスを切り替える:サンプルコード

以下の例は、前述の説明で紹介した 2 つの方法を実装した React コンポーネントを示しています。

方法 1: state と setState を使用する

class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isActive: false
    };
  }

  handleClick = () => {
    this.setState(prevState => ({
      isActive: !prevState.isActive
    }));
  };

  render() {
    const { isActive } = this.state;
    const className = isActive ? "active" : "";
    return (
      <button onClick={this.handleClick} className={className}>
        ボタン (State)
      </button>
    );
  }
}

方法 2: useRef と classList を使用する

const MyComponent = () => {
  const buttonRef = useRef(null);

  const handleClick = () => {
    buttonRef.current.classList.toggle("active");
  };

  return (
    <button ref={buttonRef} onClick={handleClick}>
      ボタン (useRef)
    </button>
  );
};

説明:

  • 上記のコードは、MyComponent という名前の React コンポーネントを定義します。
  • このコンポーネントは、button 要素をレンダリングします。
  • statesetState を使用する方法は、isActive という名前の状態変数を使用して、ボタンの状態を追跡します。
  • useRefclassList を使用する方法は、ref 属性を使用して DOM 要素への参照を取得し、classList.toggle() メソッドを使用してクラスを切り替えます。
  • どちらの方法も、ボタンがクリックされたときに active クラスをトグルします。

このサンプルコードを参考に、独自の要件に合わせて調整できます。




React でクリック時にクラスを切り替える:その他の方法

前述の 2 つの主要な方法に加えて、React でクリック時にクラスを切り替えるには、いくつか補足的な方法があります。

CSS モジュールを使用すると、コンポーネント固有の CSS クラスを定義し、スコープを分離することができます。これにより、名前の衝突を回避し、コードをより整理しやすくなります。

import styles from './MyComponent.module.css';

const MyComponent = () => {
  const [isActive, setIsActive] = useState(false);

  const handleClick = () => {
    setIsActive(!isActive);
  };

  return (
    <button onClick={handleClick} className={isActive ? styles.active : styles.button}>
      ボタン
    </button>
  );
};

カスタムフックを使用して、useStateuseRef などの React フックを再利用可能なロジックにカプセル化することができます。これにより、コードをより簡潔でテストしやすくなります。

const useToggle = (initialState) => {
  const [state, setState] = useState(initialState);

  const toggle = () => {
    setState(!state);
  };

  return { state, toggle };
};

const MyComponent = () => {
  const { state, toggle } = useToggle(false);

  return (
    <button onClick={toggle} className={state ? 'active' : 'button'}>
      ボタン
    </button>
  );
};

サードパーティライブラリを使用する

classnamesreact-toggle などのサードパーティライブラリを使用して、クラスの操作を簡略化することができます。これらのライブラリは、追加機能やユーティリティを提供することがあります。

import classNames from 'classnames';

const MyComponent = () => {
  const [isActive, setIsActive] = useState(false);

  const handleClick = () => {
    setIsActive(!isActive);
  };

  return (
    <button onClick={handleClick} className={classNames('button', { active: isActive })}>
      ボタン
    </button>
  );
};

考慮事項:

  • 上記の方法は、それぞれ長所と短所があります。
  • 使用する方法は、プロジェクトの要件と個人的な好みによって異なります。
  • パフォーマンスとアクセシビリティを考慮することが重要です。

React でクリック時にクラスを切り替えるには、さまざまな方法があります。それぞれの方法の長所と短所を理解し、プロジェクトの要件に合った方法を選択することが重要です。


javascript reactjs


JavaScriptで文字列内の特定の文字が出現する回数をカウントする方法:詳細解説とサンプルコード

JavaScriptで文字列内の特定の文字が出現する回数をカウントすることは、プログラミングにおいて頻繁に必要とされる処理です。ウェブサイトの文字列分析、テキスト処理、暗号化アルゴリズムなど、様々な場面で役立ちます。このチュートリアルでは、JavaScriptで文字列内の特定の文字が出現する回数をカウントする2つの主要な方法と、それぞれの利点と欠点について説明します。...


【応用自在】filterとfindIndexで柔軟な重複処理

Setオブジェクトを使うSetオブジェクトは、重複のない要素の集合を保持するデータ構造です。オブジェクトの配列から重複を削除する最も簡単な方法は、Setオブジェクトを使うことです。Setオブジェクトを使う方法は、以下の利点があります。コードが簡潔で分かりやすい...


【迷ったらコレ!】JavaScriptでChromeブラウザを判定する方法:網羅的な解説とサンプルコード

このチュートリアルでは、JavaScript を使用してユーザーブラウザが Chrome かどうかを判断する方法を説明します。これを行うには、2 つの主要な方法があります。navigator. userAgent プロパティを使用するUser-Agent Client Hints API を使用する...


【徹底比較】JavaScriptでスリープ/待機を行う5つの方法のメリットとデメリット

最も簡単な方法は、setTimeout() 関数を使用することです。setTimeout() は、指定された時間後にコードを実行します。この例では、1秒後に "Hello World!" という文字列がコンソールに出力されます。Promise と async/await を使用すると、より洗練されたスリープ/待機を実現することができます。...


React useRefフックでDOM操作をマスター: ボタンクリック、フォーム入力、アニメーションの実行

この問題は、主に以下の2つの理由で発生します。レンダリングのタイミングuseRefフックはコンポーネントがレンダリングされる際に初期化されますが、.currentプロパティへの参照はレンダリング後に行われます。つまり、コンポーネントのレンダリング直後には...