Skip to main content

イントロダクション

ホットキーをリッスンする必要がある場合、通常は onKeyDown イベントリスナーを使用します。 しかし、twenty-front では、同時にマウントされている異なるコンポーネントで使用される同じホットキーの間で競合が生じることがあります。 例えば、Enterキーをリッスンするページと、Enterキーをリッスンするモーダル、さらにそのモーダル内のSelectコンポーネントもEnterキーをリッスンしている場合、全てが同時にマウントされると競合が生じる可能性があります。

useScopedHotkeys フック

この問題を解決するために、どのような競合もなくホットキーをリッスンすることを可能にするカスタムフックがあります。 コンポーネント内に配置すると、コンポーネントがマウントされ、指定されたホットキースコープがアクティブなときだけホットキーをリッスンします。

実際にホットキーをリッスンする方法は?

ホットキーをリッスンするための設定には2つのステップがあります:
  1. ホットキーをリッスンするホットキースコープを設定します
  2. ホットキーをリッスンするために useScopedHotkeys フックを使用します
他のUI要素(例:左側のメニューやコマンドメニュー)もホットキーをリッスンする可能性があるため、ホットキースコープの設定は単純なページでも必要です。

ホットキーのユースケース

一般的に、ホットキーが必要となる動作は2つあります:
  1. ページにマウントされたコンポーネントで
  2. ユーザーのアクションでフォーカスをとるモーダルタイプのコンポーネントで
2番目のユースケースは再帰的に発生します:例えばモーダル内のドロップダウン。

ページ内でホットキーをリッスン

例:

モーダルタイプのコンポーネントでホットキーをリッスン

この例では、親にモーダルを閉じるように指示するためにEscapeキーをリッスンするモーダルコンポーネントを使用します。 ここで、ユーザーの操作がスコープを変更します。
その後、モーダルコンポーネント内で:
mount/unmount で useEffect を使うだけで、競合を避けるのに十分なことがわからない場合は、このパターンを使用することが重要です。 これらの競合はデバッグが難しく、useEffectsを使わないよりも頻繁に発生する可能性があります。

ホットキースコープとは?

ホットキースコープは、ホットキーがアクティブなコンテキストを表す文字列です。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。 ホットキースコープを変更すると、このスコープをリッスンしているホットキーが有効になり、他のスコープをリッスンしているホットキーが無効になります。 一度に1つのスコープしか設定できません。 例として、各ページのホットキースコープはPageHotkeyScope enumで定義されています:
内部的には、現在選択されているスコープはアプリケーション全体で共有されるJotai atomに格納されています:
しかし、このatomは手動で扱ってはいけません! 次のセクションでその使用方法を見ていきます。

内部的にはどう機能しているのか?

react-hotkeys-hookの上に薄いラッパーを作成し、より効率的にし、不必要な再レンダリングを避けます。 また、ホットキーのスコープの状態を処理し、アプリケーション全体で利用できるようにするためのJotai atomも作成します。