React × Viteで画像ファイルを動的にimportする
以下の要件
reactコンポーネントで大量の画像のうち条件によってimportする画像を動的に切り替えたい
事前に全部の画像ファイルを一つずつimportするのが煩わしい
NG例
code:jsx
<img
src={/src/assets/images/${fileName}.png}
/>
srcにパスを直接渡す方法
これだとlocalでは表示ができるが、本番(ビルド時)ではViteが画像のパスを解決できない
下記を追加する
code:jsx
import.meta.glob('./assets/images/point/**/*.png')
ディレクトリを指定して一括importしておく
これでもダメだった
成功パターン
code:js
function getImageUrl(name) {
return new URL(./dir/${name}.png, import.meta.url)
}
公式では.hrefがついているが、つけるとhttp:形式ではなくfile:形式のパスになってしまいうまく読み込めなかった
最終的には以下の形になった
code:js
export const getImage = (path: string): string => {
const urlObj = new URL(../assets/images/${path}, import.meta.url);
return urlObj.href;
};
export const setImageSrc = (elementId: string, path: string) => {
const imageSrc = getImage(path);
const image = document.getElementById(elementId) as HTMLImageElement;
if (!image) return;
if (image.tagName === 'IMG') {
image.src = imageSrc;
} else {
image.srcset = imageSrc;
}
};
code:jsx
useEffect(() => {
setImageSrc("img-element-id", xxx/${iconSrc}.png);
}, []);
img要素のIDと画像のパスを渡して、後からsrcプロパティにセットするとうまくいった