#javascript #reactjs #react-context #map-function
Вопрос:
Я занимаюсь электронной коммерцией с React и получаю сообщение об ошибке
Не удается прочитать свойства неопределенного (чтение «карты»)
Что не имеет смысла, потому что я сделал то же самое в другом компоненте, и это хорошо работает.
Вот мой код ниже с комментарием к функции map, которая не работает. Дайте мне знать, если что-то не ясно. Я проверил синтаксические ошибки, и все работает нормально
export class CartItem extends Component { constructor(props) { super(props); this.state={ product: {}, failedToLoad: false } } async componentWillMount(){ let data = await this.getProduct(this.props.product.itemId); // let product = data.data.product; // this.setState({product: product}); if (data.data.product) { this.setState({product: data.data.product}); } else { this.setState({failedToLoad: true}); } } async getProduct(id){ return await fetchTheQuery( `query getProduct($id: String!){ product(id: $id){ name prices{ currency amount } } }`, {id: id} ) } render() { const {addProduct, productsToPurchase} = this.props.cartContext const {selectedCurrency} = this.props.currencyContext console.log(this.state.product.prices) let productFetched = this.state.product if (this.state.failedToLoad){ return (lt;divgt;Something went wronglt;/divgt;) } else if (productFetched){ return( lt;divgt; lt;h2gt; {this.state.product.name} lt;/h2gt; lt;h5gt; {/*There is an error here*/} { this.state.product.prices.map( price =gt;{ if (price.currency == selectedCurrency){ return( lt;gt; { getSymbolFromCurrency(selectedCurrency) " " price.amount }lt;/gt; ) } } )} lt;/h5gt; lt;button onClick={() =gt; { addProduct(this.props.product.itemId, this.state.product.prices) }}gt; Add lt;/buttongt; lt;h4gt;{productsToPurchase[this.props.itemIndex].qty}lt;/h4gt; lt;hr/gt; lt;/divgt; ) } else { return lt;pgt;Loading............lt;/pgt; } } }
Комментарии:
1.
product: {}
В вашем начальном состоянии продукт является пустым объектом. Следовательноproduct.prices
, не определено. неопределенное не имеет никакой.map
функции. Либо измените начальное состояние, чтобы оно не было пустым объектом, либо измените свой код для проверки и работы с пустым объектом2. @NicholasTower, который уже переопределяется
{}
при получении данных. Для этого я использую конечную точку GraphQL. Выборка отлично работает с другими данными, такими какproduct.name
.3. Да, когда вы в конечном итоге загрузите данные,
product
они больше не будут пустым объектом. Проблема в первом рендере. При первом рендеринге у вас есть пустой объект.
Ответ №1:
Вам нужно проверить this.state.product.prices
, существует ли он в объекте. Вы получаете эту ошибку, так как коллекция пуста во время первого рендеринга.
{ this.state.product.prices amp;amp; this.state.product.prices.map( price =gt;{ if (price.currency == selectedCurrency){ return( lt;gt; { getSymbolFromCurrency(selectedCurrency) " " price.amount }. lt;/gt; ) } } )}
Комментарии:
1. Это сработало со мной. Но что же
this.state.product.prices amp;amp; this.state.product.prices.map
делать?2. Убедитесь, что ваша коллекция «цены» определена внутри «продукта», и вы не получите ошибку. У вашего объектного продукта нет действительного свойства «цены», определенного во время начальной визуализации.
3. Это условная нулевая/неопределенная проверка коллекции «this.state.product.prices». Он проверяет, является ли коллекция «цены» нулевой/неопределенной.
4. Это сработало, и мне пришлось удалить
console.log(this.state.product.prices)