Reactでクリック時クラス切り替え
Reactでクリック時にクラスを切り替える方法の解説 (日本語)
Reactで要素をクリックするたびにクラスを切り替える機能を実装する方法について、JavaScriptのコードを交えて解説します。
状態管理
- useStateフックを使って、クラスのオンオフを管理する状態変数を定義します。
import React, { useState } from 'react';
function MyComponent() {
const [isClassActive, setIsClassActive] = useState(false);
// ...
}
isClassActive
は、クラスがアクティブかどうかを表すブール値です。
クリックイベントの処理
- イベントハンドラー内で、
setIsClassActive
を使って状態を更新することで、クラスのオンオフを切り替えます。 - onClickプロパティを使って、要素をクリックしたときのイベントハンドラーを指定します。
<button onClick={() => setIsClassActive(!isClassActive)}>
Toggle Class
</button>
クラスの条件付き適用
isClassActive
がtrue
の場合に、クラスを適用します。- classNameプロパティを使って、クラスを条件的に適用します。
<div className={isClassActive ? 'active-class' : ''}>
This element will change class on click.
</div>
完全なコード例
import React, { useState } from 'react';
function MyComponent() {
const [isClassActive, setIsClassActive] = useState(false);
return (
<div>
<button onClick={() => setIsClassActive(!isClassActive)}>
Toggle Class
</button>
<div className={isClassActive ? 'active-class' : ''}>
This element will change class on click.
</div>
</div>
);
}
export default MyComponent;
ポイント
isClassActive
の状態変数の値に応じて、クラスのオンオフを切り替えます。- onClickプロパティでイベントハンドラーを指定し、classNameプロパティでクラスを条件的に適用します。
- useStateフックを使って状態を管理することで、クリックごとにクラスを切り替えることができます。
コードの全体像
import React, { useState } from 'react';
function MyComponent() {
const [isClassActive, setIsClassActive] = useState(false);
return (
<div>
<button onClick={() => setIsClassActive(!isClassActive)}>
Toggle Class
</button>
<div className={isClassActive ? 'active-class' : ''}>
This element will change class on click.
</div>
</div>
);
}
export default MyComponent;
コードの解説
- useStateフック
useState
はReactのフックの一つで、コンポーネント内で状態を管理するためのものです。isClassActive
: この変数は、クラスがアクティブかどうかを表すブール値です。true
であればクラスが適用され、false
であれば適用されません。setIsClassActive
: この関数は、isClassActive
の状態を更新するために使われます。
ボタンのクリックイベント
- onClick
onClick
は、ボタンがクリックされたときに実行されるイベントハンドラーを指定する属性です。setIsClassActive(!isClassActive)
: この部分で、isClassActive
の状態を反転させています。つまり、true
であればfalse
に、false
であればtrue
に切り替えます。
- className
className
は、要素に適用するクラス名を指定する属性です。
コードの動作
- コンポーネントが最初にレンダリングされると、
isClassActive
はfalse
に初期化されます。 - ボタンがクリックされると、
onClick
イベントハンドラーが実行され、isClassActive
の状態が反転します。 - 状態が更新されると、コンポーネントが再レンダリングされ、
className
属性の値が変化します。 isClassActive
がtrue
であれば、active-class
というクラス名が要素に適用され、CSSで定義されたスタイルが反映されます。
このコードは、Reactでクリックイベントを利用して、要素のクラスを動的に切り替える一般的なパターンです。useState
フックで状態を管理し、onClick
イベントハンドラーで状態を更新することで、UIの表示を変化させることができます。
さらに詳しく
- パフォーマンス
大量の要素を更新する場合、パフォーマンスに影響が出る可能性があります。React.memo
やuseMemo
などの最適化テクニックを検討する必要があります。 - カスタムフック
複雑なロジックが必要な場合は、カスタムフックを作成して状態管理とイベント処理をカプセル化することができます。 - CSS
active-class
というクラス名に、実際に適用したいCSSスタイルを定義します。
カスタムフックの使用
より複雑なロジックや再利用可能な状態管理が必要な場合、カスタムフックを作成することでコードの可読性と保守性を高めることができます。
import { useState } from 'react';
function useToggle(initialState = false) {
const [value, setValue] = useState(initialState);
const toggle = () => {
setValue(!value);
};
return [value, toggle];
}
function MyComponent() {
const [isActive, toggle] = useToggle();
return (
<div>
<button onClick={toggle}>Toggle</button>
<div className={isActive ? 'active' : ''}>...</div>
</div>
);
}
Context APIの利用
複数のコンポーネントで同じ状態を共有したい場合、Context APIを使用します。
import React, { createContext, useState, useContext } from 'react';
const ToggleContext = createContext();
function ToggleProvider({ children }) {
const [isActive, setIsActive] = useState(false);
const toggle = () => {
setIsActive(!isActive);
};
return (
<ToggleContext.Provider value={{ isActive, toggle }}>
{children}
</ToggleContext.Provider>
);
}
function MyComponent() {
const { isActive, toggle } = useContext(ToggleContext);
return (
// ...
);
}
Reduxの利用
大規模なアプリケーションで、状態管理を中央集権化したい場合、Reduxのような状態管理ライブラリを使用します。
// Reduxのセットアップ
import { createStore } from 'redux';
const initialState = {
isClassActive: false,
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case 'TOGGLE_CLASS':
return { ...state, isClassActive: !state.isClassActive };
default:
return state;
}
};
const store = createStore(reducer);
// コンポーネント
import { connect } from 'react-redux';
function MyComponent({ isClassActive, toggleClass }) {
// ...
}
const mapStateToProps = (state) => ({
isClassActive: state.isClassActive,
});
const mapDispatchToProps = (dispatch) => ({
toggleClass: () => dispatch({ type: 'TOGGLE_CLASS' }),
});
export default connect(mapStateToProps, mapDispatchToProps)(MyComponent);
どの方法を選ぶべきか?
- Redux
大規模なアプリケーションで、複雑な状態管理が必要な場合、またはチームで開発する場合。 - Context API
複数のコンポーネントで同じ状態を共有したい場合、またはReduxがオーバースペックに感じる場合。 - カスタムフック
再利用可能なロジックをカプセル化したい場合、または状態管理をシンプルにしたい場合。
選択のポイント
- チームの規模や開発スタイル
大規模なチームで開発する場合、Reduxのような統一的な状態管理が役立ちます。 - 状態の共有範囲
全てのコンポーネントで共有したい場合はContext APIやRedux、特定のコンポーネント間で共有したい場合はカスタムフックが適しています。 - 状態の複雑さ
状態がシンプルであれば、useState
やカスタムフックで十分です。複雑になれば、Reduxのような状態管理ライブラリが有効です。
Reactでクリック時にクラスを切り替える方法は、useState
フックが基本ですが、アプリケーションの規模や複雑さ、状態の共有範囲に応じて、カスタムフック、Context API、Reduxなど、より適切な方法を選択することができます。
- テスト
状態管理のロジックをテストしやすいように、カスタムフックやReduxのストアをテストする必要があります。
javascript reactjs