ここでは、次のようにプロパティ(属性)でハンドラメソッドを設定可能な React コンポーネントの実装例を示します。
<MyButton onClick={handleClick} />ハンドラメソッドを設定可能なコンポーネントを実装する
次の MyButton コンポーネントは、ボタンクリック時に呼び出されるイベントハンドラを、onClick プロパティで設定できるようにしています。
この MyButton コンポーネントは、クリックするたびに内部のカウンタ (state.count) を +1 し、その値を指定されたイベントハンドラへ通知します。
import * as React from 'react';
// MyButton のプロパティ(属性)の型
export interface MyButtonProps {
onClick?: (count: number) => void;
}
// MyButton の状態(ステート)の型
interface MyButtonState {
count: number;
}
// MyButton コンポーネント
export class MyButton extends React.Component<MyButtonProps, MyButtonState> {
constructor(props: MyButtonProps) {
super(props);
this.state = {count: 0};
}
public render(): React.ReactNode {
const {count} = this.state;
return <div>
<button onClick={this.handleClick}>MyButton {count}</button>
</div>;
}
private handleClick = () => {
// カウンタを +1 して再描画
const newCount = this.state.count + 1;
this.setState({count: newCount});
// onClick 属性でハンドラが指定されていたら呼び出す
this.props.onClick?.(newCount);
}
}MyButton のプロパティの型を定義しているのは次の部分です。
onClick? とプロパティ名の末尾に ? を付けることで、属性の指定をオプショナルにしています。
export interface MyButtonProps {
onClick?: (count: number) => void;
}属性として設定されたハンドラメソッドは、コンポーネント内の handleClick() メソッドの中で呼び出しています。
private handleClick = () => {
// カウンタを +1 して再描画
const newCount = this.state.count + 1;
this.setState({count: newCount});
// onClick 属性でハンドラが指定されていたら呼び出す
this.props.onClick?.(newCount);
}ハンドラメソッドの指定はオプショナルなので、演算子 ?. を使って、ハンドラメソッドが指定されている場合のみ呼び出しています。
MyButton の使用例

下記は、上記で作成した MyButton の使用例です。
ボタンをクリックすると、onClick 属性で指定したハンドラメソッドが呼び出されます。
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import {MyButton} from './components/myButton';
const handleClick = (count: number) => {
alert(`新しい値は ${count} です`);
};
ReactDOM.render(
<MyButton onClick={handleClick} />,
document.getElementById('root')
);