Reactのフォーカスイベント(onFocus, onBlur)の使い方と実装例を徹底解説

Reactを使用したインタラクティブなWebアプリケーション開発において、ユーザーが特定の要素に集中する際に重要な役割を果たすのがフォーカスイベントです。このイベントは、入力フォームやボタンなど、ユーザー操作が求められる要素で発生し、適切に利用することで使いやすく視覚的に優れたUIを実現できます。本記事では、onFocusとonBlurという2つの主要なフォーカスイベントの基本概念から実装方法、応用例、注意点までを徹底解説します。Reactでフォーカスイベントを効果的に活用し、ユーザーエクスペリエンスを向上させましょう。

目次
  1. フォーカスイベントとは何か
    1. onFocusとonBlurの基本概念
    2. Reactでのフォーカスイベントの特徴
  2. onFocusとonBlurの違い
    1. onFocusの特性
    2. onBlurの特性
    3. onFocusとonBlurの比較
  3. Reactでフォーカスイベントを使う方法
    1. onFocusイベントの実装例
    2. onBlurイベントの実装例
    3. onFocusとonBlurを組み合わせた例
    4. クラスコンポーネントでの使用方法
  4. フォーカス管理のベストプラクティス
    1. 1. フォーカスを適切な要素に限定する
    2. 2. フォーカスインジケーターを活用する
    3. 3. 初期フォーカスを設定する
    4. 4. キーボード操作に対応する
    5. 5. アクセシビリティの向上
    6. 6. 状態管理との連携
    7. 7. フォーカスが外れる場合の処理
    8. 8. デザインシステムと統一する
  5. フォーカスイベントでの注意点とエラー対策
    1. 1. フォーカスイベントのバブリングに関する誤解
    2. 2. フォーカスが意図せず外れる問題
    3. 3. アクセシビリティを無視したフォーカス操作
    4. 4. フォーカスイベントでのパフォーマンス問題
    5. 5. フォーカスイベントのタイミングに関する問題
    6. 6. カスタムコンポーネントでのフォーカスの引き継ぎ
  6. 応用例: フォームバリデーションへの活用
    1. リアルタイムのフィールドバリデーション
    2. 複数フィールドのバリデーション
    3. リアルタイムバリデーションとフォーカスイベントの組み合わせ
  7. アクセシビリティへの配慮
    1. 1. スクリーンリーダーに適した設計
    2. 2. キーボード操作への対応
    3. 3. フォーカストラップの導入
    4. 4. 視覚的なフォーカスインジケーターの強化
    5. 5. 不適切なフォーカス移動を防ぐ
    6. 6. 動的なフォーカス変更のタイミングに注意
  8. 実践演習: フォーカスイベントを使ったUIの構築
    1. 目標
    2. 要件
    3. 実装
    4. 解説
    5. 学習ポイント
    6. まとめ
  9. まとめ

フォーカスイベントとは何か


フォーカスイベントとは、ユーザーが特定のUI要素に対してフォーカス(集中)したり、フォーカスを外したりした際に発生するイベントのことです。主に、フォーム入力やインタラクティブな要素(ボタン、リンク、入力フィールドなど)で利用されます。

onFocusとonBlurの基本概念

  • onFocus: 要素がフォーカスを得たときにトリガーされるイベントです。たとえば、入力フィールドをクリックしたときやタブキーでそのフィールドに移動した際に発生します。
  • onBlur: 逆に、要素がフォーカスを失ったときにトリガーされるイベントです。次の要素にフォーカスが移ったときや、ユーザーが要素外をクリックしたときに発生します。

Reactでのフォーカスイベントの特徴


Reactでは、これらのフォーカスイベントは標準のHTMLイベントとして提供されるのではなく、SyntheticEventという抽象化されたイベントオブジェクトとして提供されます。これにより、ブラウザ間の互換性が確保され、シームレスにイベントを処理することが可能です。

例: フォーカスイベントの基本的な使い方


以下は、ReactでonFocusとonBlurを実装する基本例です。

import React, { useState } from 'react';

function FocusExample() {
  const [message, setMessage] = useState('');

  return (
    <div>
      <input
        type="text"
        onFocus={() => setMessage('Input is focused')}
        onBlur={() => setMessage('Input lost focus')}
      />
      <p>{message}</p>
    </div>
  );
}

export default FocusExample;

このコードでは、入力フィールドにフォーカスが当たるとメッセージが「Input is focused」に変わり、フォーカスが外れると「Input lost focus」に切り替わります。

Reactでフォーカスイベントを活用することで、ユーザーの動作に応じたインタラクションを簡単に実現できます。

onFocusとonBlurの違い

onFocusとonBlurは、どちらもフォーカスに関連するイベントですが、それぞれの動作や用途に明確な違いがあります。これを理解することで、適切な場面で活用できます。

onFocusの特性


onFocusイベントは、以下のような場面で発生します。

  • 要素がフォーカスを取得したときにトリガーされる。
  • 例: ユーザーが入力フィールドをクリック、またはキーボードでタブキーを使用してその要素に移動した場合。
  • バブリングされない(イベントが親要素に伝播しない)ため、特定の要素にのみ適用されます。

onFocusの使用例

<input
  type="text"
  onFocus={() => console.log("Focused!")}
/>


このコードでは、入力フィールドにフォーカスが当たったとき、”Focused!”とコンソールに表示されます。

onBlurの特性


onBlurイベントは、以下のような場面で発生します。

  • 要素がフォーカスを失ったときにトリガーされる。
  • 例: ユーザーが入力フィールドから別の要素に移動、またはフィールド外をクリックした場合。
  • バブリングされない点はonFocusと同様ですが、フォーカス移動時の終了処理に適しています。

onBlurの使用例

<input
  type="text"
  onBlur={() => console.log("Blurred!")}
/>


このコードでは、入力フィールドのフォーカスが外れたとき、”Blurred!”とコンソールに表示されます。

onFocusとonBlurの比較

特性onFocusonBlur
トリガーされるタイミング要素がフォーカスを得たとき要素がフォーカスを失ったとき
主な用途初期処理、UI変更後処理、バリデーション
イベントの伝播バブリングされないバブリングされない

利用シーンの例

  • onFocus: 入力フィールドに説明テキストを表示する。
  • onBlur: 入力内容をバリデーションし、エラーメッセージを表示する。

Reactでこれらのイベントを適切に使い分けることで、ユーザーの操作に応じた動的なインターフェースを構築できます。

Reactでフォーカスイベントを使う方法

ReactでonFocusとonBlurイベントを実装するのはシンプルで、イベントハンドラを直接要素に設定するだけで利用できます。ここでは基本的な使用方法を解説します。

onFocusイベントの実装例


以下の例では、onFocusを使用して、入力フィールドにフォーカスが当たったときにメッセージを表示します。

import React, { useState } from 'react';

function FocusExample() {
  const [message, setMessage] = useState('');

  return (
    <div>
      <input
        type="text"
        onFocus={() => setMessage('Input field is now focused')}
      />
      <p>{message}</p>
    </div>
  );
}

export default FocusExample;


このコードでは、入力フィールドにフォーカスが当たると、メッセージが更新されます。

onBlurイベントの実装例


次に、onBlurを使用して、フォーカスが外れた際にメッセージを更新する例です。

import React, { useState } from 'react';

function BlurExample() {
  const [message, setMessage] = useState('');

  return (
    <div>
      <input
        type="text"
        onBlur={() => setMessage('Input field has lost focus')}
      />
      <p>{message}</p>
    </div>
  );
}

export default BlurExample;


この例では、入力フィールドのフォーカスが外れると、メッセージが変更されます。

onFocusとonBlurを組み合わせた例


onFocusとonBlurを組み合わせることで、より複雑なインタラクションを実現できます。以下は、入力フィールドのフォーカス状態に応じて動的にスタイルを変更する例です。

import React, { useState } from 'react';

function CombinedExample() {
  const [focused, setFocused] = useState(false);

  return (
    <div>
      <input
        type="text"
        onFocus={() => setFocused(true)}
        onBlur={() => setFocused(false)}
        style={{
          border: focused ? '2px solid blue' : '1px solid gray',
          outline: 'none',
        }}
      />
      <p>{focused ? 'Field is focused' : 'Field is not focused'}</p>
    </div>
  );
}

export default CombinedExample;

このコードでは、入力フィールドがフォーカスされている間は青い枠線が表示され、フォーカスが外れると灰色の枠線に戻ります。

クラスコンポーネントでの使用方法


関数コンポーネントと同様、クラスコンポーネントでもフォーカスイベントを利用できます。

import React, { Component } from 'react';

class ClassExample extends Component {
  constructor(props) {
    super(props);
    this.state = {
      message: '',
    };
  }

  handleFocus = () => {
    this.setState({ message: 'Focused!' });
  };

  handleBlur = () => {
    this.setState({ message: 'Blurred!' });
  };

  render() {
    return (
      <div>
        <input type="text" onFocus={this.handleFocus} onBlur={this.handleBlur} />
        <p>{this.state.message}</p>
      </div>
    );
  }
}

export default ClassExample;

ReactでonFocusとonBlurを活用することで、ユーザーが直感的に操作できるインタラクションを実現できます。これらを組み合わせて、UIの利便性を向上させましょう。

フォーカス管理のベストプラクティス

フォーカスイベントを効果的に利用するには、適切なフォーカス管理が重要です。特に、ユーザー体験を向上させるためには、フォーカスのタイミングや動作を考慮した設計が求められます。ここでは、フォーカス管理のベストプラクティスを紹介します。

1. フォーカスを適切な要素に限定する


フォーカスは、ユーザーが操作可能な要素(ボタン、リンク、入力フィールドなど)に限定して設定します。不必要にフォーカス可能な要素を増やすと、アクセシビリティや操作性に影響を与えます。

<button onFocus={() => console.log('Button is focused')}>Click me</button>


適切な要素にフォーカスイベントを設定することで、ユーザー操作を直感的に導けます。

2. フォーカスインジケーターを活用する


ユーザーが現在操作している要素が明確になるよう、フォーカスインジケーター(例えば、枠線や背景色の変更)を追加します。CSSを利用してフォーカス状態を視覚的に強調するのが一般的です。

<input
  type="text"
  style={{
    border: '2px solid blue',
    outline: 'none',
  }}
/>

3. 初期フォーカスを設定する


ページロード時に、最初に操作すべき要素にフォーカスを設定することで、ユーザーが迷うことなく操作を開始できます。

useEffect(() => {
  document.getElementById('firstInput').focus();
}, []);


この例では、ページロード時に特定の入力フィールドがフォーカスされます。

4. キーボード操作に対応する


キーボード操作がスムーズに行えるよう、タブキーによるフォーカスの移動を考慮します。要素の順序はtabindex属性を使用して適切に設定してください。

<button tabIndex={1}>Button 1</button>
<button tabIndex={2}>Button 2</button>

5. アクセシビリティの向上


スクリーンリーダー利用者を考慮し、フォーカスイベントで画面リーダーが適切に内容を読み上げるよう設定します。ARIA属性を活用することで、視覚に頼らない操作性を確保できます。

<input
  type="text"
  aria-label="Enter your name"
  onFocus={() => console.log('Focused')}
/>

6. 状態管理との連携


状態管理ライブラリ(例えばReduxやContext API)と組み合わせることで、フォーカス状態をアプリ全体で管理し、一貫性を持たせることができます。

<input
  type="text"
  onFocus={() => dispatch({ type: 'SET_FOCUS', payload: true })}
  onBlur={() => dispatch({ type: 'SET_FOCUS', payload: false })}
/>

7. フォーカスが外れる場合の処理


フォーカスが外れたときにエラーチェックや保存処理を実行することで、ユーザーのミスを最小限に抑えることができます。

<input
  type="text"
  onBlur={(e) => {
    if (!e.target.value) {
      console.log('Input cannot be empty');
    }
  }}
/>

8. デザインシステムと統一する


フォーカス管理はデザインシステムと統一することで、アプリ全体で一貫性のある操作性を実現できます。たとえば、すべてのフォーカス可能な要素に共通のスタイルを適用します。

CSSでの統一例

:focus {
  outline: 2px solid blue;
}

フォーカス管理を徹底することで、使いやすさとアクセシビリティの高いReactアプリケーションを構築できます。

フォーカスイベントでの注意点とエラー対策

ReactでonFocusやonBlurイベントを使用する際には、その特性に起因する問題やエラーが発生することがあります。これらの問題を未然に防ぐための注意点と、それぞれに対する対策を解説します。

1. フォーカスイベントのバブリングに関する誤解


ReactのonFocusとonBlurイベントは、キャプチャフェーズで発生し、ネイティブのバブリング動作とは異なります。このため、イベントが親要素に伝播することを期待すると正しく動作しない場合があります。

対策


onFocusとonBlurではなく、ネイティブのfocusinおよびfocusoutイベントを使用することで、バブリング動作を模倣できます。Reactでこれを実現するには、useEffectフックとaddEventListenerを組み合わせます。

useEffect(() => {
  const handleFocusIn = (event) => {
    console.log('Focus moved to', event.target);
  };
  document.addEventListener('focusin', handleFocusIn);
  return () => {
    document.removeEventListener('focusin', handleFocusIn);
  };
}, []);

2. フォーカスが意図せず外れる問題


動的に生成された要素にフォーカスを移す場合、DOMの変更によってフォーカスが失われることがあります。たとえば、フォームエラーを表示するときにDOMツリーが更新され、フォーカスが外れることがあります。

対策


フォーカスを再設定することで、ユーザーの操作を中断しないようにします。Reactのrefを利用して特定の要素を再度フォーカスします。

import { useRef, useEffect } from 'react';

function FormExample() {
  const inputRef = useRef(null);

  useEffect(() => {
    if (inputRef.current) {
      inputRef.current.focus();
    }
  }, []);

  return <input ref={inputRef} type="text" />;
}

3. アクセシビリティを無視したフォーカス操作


JavaScriptでフォーカスを無理に操作すると、スクリーンリーダーやキーボード操作に影響を与えることがあります。これにより、視覚障害者やキーボードのみを使うユーザーが操作を困難に感じる場合があります。

対策


フォーカス操作がアクセシビリティに配慮しているか確認し、ARIA属性を適切に設定します。

<button
  aria-label="Submit the form"
  onFocus={() => console.log('Button focused')}
>
  Submit
</button>

4. フォーカスイベントでのパフォーマンス問題


大量の要素にonFocusやonBlurを設定すると、イベント処理の負荷が高くなり、パフォーマンスに影響する場合があります。

対策


イベントの処理を親要素でまとめて管理し、必要最小限の処理だけを実行します。

function FormWrapper() {
  const handleFocus = (event) => {
    console.log(`${event.target.name} is focused`);
  };

  return (
    <div onFocus={handleFocus}>
      <input name="input1" type="text" />
      <input name="input2" type="text" />
    </div>
  );
}

5. フォーカスイベントのタイミングに関する問題


onFocusやonBlurイベントは、ブラウザの描画タイミングに依存するため、イベントの発生順序が予期せぬ結果をもたらす場合があります。たとえば、クリックイベントがフォーカスイベントの後に発生するため、クリック時にフォーカスが失われる可能性があります。

対策


非同期処理やsetTimeoutを利用して、フォーカスイベントのタイミングを調整します。

function DelayedBlur() {
  const handleBlur = () => {
    setTimeout(() => {
      console.log('Input lost focus');
    }, 0);
  };

  return <input type="text" onBlur={handleBlur} />;
}

6. カスタムコンポーネントでのフォーカスの引き継ぎ


カスタムコンポーネントにフォーカスを設定しようとすると、内部のDOM要素に正しくフォーカスが適用されない場合があります。

対策


ReactのforwardRefを使用して、フォーカスを内部要素に伝達します。

import React, { forwardRef } from 'react';

const CustomInput = forwardRef((props, ref) => (
  <input ref={ref} type="text" {...props} />
));

function App() {
  const inputRef = useRef(null);

  return <CustomInput ref={inputRef} />;
}

これらの注意点と対策を実践することで、Reactアプリケーションでのフォーカスイベントの利用をより効果的かつエラーの少ないものにできます。

応用例: フォームバリデーションへの活用

onFocusとonBlurイベントは、フォーム入力のバリデーションを実装する際に非常に役立ちます。リアルタイムの入力チェックやフォーカス移動時のエラーメッセージ表示を組み合わせることで、ユーザー体験を向上させることができます。以下に、フォームバリデーションでの活用例を示します。

リアルタイムのフィールドバリデーション


入力フィールドにフォーカスが当たったときにヒントを表示し、フォーカスが外れたときにバリデーションを実行してエラーメッセージを表示する例です。

import React, { useState } from 'react';

function FormValidation() {
  const [inputValue, setInputValue] = useState('');
  const [errorMessage, setErrorMessage] = useState('');
  const [hintMessage, setHintMessage] = useState('');

  const handleFocus = () => {
    setHintMessage('Input must be at least 5 characters long');
  };

  const handleBlur = () => {
    setHintMessage('');
    if (inputValue.length < 5) {
      setErrorMessage('Input is too short');
    } else {
      setErrorMessage('');
    }
  };

  const handleChange = (e) => {
    setInputValue(e.target.value);
  };

  return (
    <div>
      <label htmlFor="inputField">Enter Text:</label>
      <input
        id="inputField"
        type="text"
        value={inputValue}
        onChange={handleChange}
        onFocus={handleFocus}
        onBlur={handleBlur}
      />
      {hintMessage && <p style={{ color: 'blue' }}>{hintMessage}</p>}
      {errorMessage && <p style={{ color: 'red' }}>{errorMessage}</p>}
    </div>
  );
}

export default FormValidation;

ポイント

  • onFocusでヒントを表示し、ユーザーに適切な入力を促します。
  • onBlurでバリデーションを実行し、エラーがある場合はエラーメッセージを表示します。

複数フィールドのバリデーション


複数の入力フィールドを持つフォームにおいて、各フィールドのフォーカスイベントを利用してバリデーションを管理します。

function MultiFieldForm() {
  const [formState, setFormState] = useState({
    email: '',
    password: '',
  });

  const [errors, setErrors] = useState({ email: '', password: '' });

  const validateField = (name, value) => {
    switch (name) {
      case 'email':
        if (!value.includes('@')) {
          return 'Invalid email address';
        }
        break;
      case 'password':
        if (value.length < 6) {
          return 'Password must be at least 6 characters';
        }
        break;
      default:
        return '';
    }
    return '';
  };

  const handleBlur = (e) => {
    const { name, value } = e.target;
    setErrors((prevErrors) => ({
      ...prevErrors,
      [name]: validateField(name, value),
    }));
  };

  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormState((prevState) => ({
      ...prevState,
      [name]: value,
    }));
  };

  return (
    <form>
      <div>
        <label htmlFor="email">Email:</label>
        <input
          type="email"
          id="email"
          name="email"
          value={formState.email}
          onChange={handleChange}
          onBlur={handleBlur}
        />
        {errors.email && <p style={{ color: 'red' }}>{errors.email}</p>}
      </div>
      <div>
        <label htmlFor="password">Password:</label>
        <input
          type="password"
          id="password"
          name="password"
          value={formState.password}
          onChange={handleChange}
          onBlur={handleBlur}
        />
        {errors.password && <p style={{ color: 'red' }}>{errors.password}</p>}
      </div>
      <button type="submit">Submit</button>
    </form>
  );
}

ポイント

  • フィールドごとのバリデーションルールを作成し、フォーカスが外れるタイミングでチェックを行います。
  • エラーメッセージを状態に保存し、動的にレンダリングします。

リアルタイムバリデーションとフォーカスイベントの組み合わせ


フォーカスイベントを活用することで、ユーザーが入力に集中しやすくなるインターフェースを構築できます。これにより、ユーザーがエラーを事前に修正しやすくなります。ReactのonFocusとonBlurを適切に組み合わせ、使いやすいフォームを設計しましょう。

アクセシビリティへの配慮

ReactでonFocusとonBlurイベントを使用する際には、アクセシビリティを考慮することが重要です。適切にフォーカス管理を行うことで、スクリーンリーダーやキーボード操作に対応し、すべてのユーザーがアプリケーションを快適に利用できるようにします。ここでは、アクセシビリティに配慮した実装方法を解説します。

1. スクリーンリーダーに適した設計


スクリーンリーダーは、フォーカス可能な要素を読み上げることでユーザーに情報を提供します。onFocusイベントを利用して、フォーカス時に必要な説明を伝えることができます。

例: ARIA属性での補足情報提供

function AccessibleForm() {
  return (
    <div>
      <label htmlFor="username">Username</label>
      <input
        id="username"
        type="text"
        aria-describedby="username-desc"
        onFocus={() => console.log('Username field is focused')}
      />
      <p id="username-desc">Enter a unique username with 5-15 characters.</p>
    </div>
  );
}
  • aria-describedby属性で、フォーカス時に追加情報を提供します。
  • スクリーンリーダーが「Enter a unique username with 5-15 characters.」を読み上げます。

2. キーボード操作への対応


キーボードのみを使用するユーザー向けに、フォーカスの移動が自然であることを確認します。フォーカス可能な要素の順序はtabindex属性を利用して制御します。

例: tabindexの利用

function KeyboardAccessible() {
  return (
    <div>
      <button tabIndex={1}>First Button</button>
      <button tabIndex={2}>Second Button</button>
      <button tabIndex={3}>Third Button</button>
    </div>
  );
}
  • tabindexを明示的に指定して、フォーカス移動の順序を制御します。

3. フォーカストラップの導入


モーダルウィンドウやダイアログボックスでは、フォーカストラップを導入することで、ユーザーがモーダル外にフォーカスを移動しないようにします。

例: フォーカストラップの実装

import { useEffect, useRef } from 'react';

function Modal({ isOpen, onClose }) {
  const modalRef = useRef();

  useEffect(() => {
    if (isOpen) {
      const firstFocusableElement = modalRef.current.querySelector(
        'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
      );
      firstFocusableElement?.focus();
    }
  }, [isOpen]);

  return isOpen ? (
    <div ref={modalRef} role="dialog" aria-labelledby="modal-title">
      <h2 id="modal-title">Modal Title</h2>
      <button onClick={onClose}>Close</button>
    </div>
  ) : null;
}
  • モーダルウィンドウ内での最初のフォーカス可能な要素にフォーカスを設定します。
  • role属性でダイアログの役割を示し、アクセシビリティを向上させます。

4. 視覚的なフォーカスインジケーターの強化


フォーカス可能な要素に視覚的なインジケーターを適用することで、キーボードユーザーや視覚障害を持つユーザーに操作可能な要素を明示します。

例: CSSでのフォーカススタイル設定

button:focus {
  outline: 2px solid blue;
  background-color: lightblue;
}

5. 不適切なフォーカス移動を防ぐ


フォーカスが意図しない要素に移動しないように、特定の要素をフォーカスから除外します。

例: フォーカス除外の設定

function ExcludeFromFocus() {
  return <div tabIndex={-1}>This element cannot be focused.</div>;
}

6. 動的なフォーカス変更のタイミングに注意


フォーカスを動的に変更する際には、タイミングが重要です。DOMが変更される直前や直後にフォーカスを設定すると、ユーザー体験が混乱する可能性があります。ReactのuseEffectフックを利用してタイミングを管理します。

例: 動的フォーカス変更

function DynamicFocus() {
  const inputRef = useRef();

  useEffect(() => {
    inputRef.current.focus();
  }, []);

  return <input ref={inputRef} type="text" />;
}

これらのアプローチを組み合わせることで、すべてのユーザーにとってアクセシブルで使いやすいアプリケーションを構築できます。アクセシビリティに配慮したフォーカス管理は、包括的なユーザー体験の向上に不可欠です。

実践演習: フォーカスイベントを使ったUIの構築

ここでは、onFocusとonBlurを活用して、実際にユーザーインタラクションのあるUIを構築します。演習を通じて、フォーカスイベントの実装方法と応用例を学びましょう。

目標

  • ユーザーがフォーム入力をスムーズに行えるよう、フォーカスに応じて動的なフィードバックを提供するUIを構築する。
  • エラーメッセージやヒントを適切なタイミングで表示し、インタラクティブなUIを実現する。

要件

  1. 入力フィールドにフォーカスが当たると説明メッセージを表示する。
  2. 入力フィールドからフォーカスが外れると入力内容をチェックし、エラーメッセージを表示する。
  3. すべての入力が正しい場合、送信ボタンを有効にする。

実装

import React, { useState } from 'react';

function InteractiveForm() {
  const [formData, setFormData] = useState({ username: '', email: '' });
  const [errors, setErrors] = useState({ username: '', email: '' });
  const [isFormValid, setIsFormValid] = useState(false);

  const handleFocus = (field) => {
    if (field === 'username') {
      setErrors((prevErrors) => ({ ...prevErrors, username: 'Enter a unique username.' }));
    } else if (field === 'email') {
      setErrors((prevErrors) => ({ ...prevErrors, email: 'Enter a valid email address.' }));
    }
  };

  const handleBlur = (field) => {
    if (field === 'username' && formData.username.length < 3) {
      setErrors((prevErrors) => ({ ...prevErrors, username: 'Username must be at least 3 characters long.' }));
    } else if (field === 'email' && !formData.email.includes('@')) {
      setErrors((prevErrors) => ({ ...prevErrors, email: 'Email must contain "@" symbol.' }));
    } else {
      setErrors((prevErrors) => ({ ...prevErrors, [field]: '' }));
    }
  };

  const handleChange = (e) => {
    const { name, value } = e.target;
    setFormData((prevData) => ({ ...prevData, [name]: value }));

    // Validate form on input change
    setIsFormValid(
      formData.username.length >= 3 &&
      formData.email.includes('@')
    );
  };

  return (
    <div>
      <form>
        <div>
          <label htmlFor="username">Username:</label>
          <input
            type="text"
            id="username"
            name="username"
            value={formData.username}
            onFocus={() => handleFocus('username')}
            onBlur={() => handleBlur('username')}
            onChange={handleChange}
          />
          {errors.username && <p style={{ color: 'red' }}>{errors.username}</p>}
        </div>
        <div>
          <label htmlFor="email">Email:</label>
          <input
            type="email"
            id="email"
            name="email"
            value={formData.email}
            onFocus={() => handleFocus('email')}
            onBlur={() => handleBlur('email')}
            onChange={handleChange}
          />
          {errors.email && <p style={{ color: 'red' }}>{errors.email}</p>}
        </div>
        <button type="submit" disabled={!isFormValid}>
          Submit
        </button>
      </form>
    </div>
  );
}

export default InteractiveForm;

解説

  • フォーカス時: onFocusイベントで、入力ガイドを表示します。
  • フォーカスが外れたとき: onBlurイベントで、入力内容を検証し、エラーメッセージを表示します。
  • リアルタイム検証: onChangeイベントを活用して、入力内容の変化に応じてフォーム全体の状態を更新します。

学習ポイント

  • 状態管理: 入力内容やエラーの状態を個別に管理し、適切に更新する方法を理解します。
  • 動的なUI変更: フォーカスイベントと状態を組み合わせて、リアルタイムのフィードバックを提供する方法を学びます。
  • ユーザー体験の向上: 適切なタイミングでヒントやエラーを表示することで、入力の快適さを向上させます。

まとめ


フォーカスイベントを活用することで、ユーザーの入力体験を大幅に向上させることができます。このようなインタラクティブなフォームは、Reactのイベントシステムを活かして実装できます。次のステップでは、さらに高度なUI構築やアクセシビリティへの応用を試してみましょう。

まとめ

本記事では、ReactのフォーカスイベントであるonFocusとonBlurの基本的な使い方から応用例までを解説しました。フォーカスイベントは、ユーザーが特定の要素に集中したり離れたりする際の動作をキャッチする重要なツールです。適切に実装することで、ユーザー体験を向上させる直感的なインターフェースを構築できます。

具体的には、フォームバリデーションやアクセシビリティ対応、動的UIの構築など、フォーカスイベントの実用例を学びました。これらを活用して、インタラクティブかつアクセシブルなReactアプリケーションを作成しましょう。フォーカス管理を適切に行うことで、プロジェクト全体の品質が向上します。

次のステップとして、実際のプロジェクトでこれらの手法を応用し、より使いやすいアプリケーションを構築してみてください。

コメント

コメントする

目次
  1. フォーカスイベントとは何か
    1. onFocusとonBlurの基本概念
    2. Reactでのフォーカスイベントの特徴
  2. onFocusとonBlurの違い
    1. onFocusの特性
    2. onBlurの特性
    3. onFocusとonBlurの比較
  3. Reactでフォーカスイベントを使う方法
    1. onFocusイベントの実装例
    2. onBlurイベントの実装例
    3. onFocusとonBlurを組み合わせた例
    4. クラスコンポーネントでの使用方法
  4. フォーカス管理のベストプラクティス
    1. 1. フォーカスを適切な要素に限定する
    2. 2. フォーカスインジケーターを活用する
    3. 3. 初期フォーカスを設定する
    4. 4. キーボード操作に対応する
    5. 5. アクセシビリティの向上
    6. 6. 状態管理との連携
    7. 7. フォーカスが外れる場合の処理
    8. 8. デザインシステムと統一する
  5. フォーカスイベントでの注意点とエラー対策
    1. 1. フォーカスイベントのバブリングに関する誤解
    2. 2. フォーカスが意図せず外れる問題
    3. 3. アクセシビリティを無視したフォーカス操作
    4. 4. フォーカスイベントでのパフォーマンス問題
    5. 5. フォーカスイベントのタイミングに関する問題
    6. 6. カスタムコンポーネントでのフォーカスの引き継ぎ
  6. 応用例: フォームバリデーションへの活用
    1. リアルタイムのフィールドバリデーション
    2. 複数フィールドのバリデーション
    3. リアルタイムバリデーションとフォーカスイベントの組み合わせ
  7. アクセシビリティへの配慮
    1. 1. スクリーンリーダーに適した設計
    2. 2. キーボード操作への対応
    3. 3. フォーカストラップの導入
    4. 4. 視覚的なフォーカスインジケーターの強化
    5. 5. 不適切なフォーカス移動を防ぐ
    6. 6. 動的なフォーカス変更のタイミングに注意
  8. 実践演習: フォーカスイベントを使ったUIの構築
    1. 目標
    2. 要件
    3. 実装
    4. 解説
    5. 学習ポイント
    6. まとめ
  9. まとめ