問題と原因
React,Reduxで個人開発をしていると、以下のエラーに遭遇。
Warning: Failed prop type: Material-UI: Either `children`, `image`, `src` or `component` prop must be specified.
上記のpropには必ず値を割り当ててください、と言われている。
エラーの出力されるコンポーネントの一部分のコードを以下に示す。
const [imageUrl, setImageUrl] = useState(undefined);
useEffect(() => {
storage
.ref(props.imagePath)
.getDownloadURL()
.then((url) => {
setImageUrl(url)
})
.catch((e) => console.log('Errors while storage connecting => ', e));
}, [])
<Card className={classes.root}>
{/* Header */}
<CardHeader
title={props.subject}
/>
{/* image */}
<CardMedia
className={classes.media}
image={imageUrl}
title={props.subject}
/>
原因はCardMediaのimage属性が割り当てていなかったからであった。
何故割り当てられなかったかと言うと、image属性の値であるimageUrlは非同期処理により得られる値であり、非同期処理が終了する前に1度コンポーネントが読まれることで未定義のimageUrlがimageに表示されようとするからである。
課題と修正方法
上記より、imageUrlが未定義の時はimage属性で読まれないようにすればいい。
下記を参照した↓
修正したソースコード
const [imageUrl, setImageUrl] = useState(undefined);
useEffect(() => {
storage
.ref(props.imagePath)
.getDownloadURL()
.then((url) => {
setImageUrl(url)
})
.catch((e) => console.log('Errors while storage connecting => ', e));
}, [])
<Card className={classes.root}>
{/* Header */}
<CardHeader
title={props.subject}
/>
{/* image */}
{imageUrl ? (
<CardMedia
className={classes.media}
image={imageUrl}
title={props.subject}
/>
) : (<></>)
}
三項演算子を使用し、
- imageUrlに値が入っている時はCardMediaを読み込む
- 値が入っていない時は空のタグを読み込む
とすることでエラーを回避することができた。
おわり
コメント