【问题标题】:Correct syntax for importing axios method in Vue jsVue js中导入axios方法的正确语法
【发布时间】:2018-11-26 20:11:23
【问题描述】:

我试图通过导入它们而不是直接在创建的钩子中调用它们来将我的 axios 调用与我的主 vue 实例分开。

我在一个名为 data.js 的单独文件中有这个

import axios from 'axios'
export default{
    myData() {
        return axios.get(`http://localhost:8080/data.json`)
            .then(response => {
                // JSON responses are automatically parsed.
                return response.data;
            })
            .catch(e => {
                return this.myErrors.push(e)
            });
},

在我的 vue 实例中,我有以下内容:

import myDataApi from '@/api/data.js'

export default {
    name: 'app',
    components: {
        myDataApi, // not sure if this is correct
    },
    data: function () {
        return {
            myInfo: '',
        }
    },
    created() {
        this.myInfo = myDataApi.myData();
        console.log('this.myInfo= ', this.myInfo)
    },

我正在尝试使用 myData 调用的 json 填充 myInfo。这会在 Vue devtools 中返回 [object Promise],在控制台中返回 Promise {<pending>}

我需要的所有数据都在 Promise {<pending>} 的一个名为 [[PromiseValue]]:Object 的数组中,所以我知道它正在工作,我只需要知道实现它的正确方法。

【问题讨论】:

  • 这是承诺的本质。它处于挂起状态,因为当您记录它时,axios-request 尚未完成。您尝试的第一件事是从您的承诺中解开您的数据,但要意识到这不是问题所在。 Promise 解决了知道数据何时可用的问题。您可以对该值进行其他修改,例如this.myInfo = myDataApi.myData().then(r=>r.a = b);,但承诺仍然存在。但是,您可以将其直接绑定到您的模板,加载时会显示该值,所以这不是您可能认为的问题。

标签: javascript promise vuejs2 axios


【解决方案1】:

只是添加到@LexJacobs 的答案。我省略了 .then() 中数据周围的括号,如下所示。 Vue 一直在抱怨数据不可用,即使它是可用的。这解决了这个问题,虽然老实说我不知道​​为什么。

myDataApi.myData()
    .then(data => {
        this.dataHasLoaded = true;
        this.myInfo = data;
    })
    .catch(e => {
        this.myErrors.push(e)
    });

【讨论】:

    【解决方案2】:

    我目前没有启用测试的开发环境,但我注意到您正在尝试在组件初始化的那一刻分配一个变量。这个对象是一个 Promise,但是在你导入它的组件中解析它之后,你并没有处理这个 Promise。

    我建议尝试在实际组件中处理承诺,例如:

    import myDataApi from '@/api/data.js'
    
    export default {
        name: 'app',
        components: {
            myDataApi, // not sure if this is correct
        },
        data: function () {
            return {
                myInfo: '',
            }
        },
        created() {
            myDataApi.myData()
              .then((data) => {
                this.myInfo = data
                console.log('this.myInfo= ', this.myInfo);
              });
              .catch((e) => handleError) // however you want to handle it
    
        },
    

    【讨论】:

    • 我也不熟悉 view api,所以你必须将上面的内容调整为正确的语法,但我更确定的是你将在重要组成部分。
    • 非常感谢您的解释。干杯
    • myDataApi, // not sure if this is correct 现在您将其视为普通导入,所以是的,您可以安全地从组件中删除这个所谓的“组件”。
    猜你喜欢
    • 2019-08-03
    • 2021-01-17
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2019-09-16
    • 2019-02-02
    • 2015-12-07
    相关资源
    最近更新 更多