亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目次
React Context と Ref を組み合わせたアプリケーションを理解する
ブラーイベントの制限とフォーカスアウトの利點
focusout イベントを使用して、正しい焦點外れの監(jiān)視を実裝します。
要約する
ホームページ ウェブフロントエンド jsチュートリアル React の Context を介して Ref を管理し、フォーカス イベントを処理するための実踐的なガイド

React の Context を介して Ref を管理し、フォーカス イベントを処理するための実踐的なガイド

Oct 15, 2025 am 11:21 AM

React の Context を介して Ref を管理し、フォーカス イベントを処理するための実踐的なガイド

この記事では、Context を介して DOM 要素の ref を子コンポーネントに渡すときに、React アプリケーションでフォーカス イベントを正しく処理する方法について説明します。 Blur イベントがバブルアップせず、その結果、親要素上で焦點の合っていない子要素をキャプチャできなくなるという問題に対応して、この記事では、解決策として focusout イベントを使用することを提案し、イベント リスナーの正しい設定とクリーンアップを確実にするための詳細なコード例と説明を提供します。

React Context と Ref を組み合わせたアプリケーションを理解する

React では、ref は DOM ノードまたはコンポーネント インスタンスにアクセスする方法です。複數(shù)のコンポーネント間で DOM 要素の ref を共有する必要がある場合、React Context は効率的で簡潔なメカニズムを提供します。たとえば、親コンポーネントが DOM 要素の ref を持ち、その子コンポーネントがこの ref に基づいてイベント リスナーの追加などの特定の操作を実行することを望む場合があります。

次のシナリオを考えてみましょう。 EditorProvider コンポーネントが div 要素の ref を管理し、それを Context を通じて使用するコンポーネントに公開します。

 import React, { useRef, useContext, useMemo } from 'react';

// Context インターフェイスのタイプを定義 EditorContextProps {
    履歴狀態(tài): 任意; // たとえば、特定の型は実際のニーズに応じて定義されます ref: React.RefObject<htmldivelement>;
}

// コンテキストを作成する
const EditorContext = React.createContext<editorcontextprops>(未定義);

// コンテキストの利用を容易にするためにフックをカスタマイズします
エクスポート関數(shù) useEditorContext(): EditorContextProps {
    const context = useContext(EditorContext);
    if (コンテキスト === 未定義) {
        throw new Error('useEditorContext は EditorProvider 內で使用する必要があります');
    }
    コンテキストを返します。
}

// EditorProvider コンポーネントのエクスポートのデフォルト関數(shù) EditorProvider({ Children }: { Children: React.ReactNode }) {
    const ref = useRef<htmldivelement>(null); // 參照を作成する
    const HistoryState = useMemo(() => ({ /* 初期狀態(tài) */ }), []); // 例 const context = {historyState, ref };

    戻る (
        <editorcontext.provider>
            <div ref="{ref}"> {/* ref を DOM 要素にバインドします*/}
                {子供たち}
            </div>
        </editorcontext.provider>
    );
}</htmldivelement></editorcontextprops></htmldivelement>

上記のコードは、EditorProvider を通じて HTMLDivElement の參照を共有する方法を示しています。使用側コンポーネント (Lexical プラグインなど) は、useEditorContext フックを通じてこの ref を取得できます。

ブラーイベントの制限とフォーカスアウトの利點

使用するコンポーネントがこの共有參照で焦點の合っていないイベントをリッスンしようとするとき、よくある誤解は、blur イベントを使用することです。

 import React, { useEffect, useCallback } from 'react';
import { useEditorContext } から './EditorProvider'; // パス関數(shù) MyLexicalPlugin() を想定します {
    const { ref } = useEditorContext();

    const BlurHandler = useCallback((イベント: FocusEvent) => {
        console.log('ぼやけた');
        // デフォーカスロジックをここで処理します}, []);

    useEffect(() => {
        const 要素 = ref.current;
        if (要素) {
            // エラーのデモ: ブラーイベントはバブルしません element.addEventListener('blur', BlurHandler, false);
        }

        return() => {
            if (要素) {
                element.removeEventListener('blur', BlurHandler);
            }
        };
    }, [ref.current, BlurHandler]); // 依存関係には ref.current が含まれます

    null を返します。 // プラグインは通常、DOM をレンダリングしません。
}

上記のコードでは、特に ref が指す div 內の子要素からフォーカスが離れると、blurHandler が期待どおりにトリガーされないことがあります。これは、ブラー イベントがバブルアップしないためです。これは、フォーカスが子要素から離れた場合、blur イベントはその子要素でのみトリガーされ、その親要素 (つまり、ref 経由で參照した div) には伝播されないことを意味します。

この問題を解決するには、 focusout イベントを使用する必要があります。 focusout イベントは Blur イベントに似ており、どちらも要素がフォーカスを失ったことを示しますが、主な違いはfocusout イベントがバブルアップすることです。 focusout イベントは、要素自體またはその子孫がフォーカスを失ったときに要素でトリガーされます。これは、親要素上の子要素のフォーカス外の動作を監(jiān)視するのに最適です。

focusout イベントを使用して、正しい焦點外れの監(jiān)視を実裝します。

問題を解決するには、useEffect の Blur イベントを focusout に置き換えます。

 import React, { useEffect, useCallback } from 'react';
import { useEditorContext } から './EditorProvider'; // パス関數(shù) MyLexicalPlugin() を想定します {
    const { ref } = useEditorContext();

    const BlurHandler = useCallback((イベント: FocusEvent) => {
        console.log('ぼやけているか、フォーカスが子要素から移動しました');
        // デフォーカスロジックをここで処理します}, []);

    useEffect(() => {
        const 要素 = ref.current;
        if (要素) {
            // 正しいアプローチ: focusout イベントを使用すると、バブルが発生します element.addEventListener('focusout', BlurHandler);
        } それ以外 {
            戻る; // 要素が存在しない場合は何も実行されません。}

        // クリーンアップ関數(shù): コンポーネントがアンインストールされたとき、または依存関係が変更されたときにイベント リスナーを削除します return () => {
            if (element) { //念のため、要素が存在するかどうかを再度確認します element.removeEventListener('focusout', BlurHandler);
            }
        };
    }, [ref.current, BlurHandler]); // 依存関係には ref.current と BlurHandler が含まれます

    null を返します。
}

コード分??析と注意事項:

  1. useCallback はイベント ハンドラー関數(shù)をラップします。blurHandlerは useCallback によってラップされます。これにより、ref.current が変更されない限り、各レンダリング中に BlurHandler の參照が安定したままになります。これは、useEffect の依存関係の最適化において、不要なイベント リスナーの再登録を避けるために非常に重要です。
  2. useEffect の依存関係:
    • ref.current: useEffect は、ref が指す DOM 要素が変更されると再実行されます (これは通常 EditorProvider では起こりませんが、ベスト プラクティスとしてこれを含める必要があります)。
    • BlurHandler: useCallback を使用しますが、blurHandler が內部的に外部変數(shù)に依存しており、これらの変數(shù)が変更されると、blurHandler の參照も変更されます?,F(xiàn)時點では、新しいイベント処理関數(shù)を登録するために useEffect を再実行する必要があります。
  3. クリーンアップ関數(shù): useEffect によって返される関數(shù)はクリーンアップ関數(shù)です。これは、コンポーネントがアンロードされるとき、または useEffect の依存関係が変更されて再実行される前に実行されます。ここでは、メモリ リークを防ぐために、以前に追加した focusout イベント リスナーを削除しました。
  4. focusout と focusin:同様に、focusin イベントは focus イベントのバブリング バージョンです。親要素上の子要素のフォーカス取得動作を監(jiān)視する必要がある場合は、focusin を使用できます。
  5. 條件チェック: useEffect 內で、ref.current が null かどうかを常にチェックします。コンポーネント実裝の初期段階では、ref.current にまだ値が割り當てられていない可能性があります。

要約する

React では、Context を介した ref の共有は、複雑なコンポーネント間の DOM インタラクションを管理するための強力なパターンです。これらの共有參照でフォーカス イベントをリッスンする場合、blur と focusout (または focus と focusin) の違いを理解することが重要です。 focusout イベントのバブリングの性質により、親要素上の子要素のフォーカスが外れた動作をキャプチャするのに最適です。 useEffect と useCallback を正しく使用すると、メモリ リークのない堅牢なイベント リスニング メカニズムを構築できます。

以上がReact の Context を介して Ref を管理し、フォーカス イベントを処理するための実踐的なガイドの詳細內容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當する法的責任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Stock Market GPT

Stock Market GPT

AIを活用した投資調査により賢明な意思決定を実現(xiàn)

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中國語版

SublimeText3 中國語版

中國語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

JavaScriptは、クリックスルーイメージの切り替え効果を実現(xiàn)します:プロフェッショナルチュートリアル JavaScriptは、クリックスルーイメージの切り替え効果を実現(xiàn)します:プロフェッショナルチュートリアル Sep 18, 2025 pm 01:03 PM

この記事では、JavaScriptを使用して畫像をクリックする効果を実現(xiàn)する方法を紹介します。コアのアイデアは、HTML5のデータ - *屬性を使用して、代替畫像パスを保存し、JavaScriptを介してクリックイベントをリッスンし、SRC屬性を動的に切り替えて、畫像の切り替えを実現(xiàn)することです。この記事では、詳細なコードの例と説明を提供して、この一般的に使用されるインタラクティブ効果を理解し、習得するのに役立ちます。

JavaScriptでGeolocation APIを使用してユーザーの位置を取得するにはどうすればよいですか? JavaScriptでGeolocation APIを使用してユーザーの位置を取得するにはどうすればよいですか? Sep 21, 2025 am 06:19 AM

まず、ブラウザがGeolocationapiをサポートしているかどうかを確認します。サポートされている場合は、getCurrentPosition()を呼び出してユーザーの現(xiàn)在の位置座標を取得し、成功したコールバックを通じて緯度と経度の値を取得します。同時に、拒否許可、場所の利用不能、タイムアウトなどのエラーコールバック処理の例外を提供します。また、高精度を有効にするために構成オプションを渡し、タイムアウト時間とキャッシュの妥當性期間を設定することもできます。プロセス全體には、ユーザー承認と対応するエラー処理が必要です。

javascriptでsetintervalで繰り返し間隔を作成する方法 javascriptでsetintervalで繰り返し間隔を作成する方法 Sep 21, 2025 am 05:31 AM

JavaScriptに繰り返し間隔を作成するには、SetInterval()関數(shù)を使用する必要があります。これは、指定されたミリ秒間隔で関數(shù)またはコードブロックを繰り返し実行する必要があります。たとえば、setinterval(()=> {console.log( "2秒ごとに実行");}、2000)は、clearinterval(intervalid)によってクリアされるまで2秒ごとにメッセージを出力します。実際のアプリケーションでは、クロック、投票サーバーなどを更新するために使用できますが、最小遅延制限と機能実行時間の影響に注意を払い、メモリの漏れを避けるために不要になった時間の間隔をクリアします。特にコンポーネントのアンインストールまたはページの閉鎖の前に、それを確認してください

Nuxt 3組成APIについて説明しました Nuxt 3組成APIについて説明しました Sep 20, 2025 am 03:00 AM

NUXT3の構成APIコア使用量には次のものが含まれます。1。DefinePageMetaは、タイトル、レイアウト、ミドルウェアなどのページメタ情報を定義するために使用されます。 2。Useheadは、ページヘッダータグを管理し、靜的およびレスポンシブな更新をサポートし、SEO最適化を実現(xiàn)するためにDefinePageMetaと協(xié)力する必要があります。 3. useasyncdataは、非同期データを安全に取得し、負荷とエラーステータスを自動的に処理し、サーバーとクライアントのデータ収集制御をサポートします。 4. usefetchは、useasyncdataと$ fetchのカプセル化であり、リクエストキーを自動的にエンスして、リクエストを重複しないようにします

javascriptでの數(shù)字のフォーマット:tofixed()メソッドを使用して、固定小數(shù)點以下の場所を保持します javascriptでの數(shù)字のフォーマット:tofixed()メソッドを使用して、固定小數(shù)點以下の場所を保持します Sep 16, 2025 am 11:57 AM

このチュートリアルでは、JavaScriptに固定された2つの小數(shù)を持つ文字列に數(shù)値をフォーマットする方法を詳細に説明します。整數(shù)でさえ「#.00」の形で表示できます。 number.prototype.tofixed()メソッドの使用に焦點を當てます。これには、その構文、機能、サンプルコード、およびそのリターンタイプが常に文字列であるなどの重要なポイントが含まれます。

JavaScriptのクリップボードにテキストをコピーする方法は? JavaScriptのクリップボードにテキストをコピーする方法は? Sep 18, 2025 am 03:50 AM

ClipboardapiのWriteTextメソッドを使用してテキストをクリップボードにコピーします。セキュリティコンテキストとユーザーインタラクションで呼び出され、最新のブラウザーをサポートし、古いバージョンをExecCommandで格下げできます。

JavaScriptでマルチライン文字列を作成する方法は? JavaScriptでマルチライン文字列を作成する方法は? Sep 20, 2025 am 06:11 AM

thebestatatororeAteamulti-linestringinjavascriptsisingsisingSemplatalalswithbackticks、whitherverebreakenexactlyaswritten。

JavaScriptですぐに呼び出された関數(shù)式(IIFE)を作成して使用する方法 JavaScriptですぐに呼び出された関數(shù)式(IIFE)を作成して使用する方法 Sep 21, 2025 am 05:04 AM

Aniife(即座に侵入すること)は、runsassonasitiondedived、cureated createdAfctionAfunctionSaNdimeSaNdiElyIntyinvokingit、cureatedglobalnamespacepollution、およびcopeThecopethrughtosures; itiswritted(function(){/cod

See all articles