React不渲染JSON。

huangapple go评论145阅读模式
英文:

React not rendering JSON

问题

I have the following codes that was supposed to render data from a json file. It doesn't display me anything, except the h1 with the curly braces, instead of the data wanted. here is the code:

import prod from "../../data/produtos.json";

export default function Produto(props) {
  return (
    <figure>
      <img src={prod.imagem}></img>
      <figcaption>{prod.titulo}</figcaption>
      <p>{prod.preco}</p>
      <button className="btn"> Adicionar ao carrinho </button>
    </figure>
  );
}
import "./Produtos.css"
import productions from "../data/produtos.json";
import Produto from "./Produto";
import { useState } from "react";

export default function Produtos(props) {
  const [lista, setLista] = useState(productions);
  return (
    <div className="produtos">
      {lista.map((product) => (
        <div className="Products">
          <Produto id={product.id} {...product} />
        </div>
      ))}
    </div>
  );
}
[
  {
    "id": 1,
    "titulo": "",
    "preco": 16.9,
    "imagem": "../public/imagens/pwero.jpg"
  },
  {
    "id": 2,
    "titulo": "",
    "preco": 26.89,
    "imagem": "../public/imagens/oepw.jpg"
  },
  {
    "id": 3,
    "titulo": "",
    "preco": 17.4,
    "imagem": "../public/imagens/ewer.jpg"
  },
  {
    "id": 4,
    "titulo": "",
    "preco": 2.2,
    "imagem": "/////w"
  },
  {
    "id": 5,
    "titulo": "",
    "preco": 49.99,
    "imagem": ""
  },
  {
    "id": 6,
    "titulo": "",
    "preco": 5.99,
    "imagem": "zzzzys"
  }
]
英文:

I have the following codes that was supposed to render data from a json file. It doesn't display me anything, except the h1 with the curly braces, instead of the data wanted. here is the code:

import prod from &quot;../../data/produtos.json&quot;;

export default function Produto(props) {
  return (
    &lt;figure&gt;
      &lt;img src={prod.imagem}&gt;&lt;/img&gt;
      &lt;figcaption&gt;(prod.titulo)&lt;/figcaption&gt;
      &lt;p&gt;(prod.preco)&lt;/p&gt;
      &lt;button className=&quot;btn&quot;&gt; Adicionar ao carrinho &lt;/button&gt;
    &lt;/figure&gt;
  );
}
import &quot;./Produtos.css&quot;
import productions from &quot;../data/produtos.json&quot;;
import Produto from &quot;./Produto&quot;;
import { useState } from &quot;react&quot;;

export default function Produtos(props) {
  const [lista, setLista] = useState(productions);
  return (
    &lt;div className=&quot;produtos&quot;&gt;
      {lista.map((product) =&gt; (
        &lt;div className=&quot;Products&quot;&gt;
          &lt;Produto id={product.id} {...product} /&gt;
        &lt;/div&gt;
      ))}
    &lt;/div&gt;
  );
}
[
  {
    &quot;id&quot;: 1,
    &quot;titulo&quot;: &quot;&quot;,
    &quot;preco&quot;: 16.9,
    &quot;imagem&quot;: &quot;../public/imagens/pwero.jpg&quot;
  },
  {
    &quot;id&quot;: 2,
    &quot;titulo&quot;: &quot;&quot;,
    &quot;preco&quot;: 26.89,
    &quot;imagem&quot;: &quot;../public/imagens/oepw.jpg&quot;
  },
  {
    &quot;id&quot;: 3,
    &quot;titulo&quot;: &quot;&quot;,
    &quot;preco&quot;: 17.4,
    &quot;imagem&quot;: &quot;../public/imagens/ewer.jpg&quot;
  },
  {
    &quot;id&quot;: 4,
    &quot;titulo&quot;: &quot;&quot;,
    &quot;preco&quot;: 2.2,
    &quot;imagem&quot;: &quot;/////w&quot;
  },
  {
    &quot;id&quot;: 5,
    &quot;titulo&quot;: &quot;&quot;,
    &quot;preco&quot;: 49.99,
    &quot;imagem&quot;: &quot;&quot;
  },
  {
    &quot;id&quot;: 6,
    &quot;titulo&quot;: &quot;&quot;,
    &quot;preco&quot;: 5.99,
    &quot;imagem&quot;: &quot;zzzzys&quot;
  }
]
=

it should be rendering the json data. I don't know if the problem is in the map. The json file is imported right in both components.

答案1

得分: 1

In Produto, you need to access props (not prod) and use curly brackets {}. You should not be importing/loading any JSON at this point.

export default function Produto(props) {
  return (
    <figure>
      <img src={props.imagem} alt={props.titulo}></img>
      <figcaption>{props.titulo}</figcaption>
      <p>{props.preco}</p>
      <button className="btn"> Adicionar ao carrinho </button>
    </figure>
  );
}

I would initialize the lista state with an empty array and use an effect to either fetch it (recommended), or load it from the JSON file. Also, if you use Array.prototype.map, you should supply a key prop.

import "./Produtos.css";
import productions from "../data/produtos.json";
import Produto from "./Produto";
import { useEffect, useState } from "react";

export default function Produtos() {
  const [lista, setLista] = useState([]);

  useEffect(() => {
    setLista(productions);
  }, []);

  return (
    <div className="produtos">
      {lista.map((product) => (
        <Produto key={product.id} id={product.id} {...product} />
      ))}
    </div>
  );
}

You could alternatively load the JSON asynchronously.

useEffect(() => {
  (async () => {
    const response = await fetch("../data/produtos.json");
    const produtos = await response.json();
    setLista(produtos);
  })();
}, []);
英文:

In Produto, you need to access props (not prod) and use curly brackets {}. You should not be importing/loading any JSON at this point.

export default function Produto(props) {
  return (
    &lt;figure&gt;
      &lt;img src={props.imagem} alt={props.titulo}&gt;&lt;/img&gt;
      &lt;figcaption&gt;{props.titulo}&lt;/figcaption&gt;
      &lt;p&gt;{props.preco}&lt;/p&gt;
      &lt;button className=&quot;btn&quot;&gt; Adicionar ao carrinho &lt;/button&gt;
    &lt;/figure&gt;
  );
}

I would initialize the lista state with an empty array and use an effect to either fetch it (recommended), or load it from the JSON file. Also, if you use Array.prototype.map, you should supply a key prop.

import &quot;./Produtos.css&quot;
import productions from &quot;../data/produtos.json&quot;;
import Produto from &quot;./Produto&quot;;
import { useEffect, useState } from &quot;react&quot;;

export default function Produtos() {
  const [lista, setLista] = useState([]);

  useEffect(() =&gt; {
    setLista(productions);
  }, []);

  return (
    &lt;div className=&quot;produtos&quot;&gt;
      {lista.map((product) =&gt; (
        &lt;Produto key={product.id} id={product.id} {...product} /&gt;
      ))}
    &lt;/div&gt;
  );
}

You could alternatively load the JSON asynchronously.

useEffect(() =&gt; {
  (async () =&gt; {
    const response = await fetch(&quot;../data/produtos.json&quot;);
    const produtos = await response.json();
    setLista(produtos);
  })();
}, []);

答案2

得分: 0

请在map中添加一个return语句。以下是代码片段:

import "./Produtos.css";
import productions from "../data/produtos.json";
import Produto from "./Produto";
import { useState } from "react";

export default function Produtos(props) {
  const [lista, setLista] = useState(productions);
  return (
    <div className="produtos">
      {lista.map((product) => {
       return (
        <div className="Products">
          <Produto id={product.id} {...product} />
        </div>
       )})}
    </div>
  );
}
英文:

try adding a return statement in the map.

Here is the snippet for the code :

import &quot;./Produtos.css&quot;
import productions from &quot;../data/produtos.json&quot;;
import Produto from &quot;./Produto&quot;;
import { useState } from &quot;react&quot;;

export default function Produtos(props) {
  const [lista, setLista] = useState(productions);
  return (
    &lt;div className=&quot;produtos&quot;&gt;
      {lista.map((product) =&gt; {
       return (
        &lt;div className=&quot;Products&quot;&gt;
          &lt;Produto id={product.id} {...product} /&gt;
        &lt;/div&gt;
       )})}
    &lt;/div&gt;
  );
} 

</details>



# 答案3
**得分**: 0

1- 你不需要将数据导入到你的 **Produto** 组件中。其代码应为:

```jsx
export default function Produto({ prod }) {
    return (
        <figure>
            <img src={prod.imagem}></img>
            <figcaption>{prod.titulo}</figcaption>
            <p>{prod.preco}</p>
            <button className='btn'>Adicionar ao carrinho</button>
        </figure>
    )
}

不要将 js 指令放在 括号 () 中,而是应该放在 花括号 {} 中。

2- 至于 Produtos 组件,你只需将产品作为 Produto 组件的属性传递即可:

import productions from '../data/produtos.json';
import Produto from "./Produto";
import { useState } from "react";

export default function Produtos(props){
    const [lista, setLista] = useState(productions);
    return (
        <div className="produtos">
            {lista.map(product => (
                <div className="Products">
                    <Produto id={product.id} prod={product}/>
                </div>
            ))}
        </div>
    )
}
英文:

1- You don't need to import the data into your Produto component. Its code should be :

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

export default function Produto({ prod }) {
    return(
        &lt;figure&gt;
            &lt;img src={prod.imagem}&gt;&lt;/img&gt;
            &lt;figcaption&gt;{ prod.titulo }&lt;/figcaption&gt;
            &lt;p&gt;{ prod.preco }&lt;/p&gt;
            &lt;button className=&#39;btn&#39;&gt; Adicionar ao carrinho &lt;/button&gt;
            
        &lt;/figure&gt;
    )
}

<!-- end snippet -->

Instead of putting the js instructions in parentheses (), you must instead put them in braces {}

2- As far as the Produtos component is concerned, all you have to do is pass the product as an attribute of the Produto component
<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

import productions from &#39;../data/produtos.json&#39;
import Produto from &quot;./Produto&quot;
import { useState } from &quot;react&quot;;
export default function Produtos(props){
    
    const [lista, setLista] = useState(productions);
    return(
        &lt;div className=&quot;produtos&quot;&gt;
            {lista.map(product =&gt; (
                  &lt;div className=&quot;Products&quot;&gt;
                    &lt;Produto id={product.id}  prod={product}/&gt;
                  &lt;/div&gt;
                ))}            
        &lt;/div&gt;
 )
    }

<!-- end snippet -->

huangapple
  • 本文由 发表于 2023年6月8日 02:16:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/76426046.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定