React.js: onChange ハンドラーで複数の入力要素を処理する高度なテクニック
React.js: 同一の onChange ハンドラーで複数の入力要素を識別する
この問題を解決するために、以下の2つの方法があります。
event.target
プロパティは、イベントが発生した要素を参照します。このプロパティを使用して、どの要素からの変更なのかを特定することができます。
const handleChange = (event) => {
const value = event.target.value;
const name = event.target.name;
console.log(`Value: ${value}, Name: ${name}`);
};
<input type="text" name="firstName" onChange={handleChange} />
<input type="text" name="lastName" onChange={handleChange} />
この例では、handleChange
関数は、イベントが発生した要素の value
と name
プロパティを出力します。
カスタムフックを使用して、onChange
ハンドラーのロジックを再利用することができます。カスタムフックでは、useState
フックを使用して、入力要素の値を保持することができます。
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue);
const handleChange = (event) => {
setValue(event.target.value);
};
return { value, handleChange };
};
const FirstNameInput = () => {
const { value, handleChange } = useInput('');
return (
<input type="text" name="firstName" value={value} onChange={handleChange} />
);
};
const LastNameInput = () => {
const { value, handleChange } = useInput('');
return (
<input type="text" name="lastName" value={value} onChange={handleChange} />
);
};
この例では、useInput
カスタムフックは、入力要素の値と onChange
ハンドラーを返します。FirstNameInput
と LastNameInput
コンポーネントは、useInput
フックを使用して、それぞれ firstName
と lastName
の値を保持します。
どちらの方法を使用するかは、状況によって異なります。シンプルなケースであれば、event.target
プロパティを使用するのが良いでしょう。複雑なケースや、onChange
ハンドラーのロジックを再利用したい場合は、カスタムフックを使用するのが良いでしょう。
補足
event.target.type
プロパティを使用して、イベントが発生した要素の種類を確認することができます。event.preventDefault()
メソッドを使用して、イベントのデフォルト動作をキャンセルすることができます。
event.target プロパティを使用する
import React from 'react';
const App = () => {
const handleChange = (event) => {
const value = event.target.value;
const name = event.target.name;
console.log(`Value: ${value}, Name: ${name}`);
};
return (
<div>
<input type="text" name="firstName" onChange={handleChange} />
<input type="text" name="lastName" onChange={handleChange} />
</div>
);
};
export default App;
カスタムフックを使用する
import React, { useState } from 'react';
const useInput = (initialValue) => {
const [value, setValue] = useState(initialValue);
const handleChange = (event) => {
setValue(event.target.value);
};
return { value, handleChange };
};
const App = () => {
const { value: firstName, handleChange: handleFirstNameChange } = useInput('');
const { value: lastName, handleChange: handleLastNameChange } = useInput('');
return (
<div>
<input type="text" name="firstName" value={firstName} onChange={handleFirstNameChange} />
<input type="text" name="lastName" value={lastName} onChange={handleLastNameChange} />
</div>
);
};
export default App;
説明
event.target プロパティを使用する
<input type="text" name="firstName" onChange={handleChange} />
と <input type="text" name="lastName" onChange={handleChange} />
の行では、onChange
プロパティに handleChange
関数を渡しています。これにより、それぞれの入力要素からの変更イベントが handleChange
関数に送られます。
カスタムフックを使用する
この例では、useInput
カスタムフックを定義しています。このフックは、入力要素の値と onChange
ハンドラーを返します。
App
コンポーネントでは、useInput
フックを使用して、firstName
と lastName
の値を保持するステート変数を作成しています。
<input type="text" name="firstName" value={firstName} onChange={handleFirstNameChange} />
と <input type="text" name="lastName" value={lastName} onChange={handleLastNameChange} />
の行では、それぞれの入力要素の value
プロパティと onChange
プロパティに、useInput
フックから返されたステート変数とハンドラーを渡しています。
このサンプルコードは、あくまでも基本的な例です。実際のアプリケーションでは、状況に応じてコードをカスタマイズする必要があります。
例えば、入力要素のバリデーションや、フォームデータをサーバーに送信する機能などを追加することができます。
React.js: 同一の onChange ハンドラーで複数の入力要素を識別する方法
この問題を解決するための方法はいくつかありますが、以下は特に役立つ方法です。
const handleChange = (event) => {
const value = event.target.value;
const id = event.target.id;
console.log(`Value: ${value}, ID: ${id}`);
};
<input type="text" id="firstName" onChange={handleChange} />
<input type="text" id="lastName" onChange={handleChange} />
data-*
属性は、カスタムデータ属性を作成するために使用することができます。各入力要素にユニークな data-*
属性を割り当てることで、どの要素からの変更なのかを特定することができます。
const handleChange = (event) => {
const value = event.target.value;
const dataAttribute = event.target.dataset.name;
console.log(`Value: ${value}, Data Attribute: ${dataAttribute}`);
};
<input type="text" data-name="firstName" onChange={handleChange} />
<input type="text" data-name="lastName" onChange={handleChange} />
const useInput = (initialValue, id) => {
const [value, setValue] = useState(initialValue);
const handleChange = (event) => {
setValue(event.target.value);
};
return { value, handleChange, id };
};
const FirstNameInput = () => {
const { value, handleChange, id } = useInput('', 'firstName');
return (
<input type="text" id={id} value={value} onChange={handleChange} />
);
};
const LastNameInput = () => {
const { value, handleChange, id } = useInput('', 'lastName');
return (
<input type="text" id={id} value={value} onChange={handleChange} />
);
};
React Context API を使用して、入力要素の値をコンポーネント間で共有することができます。
const InputContext = React.createContext();
const InputProvider = ({ children }) => {
const [firstName, setFirstName] = useState('');
const [lastName, setLastName] = useState('');
const handleChange = (event) => {
const { name, value } = event.target;
if (name === 'firstName') {
setFirstName(value);
} else if (name === 'lastName') {
setLastName(value);
}
};
return (
<InputContext.Provider value={{ firstName, lastName, handleChange }}>
{children}
</InputContext.Provider>
);
};
const FirstNameInput = () => {
const { firstName, handleChange } = useContext(InputContext);
return (
<input type="text" name="firstName" value={firstName} onChange={handleChange} />
);
};
const LastNameInput = () => {
const { lastName, handleChange } = useContext(InputContext);
return (
<input type="text" name="lastName" value={lastName} onChange={handleChange} />
);
};
フォームライブラリを使用する
Formik
や React Hook Form
などのフォームライブラリを使用すると、入力要素の値の管理やバリデーションを簡単にに行うことができます。
これらのライブラリは、onChange
ハンドラーのロジックを自動的に処理するため、どの要素からの変更なのかを特定する必要はありません。
javascript reactjs jsx