使用 Apollo + Vue 进行异步调用

Posted

技术标签:

【中文标题】使用 Apollo + Vue 进行异步调用【英文标题】:Async calls with Apollo + Vue 【发布时间】:2021-02-11 17:25:15 【问题描述】:

目前,我正在尝试从我的服务器获取数据,但我遇到的问题是数据需要一点时间来获取(在邮递员中虽然它是瞬时的),比获取 DOM 的时间要长安装/加载,因此我得到错误(数据未定义)并且没有任何内容会加载到 DOM。

如果我在 DOM 完成挂载后 console.log 数据,那么我可以在控制台中看到它,但我无法找到解决方法,让组件等待数据被获取。

我尝试使用 v-if 语句,并以几种不同的方式编写它,但我仍然收到未定义数据的错误,并且在查询完成获取后它也不会加载。目前我已经将数据设置为首先等于null,它在JS中实际上是一个对象,并且在获取完成后它确实会填充数据。我可以在控制台中看到这一点。在此之前,我尝试了一个简单的 v-if="GameWeek",并将 GameWeek 定义为一个空对象和一个空数组,但是这些都不起作用,并强制组件等待数据完成获取。

我的问题是,有什么方法可以异步执行此操作,或者更好的是,让组件等到数据被提取后再正确加载到 DOM 中?

这是我的组件的样子:

<template>
    <!--  Highest climber & longest fall -->
    <v-container>
        <v-card class="card-container mx-auto" v-if="GameWeek !== null" :v-for="player in GameWeek" :key="player.player_id">
            <!-- Top part of card -->
             <v-list-item three-line>
                <v-list-item-content>
                    <div class="card_top_section">
                        <v-avatar>
                            <img
                                src="https://cdn.vuetifyjs.com/images/john.jpg"
                                
                            >
                        </v-avatar>
                        <div class="ml-3">
                            <p class="cardText player_name">
                                  player.player_name  
                            </p>
                            <p class="cardText team_name">
                                 player.team_name 
                            </p>
                        </div>
                    </div>
                    
                    <div class="card_divs mt-7">
                        <p class="cardText points">
                        Points this week  player.points 
                        </p>
                       <!--  <p class="points_green points">
                            
                        </p> -->
                    </div>
                   <!--  Second Row Card -->
                    <div class="card_divs bottom_line">
                        <p class="cardText points">
                            Total points  player.total 
                        </p>
                       <!--  <p class="points_green points">
                            
                        </p> -->
                    </div>
                    
                </v-list-item-content>
             </v-list-item>
        </v-card>
    </v-container>      
</template>

<script>
    import gql from 'graphql-tag'
    export default 
        name: 'PlayerCard',
        data: () => 
            return 
                GameWeek: null
            
        ,
        apollo: 
            GameWeek: gql`query GameWeek 
                GameWeek 
                    team_id
                    points
                    player_name
                    rank
                    previous_rank
                    total
                    player_id
                    team_name
                
            `
        ,
        mounted() 
            console.log('This is the gameweek', this.GameWeek)
        ,
    
</script>

【问题讨论】:

【参考方案1】:

好吧,事实证明,一旦我发现问题,这很容易解决。

它是 v-for 语句前面的 :。一旦删除它就一切正常:)

【讨论】:

以上是关于使用 Apollo + Vue 进行异步调用的主要内容,如果未能解决你的问题,请参考以下文章

[概念] 同步 异步 阻塞 非阻塞

vue利用回调函数保证子组件调父组件方法按顺序执行

Vue with jest - 使用异步调用进行测试

使用轴和 Vue.js 进行异步/等待调用 - `.then()` 回调未更新 `this.something`

同步与异步,阻塞与非阻塞

Java 多线程 同步和异步