'Uncaught TypeError: Cannot read properties of undefined (reading 'source') react v16
I'm trying to access data from commerceJS API fetched on a different module and passed down as a prop, the code only breaks when I call a nested product object with this error Uncaught TypeError: Cannot read properties of undefined (reading 'source').
Here is my code
//Product.jsx
import React from 'react';
import { Card, CardMedia, CardContent, CardActions, Typography, IconButton } from '@material-ui/core';
import { AddShoppingCart } from '@material-ui/icons';
import useStyles from './styles';
const Product = ({ product, onAddToCart }) => {
const classes = useStyles();
const handleAddToCart = () => onAddToCart(product.id, 1);
return (
<Card className={classes.root}>
<CardMedia
className={classes.media}
image={product.media.source}
component="img"
title={product.name}
/>
<CardContent>
<div className={classes.cardContent}>
<Typography gutterBottom variant="h5" component="h2">
{product.name}
</Typography>
<Typography gutterBottom variant="h5" component="h2">
${product.price.formatted}
</Typography>
</div>
<Typography
dangerouslySetInnerHTML={{ __html: product.description }}
variant="body2"
color="textSecondary"
component="p"
/>
</CardContent>
<CardActions disableSpacing className={classes.cardActions}>
<IconButton aria-label="Add to Cart" onClick={handleAddToCart}>
<AddShoppingCart />
</IconButton>
</CardActions>
</Card>
);
};
export default Product;
Solution 1:[1]
import React from 'react';
import { Card, CardMedia, CardContent, CardActions, Typography, IconButton } from '@material-ui/core';
import { AddShoppingCart } from '@material-ui/icons';
import useStyles from './styles';
const Product = ({ product, onAddToCart }) => {
const classes = useStyles();
const handleAddToCart = () => onAddToCart(product.id, 1);
return (
<Card className={classes.root}>
<CardMedia
className={classes.media}
image={product.media.source}
component="img"
title={product.name}
/>
<CardContent>
<div className={classes.cardContent}>
<Typography gutterBottom variant="h5" component="h2">
{product?.name}
</Typography>
<Typography gutterBottom variant="h5" component="h2">
${product?.price?.formatted}
</Typography>
</div>
<Typography
dangerouslySetInnerHTML={{ __html: product.description }}
variant="body2"
color="textSecondary"
component="p"
/>
</CardContent>
<CardActions disableSpacing className={classes.cardActions}>
<IconButton aria-label="Add to Cart" onClick={handleAddToCart}>
<AddShoppingCart />
</IconButton>
</CardActions>
</Card>
);
};
export default Product;
Solution 2:[2]
try this code:
import React from 'react';
import { Card, CardMedia, CardContent, CardActions, Typography, IconButton } from '@material-ui/core';
import { AddShoppingCart } from '@material-ui/icons';
import useStyles from './styles';
const Product = ({ product, onAddToCart }) => {
const classes = useStyles();
const handleAddToCart = () => onAddToCart(product.id, 1);
return (
<Card className={classes.root}>
<CardMedia
className={classes.media}
image={product?.media?.source}
component="img"
title={product?.name}
/>
<CardContent>
<div className={classes.cardContent}>
<Typography gutterBottom variant="h5" component="h2">
{product?.name}
</Typography>
<Typography gutterBottom variant="h5" component="h2">
${product?.price?.formatted}
</Typography>
</div>
<Typography
dangerouslySetInnerHTML={{ __html: product?.description }}
variant="body2"
color="textSecondary"
component="p"
/>
</CardContent>
<CardActions disableSpacing className={classes.cardActions}>
<IconButton aria-label="Add to Cart" onClick={handleAddToCart}>
<AddShoppingCart />
</IconButton>
</CardActions>
</Card>
);
};
export default Product;
Solution 3:[3]
It'll display the image if I delete the className property and access to my object key
Code here:
<CardMedia
className={classes.media}
image={product.image.url}
component="img"
title={product?.name}
/>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | mahdi ashori |
| Solution 2 | Hiba Youssef |
| Solution 3 | Caroline Daniella |
