javascript - 使用 fetch 检索数据时,Vue JS 组件没有反应

标签 javascript vue.js fetch-api

我的 Vue 应用程序有一个奇怪的问题。 该组件如下所示:

...
<template v-for="foo in foos">
   <Elm v-if="foo.visible" :key="foo.label" :bar="foo" />
</template>
...

“Elm”是对象中的值,从 JSON 文件中检索。 如果我在本地获取 JSON 文件,该组件是响应式(Reactive)的:

<script>
    import datas from "datafile.json";
    ...
    methods: {
        fillFoos() {
            datas.forEach(data => {
               this.foos.push(data)
            })
        }
    },
    mounted: {
        this.fillFoos()
   }
   ...
</script>

但是当我使用 fetch 远程检索文件时,该组件不再是响应式(Reactive)的,并且在更改 foo.visible 值时不再消失:

<script>
    methods: {
        getDataFromApi() {
            return new Promise((resolve, reject) => {
                fetch(this.apiUrl)
                .then(response => {
                    return response.json();
                })
                .then(jsonResponse => {
                    resolve(jsonResponse);
                })
                .catch(e => {
                    ...
                })
            })
        },
        fillFoos() {
            this.getDataFromApi()
            .then(response => {
                response.forEach(data => {
                    this.foos.push(data);
                });
            });
        }
    },
    mounted: {
        this.fillFoos()
    }
    ...
</script>

在这两种情况下,“foos”数组都被正确填充,唯一的区别是 v-if 指令在第二种情况下似乎被破坏了。 更准确地说,显示在初始化时正确完成(所有元素的 foo.visible 都为真并且它们都显示),但如果稍后更改 foo.visible 值,它们不会消失。

我找不到问题所在...

最佳答案

我相信您遇到的问题是方法 getDataFromApi正在返回一个 promise ,但是当你在 fillFoos 中使用它时没有等待 promise ,而是您调用 forEach在上面。

您需要使用 getDataFromApi().then(x => {})解析 promise 的语法,或者您可以使用 async await .

你可以试试这样的东西

methods: {
    async getDataFromApi() {
        const response= await fetch(this.apiUrl);
        return response.json();
    },
    async fillFoos() {
        try {
            await foos = this.getDataFromApi();
            this.foos = foos;
        } catch(error) {
            //handle error.
        }
    }
}

关于javascript - 使用 fetch 检索数据时,Vue JS 组件没有反应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998520/

相关文章:

javascript - 数组中的 getElementByID.readOnly

vue.js - CASL 在 Vue 生产模式下无法正常工作

javascript - 从服务器端还是客户端获取?

Javascript 获取事件处理程序不起作用

javascript - 如何使用 Angular Material 在下拉列表中创建 TreeView ?

javascript - 格式化使用来自 SharePoint 的 REST ajax 调用获取的日期

javascript - 未封闭的字符串文字 - Vue JS 模板简单串联

vue.js - VeeValidate,确认规则不适用于 ValidationProvider

selenium - 如何在 Selenium 中使用 Chrome DevTools 协议(protocol)(使用 Python)来捕获 HTTP 请求和响应?

Javascript 空间函数