仕事で「アイコンを変更する」機能を実装した際に使用した手法をまとめておきます。
【HTML】
<div className="icon" onClick={onClick}>
<img src="" alt="" id="preview"/>
</div>
【TypeScript】
const onClick = React.useCallback(() => {
// インプットを作成
const input = document.createElement('input');
input.type = 'file';
input.type = 'image/*'
// 画像を選択した際の処理
input.addEventListener('change', () => {
const files = input?.files;
if (files) {
for (const file of files) {
previewFile(file)
}
}
})
// 最後にinputをクリックしてあげる
input.click();
}, []);
const previewFile = (file: File) => {
// プレビュー画像を追加する要素を取得
const preview = document.getElementById('preview') as HTMLImageElement;
// TypeScriptはasでどのエレメントか指定してあげる必要がある
const reader = new FileReader();
reader.onload = function (e) { // URLとして読み込まれた際の処理
const imageUrl = e.target.result; // URLはevent.target.resultで呼び出せる
preview.src = imageUrl as string; // エレメントのsrcに直接urlを入れる
}
// ファイルをURLとして読み込む
reader.readAsDataURL(file);
};
参考:https://code-kitchen.dev/html/input-file/