Я новичок в React.js, я создаю новое приложение, используя реагирующие хуки, я получаю данные из API и устанавливаю их состояние с помощью setProductTypes(), а затем, когда я читаю это значение productTypes.length, он не показывает значения (наблюдал это из отладчика), я отображаю данные на основе этого, и он показывает данные.
import React, { useState, useEffect } from "react";
import ProductTypeDataService from "../../services/ProductTypeService";
import Card from 'react-bootstrap/Card'
import { CardGroup } from "react-bootstrap";
const ProductTypeList = () => {
const [productTypes, setProductTypes] = useState([]);
const [nestedArray, setNestedArray]= useState([]);
useEffect(() => {
debugger ;
retrieveTutorials();
},[]);
const retrieveTutorials = () => {
ProductTypeDataService.getAll()
.then(response => {
setProductTypes(response.data);
createNestedArray();;
})
.catch(e => {
console.info(e);
});
};
const createNestedArray= ()=>{
var arr = new Array([]);
var arrayLength = productTypes.length;
for (var i = 0; i < arrayLength; i+4) {
for (var k = 0; k < 4; k++) {
arr[i,k] =productTypes[i+k];
}
}
setNestedArray(arr);
console.info(nestedArray);
};
return (
<div className = "col-md-6">
<h4>Product Type List</h4>
<CardGroup>
{productTypes &&
productTypes.map((productType, index) => (
<Card>
<Card.Body>
<Card.Img variant = "top" src = {productType.imageUrl} />
</Card.Body>
<Card.Footer>
<small className = "text-muted">{productType.name}</small>
</Card.Footer>
</Card>
))}
</CardGroup>
</div>
)
}
export default ProductTypeList
🤔 А знаете ли вы, что...
React поддерживает серверный рендеринг (SSR) для улучшения SEO и производительности.
Состояние обновляется асинхронно.
Вы должны либо передать productTypes
, полученный от ответа на вызов API, в качестве параметра createNestedArray(response.data)
, либо переместить createdNestedArray
внутрь useEffect
.
useEffect(() => {
// function will be called when productTypes changes
createNestedArray()
}, [productTypes])
Это не сработает, потому что productTypes еще не доступны. Если вам нужно вызвать функцию createNestedArray там, вы должны переместить вызов createNestedArray в setTimeout, если нет, вы должны вызвать функцию createNestedArray из функции retrieveTutorials.
Լвзгляните на этот пример:
useEffect(() => {
if (productTypes !== undefined || productTypes.length != 0) {
createNestedArray();
}
}, [productTypes])