"Неопределенная" проблема при получении данных от API

Я совершенствуюсь в reactjs. Я пытаюсь создать сайт электронной коммерции. Я использую Mock Api в качестве сервиса. Я могу перечислить свои данные в ProductList.js. но я не могу вызвать те же данные в ProductDetails.js. Я получаю "неопределенную" ошибку.

const ProductDetail = (props) => {
    const { buttonLabel, className } = props;
    const { name, description, price,id } = props;
    const axios = require('axios');

    const [modal, setModal] = useState(false);

    const toggle = () => setModal(!modal);
    const [dress, setDress] = useState([]);
    useEffect(() => {
        axios
            .get(`https://5fd9d76f6cf2e7001737ead3.mockapi.io/api/v1/dress`)
            .then(function (response) {
                setDress(response.data);
            })
            .catch(function (error) {
                console.info(error);
            });
    }, []);
    const data = dress.map(item => {
        return {    
            name: item.name,
            description: item.description,
            price:item.price,
            id: item.id       
        }
    })
        return (
            <div >
                <ProductDetailButton onClick = {toggle}>Detay{buttonLabel}</ProductDetailButton>
                <Modal isOpen = {modal} toggle = {toggle} key = {`${data.id}`} className = {className}>
                    <ModalHeader toggle = {toggle}>{`${data.name}`}</ModalHeader>
                    <ModalBody >
                    {`${data.price}`}
                    </ModalBody>
                    <ModalBody>
                    {`${data.description}`}
                    </ModalBody>
                    <ModalFooter>
                        <Button color = "secondary" onClick = {toggle}>
                            Kapat
                        </Button>
                    </ModalFooter>
                </Modal>
            </div>
        );

Модальный отображается как вывод. Вместо данных написано "не определено". Как это исправить?

🤔 А знаете ли вы, что...
JavaScript активно развивается, и новые версии языка регулярно включают новые функции и улучшения.


422
2

Ответы:

Решено

Ваш API возвращает массив объектов, поэтому, если у вас есть ProductList, вам не следует выполнять вызов API в сведениях о продукте. Вы должны передавать предметы в качестве реквизита.

Пример.

const ProductList = () => {
       const [showProduct, setShowProduct] = useState(null)
 ..... api call and data...

return (
    <React.Fragment>
          {data?.map(item => <div>{item.name} <button onClick = {() => setShowProduct(item)}> Show Item </button> </div> }

        { !!showProduct && <ProductDetails item = {showProduct} onClose = {() => setShowProduct(null) /> } //this will open up your modal

    </React.Fragment>
)

}

то в деталях вашего продукта это должно быть что-то вроде.

const ProductDetails = ({ item, onClose }) => {
//your item details accessible here via props

    return <Modal> <ModalBody> {item.name} </ModalBody><ModalFooter><Button onClick = {onClose}>Close</ModalFooter></Modal>

}

Посмотрев на ваш код, значение const data будет изменено. Но повторного рендеринга не произойдет, так как он не находится в состоянии. Другая проблема заключается в том, что data — это массив (карта возвращает массив). Чтобы вызвать как {data.name} данные должны быть объектом.

Поместите data в состояние

useState(()=> {

    const data = Array.isArray(dress) && dress.map(item => {
        return {    
            name: item.name,
            description: item.description,
            price:item.price,
            id: item.id       
        }
    }
// set the state
setData(data);

}, [dress]);