@JekaHC

Как достать данные из файла JSON в React?

Есть файл JSON.
Есть компоненты React.
Ссылка на весь репозиторий.

На данный момент в файле Main.jsx пытаюсь вытянуть данный из JSON файла "products.json" и провести с ними дальнейшие манипуляции (Product.jsx; Products.jsx).

В конечном результате получаю "Nothing found" (условие в Products.jsx).

Вопрос - в чём заключается проблема, почему не получается отобразить данные?

Main.jsx
import React from "react"
import { Products } from '../Products'

class Main extends React.Component {

        


    state = {
        products: [],
    }


    componentDidMount() {
        fetch('./products.json' )
            .then((responce) => responce.json())
            .then((data) => this.setState({products:data}))
    }



    render() {
        const {products} = this.state;



        return (
            <main className="container content" >
                <Products products={products} />       
            </main>
        );
    }






}
   

export {Main}

Product.jsx
function Product (props) {

    const {
        prod_id: id,
        prod_name : title,
        prod_status: status,
        prod_price: price,
        prod_oldprice : oldPrice
    } = props;

    return <div className="product_item">
    <img className="product_img" src="" alt="" />
    <h3 className="product_title">{title}</h3>
    <hr />
    <div className="product_price">{price}</div>
    <div className="product_old_price">{oldPrice}</div>
    <div className="id">{id}</div>
    <div className="status">{status}</div>
    </div>

}

export {Product}

Products.jsx
import {Product} from './Product';

function Products (props) {

    const {products = []} = props;

    return (
    
    <div className="products">
        {products.length ? (
        products.map((product) => <Product key={product.prod_id} {...product} />)
        ) : (
            <h4>Nothing found</h4>
        )}
    </div>
    );

}

export {Products}
  • Вопрос задан
  • 2584 просмотра
Решения вопроса 1
@HealSpirit
import React from "react";
import { Products } from "../Products";

class Main extends React.Component {
  state = {
    products: [],
  };

  componentDidMount() {
    fetch("./products.json")
      .then((responce) => responce.json())
      .then((data) => this.setState({ products: Object.values(data) }));
  }

  render() {
    const { products } = this.state;

    return (
      <main className="container content">
        <Products products={products} />
      </main>
    );
  }
}

export { Main };

Странный json, если честно. Обычно, такие вещи хранятся в массиве у какого-то поля в JSON.
Надо бы еще убрать элемент массива 200, который получился после преобразования "response_code": 200 -> 200,
убрать 2 предупреждения в консоли:
1) немного поменялась инициализация приложения после перехода на 18 версию реакта
2) если распечатываешь компоненты из массива, нужно каждому элементу добавить атрибут/свойство key. Использовать надо какое-то уникальное значение (например, id). Если его нет, на крайняк использовать index текущей итерации
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы