как получить доступ к вложенным данным json с помощью vuejs>

#json #vue.js

Вопрос:

Я хотел бы создать таблицу и заполнить ее данными, используя vue.js и v-для, но я не знаю, как получить доступ к вложенному файлу JSON.

Если я просто вызову {{элементы}}, данные будут представлены, но мне не удастся их отфильтровать

вот мой код:

     <template>
  <div id="app">
      <thead>
  
      </thead>
      <tbody>
<table>
      <thead>
        <tr>
          <th>id</th>
          <th>press</th>
          <th>date</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in items" :key="item.id">
          <td>{{ item.id }}</td>
          <td>{{ item.results.downloadable.document_en }}</td>
          <td>{{ item.}}</td>
 
        </tr>
      </tbody>

    </table>
  
      </tbody>

 
  </div>

</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      items:[]
    }
  },


  created() {
    axios.get(`https://zbeta2.mykuwaitnet.net/backend/en/api/v2/media-center/press-release/?page_size=61amp;type=5`)


    .then(response => {
     
      this.items = response.data
    })
    
  }
}

</script>
 

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

1. Проверьте свой ответ, все это у вас перед глазами. Это response.data.results то, что представляет собой массив.

Ответ №1:

В зависимости от результата вашей конечной точки вам следует изменить назначение элементов на

 .then(response => {
  this.items = response.data.results
})
 

И ваша петля, чтобы

 <tr v-for="item in items" :key="item.id">
  <td>{{ item.id }}</td>
  <!-- as downloadable is an array, see update below etc. -->
</tr>
 

Но имейте в виду — если вы назначите data.results напрямую, вы потеряете так называемую информацию о «пагинаторе», которая также содержит ссылку для дополнительной загрузки.

Таким образом, другим вариантом было бы назначить

 this.items = response.data
 

ОДНАКО имейте в виду, что затем вы должны определить элементы в своих данных как нулевой или пустой объект (не массив, так как это было бы ложно).

А затем измените свой цикл на что-то вроде этого (сейчас он зацикливается item.results ).

 <tbody v-if="items amp;amp; items.results">
 <tr v-for="item in items.results" :key="item.id">
  <td>{{ item.id }}</td>
  <!-- as downloadable is an array - see Update below etc. -->
 </tr>
</tbody>
 

Этот подход позволит вам показать общее количество items.count , например, с помощью

Обновить:

На самом деле downloadable это массив! Я могу только предположить, чего вы на самом деле хотите достичь здесь. Я создал jsfiddle, чтобы продемонстрировать его: https://jsfiddle.net/v73xe4m5/1/

Главное, что вы, вероятно, хотите сделать, это отфильтровать запись, чтобы показывать только записи, в которых downloadable содержится document_en.

       <tr v-for="item in items.results" :key="item.id">
        <td>{{ item.id }}</td>
        <td>
          <div class="downloads">
          <span
            v-for="downloadable in item.downloadable.filter(d => !!d.document_en)"
            :key="downloadable.id"
           >{{ downloadable.document_en.file }}</span>
           </div>
        </td>
      </tr>
 

Я не знаком с этой конечной точкой / api, поэтому я не знаю, может ли она возвращать более одного соответствующего документа на элемент.

Как вы можете видеть, я использовал второй цикл v-for внутри <td> , чтобы просмотреть все загружаемые записи. Перед этим они фильтруются, поэтому отображаются только записи, которые на самом деле имеют значение document_en. Вы можете адаптировать это так, как хотите.

Надеюсь, это поможет!

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

1. большое спасибо Frnak, не это кристально ясно, за исключением того, что item.downloadable.document_en не появляется, я проверил и типа нет, нужно ли мне сделать еще один v-для вложенных внутри?

2. О, извини, я пропустил это. Это зависит от того, чего вы хотите достичь. Для первого наброска вы должны попробовать item.downloadable.document_en.file . Поскольку document_en сам по себе является объектом, вам необходимо указать, какую его часть вы хотите отобразить. Как правило, вам, вероятно, понадобится ссылка в вашем случае, например <a href="{{item.downloadable.document_en.file}}" target="_blank">Download</a>

3. вау, вы пошли далеко вперед, я просто хотел бы просто иметь таблицу с идентификатором и ссылкой для произведений искусства (document_en), но когда выполняете приведенный выше код, даже идентификатор исчезает, и я получаю таблицу empyt.. мне жаль, что у вас возникли проблемы, но это уже несколько часов сводит меня с ума

4. Ты прав! Я обнаружил большую ошибку — дайте мне несколько минут, я обновлю свой ответ выше

5. Добавлено обновление!

Ответ №2:

это правильная форма для получения массива из json и сохранения в этом.элементы

  this.items = response.data.results
 

Я призываю вас всегда сохранять console.log(ответ) после вызова api и получать доступ к данным в соответствии со структурой результатов api

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

1. Вы также должны упомянуть изменения, необходимые в шаблоне / html. Также я бы рекомендовал на самом деле использовать debugger вместо console.log.