Vue.js 模板循环 - 异步 axios 调用

Posted

技术标签:

【中文标题】Vue.js 模板循环 - 异步 axios 调用【英文标题】:Vue.js template loop - async axios call 【发布时间】:2020-11-07 04:37:00 【问题描述】:

我正在循环一个数组并渲染一个 html 模板,这很好用。对于其中一列,我需要使用 axios 执行额外的 AJAX 调用,因此每行获取数据。

但是在 AJAX 调用完成后,我无法更新模板。我尝试将循环变量作为引用传递并尝试从 axios 返回 Promise。

我想我理解异步调用应该如何工作的基本前提,我只是找不到在 Vue 模板/组件中设置它的正确方法。

例如:

<tr v-for="venue in venue_results" :key="venue.id">
    <td class="border px-4 py-2"> venue.name </td>
    <td class="border px-4 py-2"> getCampsCount(venue)   venue.camps_count </td>
    <!-- <td class="border px-4 py-2"> venue.active_events </td> -->
</tr>
<script>
    export default 
        ...
        methods: 
            ...
            async getCampsCount(venue) 
                console.log(venue);

                let camps_count = '...';
                venue.camps_count = '...';

                let this_venue = venue;

                return axios.get(
                    route('api3.venue-courses', venue: venue.id),
                    
                        params: 
                            type: 'Hol',
                            active: 1,
                        ,
                    
                )
                .then(response => 
                    console.log(response.data.meta.total);

                    camps_count = response.data.meta.total;
                    this_venue.camps_count = response.data.meta.total;

                    return camps_count;
                )
                .catch(error => 
                    camps_count = 'n/a';
                    this_venue.camps_count = 'n/a';

                    return camps_count;
                )
                .then(() => 
                    // Always run
                    return camps_count;
                );
            ,
        
    
</script>

【问题讨论】:

您不应该像这样直接在模板中调用数据获取操作(或任何改变组件状态以触发重新渲染的操作)。只需在模板之外调用getCampsCount,例如在created 钩子内或其他适当的地方。 您不应该在每次重新渲染 DOM 时都进行获取。这是昂贵且不必要的。相反,一次性使用异步数据填充整个venue_results。不要为遇到的每一行都发出一个请求,而是尝试将它们全部捆绑到一个请求中。 您最好在服务器端获取 camps_count 并将其与 venue_results 一起返回,因此它是循环中 venue 的属性 【参考方案1】:

在循环中使用引用并通过索引访问它。

<div ref='target' />
this.$refs.target[theIndex].innerText = 'The Value'

您还可以创建一个数据成员,绑定到它,然后在您的异步处理程序中更新。

<div>results[venue.id]</div>
this.results[venue.id] = 'The Value'

【讨论】:

以上是关于Vue.js 模板循环 - 异步 axios 调用的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 从外部 js 文件调用异步函数

Axios-一次发出多个请求(vue.js)

vuejs 应用程序中异步 axios 调用的多个响应的竞争条件

Vue基础入门讲义-异步请求axios

使用axios 异步显示数据到页面

Vue体验(前后端交互)