Vue JS在渲染之前等待数据

巴勃罗·阿拉亚(Pablo Araya)

几个星期以来,我一直陷入使用VueJS渲染数据的问题。

我正在做的是进行一些axios调用(一个在另一个内部)。我的问题是数据在调用完成之前就已呈现,因此该视图未显示任何内容。

我看到一些执行“等待”和“异步调用”的代码,但似乎没有任何解决方案。

这里也有类似的东西Get组件在渲染之前等待异步数据,但是两者都不起作用

这是我的代码:

<template>
 <div class="m-portlet m-portlet--full-height" m-portlet="true" id="m_portlet_validate_agenda">
...
<div class="m-portlet__body">
    <div class="tab-content">
        <div class="tab-pane active" id="m_widget2_tab1_diagnose">
            <div class="m-widget2">
                <div v-for="diagnose in diagnoses" v-if="diagnoses.length" :class="'m-widget2__item m-widget2__item--' + diagnose.delayColor[0]">
                    <div class="m-widget2__checkbox" >
                        <label class="m-checkbox m-checkbox--solid m-checkbox--single m-checkbox--brand">
                            <span class="m--bg-white" v-html="diagnose.concurrence"></span>
                        </label>
                    </div>
                    <div class="m-widget2__agenda col-2">
                        {{ diagnose.started_at | moment("HH:mm A") }}
                    </div>
                    <div class="m-widget2__desc" v-if="!isFetching">
                        <div>
                            <span class="m-widget2__text">

                            </span><br>
                            <span class="m-widget2__user-name">
                                <a href="#" class="m-widget2__link m-link">
                                Paciente: 
                                {{ diagnose.details[0].name }}
                                </a><br>
                                <a href="#" class="m-widget2__link m-link">
                                Tratante: 

                                </a>
                            </span>
                        </div>
                    </div>
                </div>
            </div>
        </div>
     </div>
   </div>
 </div>
</template>

<script>
export default {

    data() {
        return {
            events: [],
            diagnoses: [],
            urgencies: [],
            treatments: [],
            isFetching: true
        }
    },

    mounted() {
        this.loadData();
    },

    methods: {

        loadData: async function() {
            await axios.get('/pacientes/request-json/agenda/validarAsistencia/eventos').then(res => {
                this.events = res.data;
                this.diagnoses = [];
                this.urgencies = [];
                this.treatments = [];
                this.getDetails();
                this.getDelayColor();
                this.getConcurrence();
                vm.$nextTick(function () {
                    $('[data-toggle="m-tooltip"]').tooltip();
                });
                console.log('end LoadData');
            });
        },

        getDetails: function() {
            console.log('cargando');
            this.events.forEach(event => {
                axios.get('/pacientes/request-json/agenda/validarAsistencia/eventos/' + event.id).then(res => {
                    event.details = res.data;
                    console.log(res.data);
                });
            });
            this.distributeEvents();
            console.log('montado');
        },    

        distributeEvents: function() {
            this.events.forEach(event => {
                if ( event.event.event_type == "diagnosis" )
                {
                    this.diagnoses.push(event);
                }
                else if ( event.event.event_type == "urgency" )
                {
                    this.urgencies.push(event);
                }    
                else if ( event.event.event_type == "treatment" )
                {
                    this.treatments.push(event);
                }
            });
            this.isFetching = false;
        },

        getDelayColor: function() {
            this.events.forEach(event => {
                do something...
            });
        },

        getConcurrence: function() {
            this.events.forEach(event => {                    
                do something...
            });
        },

        diffMinutes: function(started_at) {
            do something...
        }

    }

}
卡马图斯卡

您没有正确处理Promises,因此它们一直无法解决您可以使用asyncawait尽管我更喜欢使用普通的Promise对象

getDetails()是另一个故事。您正在循环,并且forEach循环正在发送axios请求。您可能必须将每个axios调用返回的每个Promise存储在一个数组中,然后再调用Promise.all

    getDetails: function() {
        let url = '/pacientes/request-json/agenda/validarAsistencia/eventos/';
        console.log('loading');
        let promisedEvents = [];

        this.events.forEach(event => {
            promisedEvents.push(axios.get(url + event.id))
        });

        return Promise.all(promisedEvents)
    },

之后,我将执行以下操作:

    loadData: function() {
        axios.get('/pacientes/request-json/agenda/validarAsistencia/eventos')
            .then(res => {
                this.events = res.data;
                this.getDelayColor() // sync operation; no need to be returned
                return this.getDetails(); // Return the promise(s)
            })
            .then((res) => {
                // do something with the response from your array of Promises
            })
            .then(anotherPromise) // You can also return a promise like this 
            .catch(handleError) // Very important to handle your error!!
        });
    },

我并不是说这是实现您想要的最好的方法,而是使代码正常工作的一种方法。重要的是您需要了解Promises。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Javascript

Vue公司/路由器:如何获取正确渲染页面内容之前的数据?

来自分类Dev

在Angular 5中渲染视图之前等待数据

来自分类Dev

Vue.js在渲染组件之前填充数据

来自分类Dev

如何在vue.js中发出响应之前等待axios响应

来自分类Dev

如何在vue.js中执行其他操作之前等待函数的响应

来自分类Dev

等待直到父组件已安装/准备就绪,然后在vue.js中渲染子组件

来自分类Dev

在vue js中渲染之前获取以前的路线信息?

来自分类Dev

获取组件以在渲染之前等待异步数据

来自分类Dev

Vue JS:等待Firebase加载

来自分类Dev

在vue.js中重新渲染之前的问题函数调用

来自分类Dev

在渲染反应挂钩之前等待API调用数据

来自分类Dev

Vue在使用前等待道具数据

来自分类Dev

隐藏它们之前的Vue渲染元素

来自分类Dev

Vue Js:传递数据

来自分类Dev

如何在渲染Vue组件之前等待窗口对象中的变量?

来自分类Dev

在Vue组件之前加载js

来自分类Dev

需要在渲染模板之前不等待数据返回

来自分类Dev

在窗口调整大小之前,Chart.js不会使用vue.js进行渲染

来自分类Dev

Vue.js-渲染问题

来自分类Dev

使用 Vue.js 语法的 Vue.js 渲染模板

来自分类Dev

在 Vue.js 加载数据之前阻止显示组件

来自分类Dev

Vue 路由不是在 vue js 中渲染 vue 实例的数据属性

来自分类Dev

Vue js 模板渲染问题

来自分类Dev

vue.js 渲染包含 vue.js 语法的 ajax 数据

来自分类Dev

Vue.js - 在更新组件之前等待动画完成

来自分类Dev

Vue.js 渲染 Highchart

来自分类Dev

在渲染反应钩子之前等待 API 数据

来自分类Dev

在 Vue JS 中渲染 Markdown

来自分类Dev

Vue.js 从 API 调用中渲染新数据

Related 相关文章

热门标签

归档