ReactでEscキー押下を検知し、処理する方法(日本語)
Reactにおいて、ユーザーがキーボードのEscキーを押したことを検知し、それに応じた処理を行う方法はいくつかあります。以下に、その方法を解説します。
useEffectフックを利用する
useEffect
フックは、コンポーネントのレンダリング後に副作用を実行するためのものです。これを利用して、キーイベントリスナーを登録し、Escキーが押されたときに処理を実行することができます。
import { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === 'Escape') {
// Escキーが押されたときの処理
console.log('Esc key pressed!');
}
};
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, []);
return (
// コンポーネントのJSX
);
}
useEffect
フックの依存配列を空の配列に設定することで、コンポーネントが最初にマウントされたときだけリスナーを登録し、解除します。handleKeyDown
関数では、押されたキーがEscキーであるかどうかをチェックし、条件を満たす場合に処理を実行します。useEffect
フックの中で、キーイベントリスナーを登録する関数を定義します。
useKeyカスタムフックを作成する
キーイベントの処理を汎用的に行うために、useKey
というカスタムフックを作成することもできます。
import { useState, useEffect } from 'react';
function useKey(key, callback) {
const [pressed, setPressed] = useState(false);
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === key) {
setPressed(true);
callback();
}
};
const handleKeyUp = (event) => {
if (event.key === key) {
setPressed(false);
}
};
document.addEventListener('keydown', handleKeyDown);
document.addEventListener('keyup', handleKeyUp);
return () => {
document.remove EventListener('keydown', handleKeyDown);
document.removeEventListener('keyup', handleKey Up);
};
}, [key, callback]);
return pressed;
}
- コンポーネントで使用する場合、
useKey
フックを呼び出し、コールバック関数にEscキーが押されたときの処理を指定します。 useKey
フックは、指定したキーが押されたかどうかを状態管理し、コールバック関数を呼び出します。
import { useKey } from './useKey';
function MyComponent() {
const isEscPressed = useKey('Escape', () => {
console.log('Esc key pressed!');
});
return (
// コンポーネントのJSX
);
}
ライブラリを利用する
Reactのキーイベントを扱うためのライブラリを利用することもできます。例えば、react-keybind
やreact-hotkeys
は、キーイベントの検知と処理を簡素化するための機能を提供します。
import { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === 'Escape') {
// Escキーが押されたときの処理
console.log('Esc key pressed!');
}
};
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, []);
return (
// コンポーネントのJSX
);
}
import { useState, useEffect } from 'react';
function useKey(key, callback) {
const [pressed, setPressed] = useState(false);
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === key) {
setPressed(true);
callback();
}
};
const handleKeyUp = (event) => {
if (event.key === key) {
setPressed(false);
}
};
document.addEventListener('keydown', handleKeyDown);
document.addEventListener('keyup', handleKeyUp);
return () => {
document.remove EventListener('keydown', handleKeyDown);
document.removeEventListener('keyup', handleKey Up);
};
}, [key, callback]);
return pressed;
}
import { useKey } from './useKey';
function MyComponent() {
const isEscPressed = useKey('Escape', () => {
console.log('Esc key pressed!');
});
return (
// コンポーネントのJSX
);
}
import { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === 'Escape') {
// Escキーが押されたときの処理
console.log('Esc key pressed!');
}
};
document.addEventListener('keydown', handleKeyDown);
return () => {
document.removeEventListener('keydown', handleKeyDown);
};
}, []);
return (
// コンポーネントのJSX
);
}
import { useState, useEffect } from 'react';
function useKey(key, callback) {
const [pressed, setPressed] = useState(false);
useEffect(() => {
const handleKeyDown = (event) => {
if (event.key === key) {
setPressed(true);
callback();
}
};
const handleKeyUp = (event) => {
if (event.key === key) {
setPressed(false);
}
};
document.addEventListener('keydown', handleKeyDown);
document.addEventListener('keyup', handleKeyUp);
return () => {
document.remove EventListener('keydown', handleKeyDown);
document.removeEventListener('keyup', handleKey Up);
};
}, [key, callback]);
return pressed;
}
import { useKey } from './useKey';
function MyComponent() {
const isEscPressed = useKey('Escape', () => {
console.log('Esc key pressed!');
});
return (
// コンポーネントのJSX
);
}
javascript reactjs