Содержимое содержимого отображается как объект json, но не может получить значения

#javascript #json #react-hooks

#javascript #json #реагирующие крючки

Вопрос:

Я создал две записи contentful и пытаюсь получить содержимое содержимого на моем веб-сайте React-hooks. Однако я не могу получить title, description, image, shortDescription значения в разделе поля: уровень внутри объекта JSON. Как я могу выполнить итерацию и получить значения из этого? Может кто-нибудь посоветовать мне решить проблему.

https://codesandbox.io/s/dark-glitter-9k30w

 [
   {
      "sys":{
         "space":{
            "sys":{
               "type":"Link",
               "linkType":"Space",
               "id":"piw45a7gxkal"
            }
         },
         "id":"2L5jhZhtvUwuWe20kYM2vh",
         "type":"Entry",
         "createdAt":"2020-09-20T11:50:53.764Z",
         "updatedAt":"2020-09-20T11:50:53.764Z",
         "environment":{
            "sys":{
               "id":"master",
               "type":"Link",
               "linkType":"Environment"
            }
         },
         "revision":1,
         "contentType":{
            "sys":{
               "type":"Link",
               "linkType":"ContentType",
               "id":"course"
            }
         },
         "locale":"en-US"
      },
      "fields":{
         "title":"API testing using Postman",
         "slug":"api-testing-using-postman",
         "image":{
            "sys":{
               "type":"Link",
               "linkType":"Asset",
               "id":"6n41KgxfwWmmeCiSemIsK2"
            }
         },
         "shortDescription":"Cypress test to read a JSON file from Fixture folder.",
         "description":"Api testing using postman. This is useful for testers.nnpm.test()nnApi testing using postman. This is useful for testers. n",
         "duration":3,
         "skillLevel":"beginner",
         "lessons":[
            {
               "sys":{
                  "type":"Link",
                  "linkType":"Entry",
                  "id":"3op5VIqGZiwoe06c8IQIMO"
               }
            }
         ],
         "categories":[
            {
               "sys":{
                  "type":"Link",
                  "linkType":"Entry",
                  "id":"7JhDodrNmwmwGmQqiACW4"
               }
            }
         ]
      }
   },
   {
      "sys":{
         "space":{
            "sys":{
               "type":"Link",
               "linkType":"Space",
               "id":"piw45a7gxkal"
            }
         },
         "id":"1ePcCVp2VzehrXpcSaq6aM",
         "type":"Entry",
         "createdAt":"2020-09-20T08:43:44.388Z",
         "updatedAt":"2020-09-20T08:43:44.388Z",
         "environment":{
            "sys":{
               "id":"master",
               "type":"Link",
               "linkType":"Environment"
            }
         },
         "revision":1,
         "contentType":{
            "sys":{
               "type":"Link",
               "linkType":"ContentType",
               "id":"course"
            }
         },
         "locale":"en-US"
      },
      "fields":{
         "title":"Cypress test to read a JSON file",
         "slug":"cypress-test-to-read-a-json-file",
         "image":{
            "sys":{
               "type":"Link",
               "linkType":"Asset",
               "id":"6n41KgxfwWmmeCiSemIsK2"
            }
         },
         "shortDescription":"Cypress test to read a JSON file from Fixture folder.",
         "description":"nThis cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. nn> cy.get()nnThis cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. This cy test is to read a JSON file from fixture folder. n",
         "duration":3,
         "skillLevel":"beginner",
         "lessons":[
            {
               "sys":{
                  "type":"Link",
                  "linkType":"Entry",
                  "id":"3op5VIqGZiwoe06c8IQIMO"
               }
            }
         ],
         "categories":[
            {
               "sys":{
                  "type":"Link",
                  "linkType":"Entry",
                  "id":"7JhDodrNmwmwGmQqiACW4"
               }
            }
         ]
      }
   }
]
  

Home.js

 const Home = () => {

const [blogArticles, setBlogArticles] = useState([]);

  useEffect(()=>{
        async function fetchData() {
            const entry = await client.getEntries();
            console.log(entry.items);
            setBlogArticles(entry.items);
             }
          fetchData();
    },[]);

return(

    <div className="container">
                        {
                            blogArticles.map(({ id, title, images, shortDescription, description}) => (
                                <div key={id} className="column-center">
                                   <article className="blogmaintile">
                                    <img className="blogImage" key={images} src={images} alt="myimage"</img> 
                                        <div className="blogtitle">
                                            <span key={title}>{title}</span>
                                        </div>
                                        <section>
                                    <p className="blogdescription" key={description}>{description}</p>
                                        </section>
                                        <section>
                                       <p className="blogdescription" key={shortDescription}>{shortDescription}</p>
                                        </section>

                                     
                                        <section className="col2">
                                            <a href="">Read more {'>'}{'>'}</a>
                                        </section>
                                    </article>
                                </div>
                            ))
                        }
                    </div>

  )
}
export default Home;
  

Ответ №1:

Вы не уничтожаете его должным образом, есть еще один уровень объекта, на который вы должны перейти fields , и это то же самое id , поскольку он находится внутри объекта `sys’, вы должны сначала зайти в него.

 //using Destructuring 

blogArticles.map(({ sys: { id }, fields: { title, image, shortDescription, description } }) => {
    console.log(id, title, image, shortDescription, description)
    //to get the image id do: image.sys.id
})
  

или:

 blogArticles.map(article => {

    const id = article.id
    const title = article.fields.title
    const image_id = article.fields.image.id
    const shortDescription = article.fields.shortDescription
    const descreption = article.fields.description
    console.log(id, title, image_id, shortDescription, descreption)
    
})
  

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

введите описание изображения здесь

Комментарии:

1. Могу ли я узнать, как мы можем добавить базовый URL-адрес внутрь? src=» localhost:3000/» {image.sys.id }

2. Зависит от того, где у вас есть изображение, если оно хранится на вашем локальном компьютере, тогда ./path to image.png , если вы получаете их с URL-адреса, вам нужна прямая ссылка на изображение website_url/id/{image.sys.id}.png , я должен увидеть ссылку на веб-сайт, чтобы предоставить вам точно такой же URL-адрес, который вы должны использовать.

3. Извините, я не сохраняю изображение на своем локальном компьютере… Изображение, получаемое с сайта, содержащего содержимое.

4. Откуда вы получаете этот файл json?

5. В contenful создано два содержимого ( contentful.com ) и я загружаю их на свой локальный веб-сайт react hooks. В соответствии с вашим ответом я получаю заголовок, краткое описание и описание, но изображение не получено