📚
三項演算子でデータが取得できているかいないかで表示を分ける
strictモードで詰まってたおはなし
今回の開発は、フロントをReact(Next.js)、バックをLaravel(API)で作成しています
const { user } = useAuth({ middleware: 'auth' })
この関数はログインしている人の情報を取得し、userという変数に格納しているコードです
取得したデータは以下のようになっています
id: 2
name: "三宅 陽子"
email: "minoru03@example.com"
email_verified_at: "2023-03-12T03:45:44.000000Z"
post_code: "2918038"
address: " 岩手県大垣市西区加藤町中島8-8-6 ハイツ加納102号"
icon_path: "/storage/icon_images/108ccf0c-e8e0-3b91-a2e8-00bc08b2d1ec.png"
created_at: "2023-03-12T03:45:45.000000Z"
updated_at: "2023-03-12T03:45:45.000000Z"
この取得したデータを使用して、imgタグのsrc属性にuser.icon_pathを指定しようとしたところ
次のエラーが発生しました
TypeError: Cannot read properties of undefined (reading 'icon_path')
imgタグには取得してきたデータを使用するために、下記のようにsrcを指定していました
<img
src={`${process.env.NEXT_PUBLIC_BACKEND_URL}${user.icon_path}`}
alt='icon'>
process.env.NEXT_PUBLIC_BACKEND_URL は バックのUrlが入っています(envで指定)
データがとれていない?!!?!??!??!?
確認でconsole.log(user)をしてみると、、、
1回しかconsole.logしていないのに2回動いてる...
しかも1回目がundefined...
ここでstrictモードで2回走ることを思い出しました
そして1回目でデータを取得できていないにも関わらずuser.icon_pathを使用していたため、
undefinedとなりエラーを吐いていました
解決方法
<img
src={user?.icon_path ? `${process.env.NEXT_PUBLIC_BACKEND_URL}${user.icon_path}` : 'icon.png'}
alt="icon"
user?.icon_pathが存在する場合には、
上記のようにすることで、データを取得できていないときはデフォルトの画像を
取得できているときはその画像を表示することができました
Discussion