VueJS — Как использовать ответ одного вызова API в другом вызове API в том же компоненте

#api #vue.js #response

#API #vue.js #ответ

Вопрос:

Вот мой сценарий, я пытаюсь использовать идентификатор, полученный из одного ответа API, в другом API :

Ниже приведен Component.vue:

 <template>
  <div class="Contents">
      <div class="vx-col" v-for="idea in ideas" v-bind:key="idea.id">
          <vx-card>
            ...
            <div>
              {{idea.name}} of {{idea.id}}
            </div>
            <div v-if="sum">
              {{sum.total}}
            </div>
            ...
          </vx-card>
     </div>
  </div>
</template>

<script>
...

async created () {

  await this.$http.get('/ideas')
    .then((response) => { this.ideas = response.data })
    .catch((error) => { console.log(error) })
},
methods: {

  getSumOfIdeas(id){
    this.$http.get('/sum_of_ideas/'  id  '/everything')
      .then((response) => { this.sum = response.data })
      .catch((error) => {console.log(error)})
  }
},
mounted (){
  this.getSumOfIdeas(this.ideas.id)   //Here i am trying to give that id coming from the /ideas 
}
</script>
 

Вот что console.log(response.data) дает в /ideas:

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

Не знаю, где я ошибаюсь, в настоящее время в моей консоли я получаю сообщение об ошибке как :

  /sum_of_ideas/undefined/everything // so here id coming from the /ideas should have been rendered.
 

Чтобы было понятно, я использовал пример {{idea.id }} и это отображает только число каждый раз, когда оно повторяется.

Пожалуйста, помогите мне в этом, я хочу использовать ответ, поступающий из /ideas ie id в другом ответе, вот он /sum-of-ideas .

Ответ №1:

Когда вы вызываете this.getSumOfIdeas(this.ideas.id) , вы пытаетесь получить доступ id ideas к тому, чего не существует. Либо используйте что-то вроде this.getSumOfIdeas(this.ideas[0].id) доступа id к первому объекту, либо используйте цикл для перебора идей и вызова this.getSumOfIdeas(this.ideas.id) .

 this.ideas.forEach(idea => this.getSumOfIdeas(idea.id))
 

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

1. Это работает, но при загрузке страницы значение быстро меняется, я имею в виду циклы, и каждый раздел получает одно и то же значение метода getSumOfIdea. Итак, не могли бы вы сказать мне, где именно его разместить, чтобы каждый раздел получал свое собственное значение при повторении.

2. Где вы разместили его в настоящее время, ваш вопрос содержит обновленный код, который вы используете?

3. Я обновил свой код, пожалуйста, проверьте, я показываю карты, каждая карта должна отображать разную информацию, каждая карта на самом деле отображает разные ideas.name и idea.id но одна и та же сумма на всех картах. Я попробовал ответ, который вы мне сказали, и он сначала меняет значение, а затем привязывается к единице во всех карточках

4. Можете ли вы добавить скриншот ответа от /sum_of_ideas api?

5. Предположим, если я использую /sum_of_ideas/3/все, что возвращает объект: { total: 200, max: 100, min: 49, ideas_in_month: 50, ideas_in_year: 60} , здесь вы можете видеть, что у меня жестко запрограммировано 3, но я хочу использовать идентификатор, поступающий из /ideas API для того, чтобы отобразить информацию о конкретной карте.

Ответ №2:

используются оба promise и async await, используйте только любой. выполнить getSumOfIdeas после назначения this.ideas , которое находится в created hook

     <template>
      <div class="Contents">
          <div class="vx-col" v-for="idea in ideas" v-bind:key="idea.id">
            ...
            <div>
              {{idea.name}} of {{idea.id}}
            </div>
            <div v-if="sum">
              {{sum.total}}
            </div>
            ...
         </div>
      </div>
    </template>
    
    <script>
    ...
    
    created () { // remove async and await
    
       this.$http.get('/ideas')
        .then((response) => {
            this.ideas = response.data;
            this.getSumOfIdeas(this.ideas.id);  // Do this here after assigning ideas
         })
        .catch((error) => { console.log(error) })
    },
    methods: {
    
      getSumOfIdeas(id){
        this.$http.get('/sum_of_ideas/'  id  '/everything')
          .then((response) => { this.sum = response.data })
          .catch((error) => {console.log(error)})
      }
    },
    mounted (){
      // this.getSumOfIdeas(this.ideas.id)   // move to created 
    }
    </script>
 

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

1. Я тоже пробовал этот способ, но то же самое я получаю /some-of-ideas/undefined/ все, скорее я ожидаю идентификатор вместо undefined.

2. @build___ обновите свой ответ с console.log(response.data) помощью after this.$http.get('/ideas')

3. Ответ /ideas — это массив, который состоит из объектов внутри него, каждый объект как идентификатор, сумма идей и так далее. Я пытаюсь отобразить имя и некоторые идеи каждого идентификатора соответственно.

4. это делается для проверки наличия this.ideas свойства id

5. @build___ как массив может иметь свойство id ? вся ваша логика getSumOfIdeas неверна!