Web Services 获取组件以在呈现之前等待异步数据

1dkrff03  于 2022-11-15  发布在  其他
关注(0)|答案(1)|浏览(149)

我正在调用一个端点来返回一个对象,它确实获取了数据,但是速度不够快,组件无法获取数据并呈现。相反,组件在应该有数据的地方呈现为空值。
如果我在创建时中断代码,然后在一秒钟后继续,文本将正确呈现。
如何实现在数据返回之前不进行渲染?
我的API调用:

checkScenarioType: function () {
    this.$http.get('ScenariosVue/GetScenarioTypeFromParticipant/' + this.ParticipantId).then(response => {
        // get body data
        this.ScenarioType = response.body.value;
        if (this.ScenarioType.timeConstraint) {
            store.commit('switchConstraint');
        }
    }, response => {
        // error callback
    });
}

存在问题的组件:

var questionArea = Vue.component('questionarea', {
    props: ["scenariotype"],
    data: function () {
        return ({
            position: "",
            vehicleType: ""
        });
    },
    methods: {
        transformValuesForDisplay: function () {
            switch (this.scenariotype.perspective) {
                case 1: {
                    this.position = "Driver";
                    this.vehicleType = "Autonomous";
                    break;
                }
                case 2: {
                    this.position = "Passenger";
                    this.vehicleType = "Manually Driven";
                    break;
                }
                case 3: {
                    this.position = "Driver";
                    this.vehicleType = "Manually Driven";
                    break;
                }
            }
        }
    },
    beforeMount() {
        this.transformValuesForDisplay();
    },
    template: 
    `<h1>You are the {{ this.position }}! What should the {{ this.vehicleType }} car do?</h1>`
});
cczfrluj

cczfrluj1#

在异步加载数据的情况下,我们通常使用一个简单的v-if来隐藏元素,直到数据出现。
模板如下所示:

<h1 v-if="position">You are the {{ position }}! What should the {{ vehicleType }} car do?</h1>

请注意,模板中不需要使用this
此外,在您的示例中,您将向prop添加一个(deep/immediate)watch,而不是beforeMount()钩子,以便在从外部加载prop时获取更改:

watch: {
    scenariotype: {
      handler: function(newValue) {
            this.transformValuesForDisplay();
      },
      deep: true,
      immediate: true
    }
  },

完整演示如下。
第一次

相关问题