【问题标题】:VueJs cant access items outside of my created hookVueJs 无法访问我创建的钩子之外的项目
【发布时间】:2020-03-27 16:56:57
【问题描述】:

我正在尝试访问我在创建过程中加载的一些 JSON 数据,它会加载到我创建的挂钩中,但是当我尝试在创建的挂钩之外访问它时,它不会返回任何内容。执行“axios load”的控制台日志显示了我的 JSON,而内部安装则没有。有什么想法吗?

这是我的代码。

data(){
            return{
                dataset: "",
                baseUrl: process.env.VUE_APP_BASE_URL
            }

        },
created() {
            console.log('Mounted: base URL',this.baseUrl);
            axios.get(this.baseUrl + '/mockdata/piemock.json').then(response => {
                this.dataset =response.data;
                console.log('axios load', this.dataset);
            })
                .catch(e => {
                    console.log('axios error', e)
                });
        },
        mounted() {
            // define data
            console.log("this.dataset", this.dataset);
            console.log("this.baseurl", this.baseUrl);
}

更新 继续 AlexMA 在他的帖子中所说的内容,这里是新代码。控制台日志说 axios 被调用永远不会被调用?

data(){
            this.fakeAxiosCall()
                .then((theData) => (
                    console.log('axios called', theData),
                    this.dataset = theData
                ))
                .finally(() => (this.loading = false));
            return{
                dataset: "",
                baseUrl: process.env.VUE_APP_BASE_URL
            }

        },

methods: {
            fakeAxiosCall:  function() {
                return axios.get(this.baseUrl + '/mockdata/piemock.json')
            }
        },

更新 2(最终工作答案)

AlexMA 帮助我完成了 99% 的工作,当时它缺少 axios 内部的 return 语句,以及抛出 catch 以抛出错误。这是最终的代码。我给了他一张支票,让我能顺利到达那里。我不得不写出完整的 URL,因为我收到了这个奇怪的错误,其中 baseUrl 变量在 axios 中添加了一个路径,否则当我在该调用之外执行控制台日志时它没有添加。小问题,但除此之外这有效。

 data() {
            this.fakeAxiosCall()
                .then((theData) => (
                    this.data = theData
                ))
                .finally(() => (this.loading = false));
            return {
                data: "",
                loading: true,
                baseUrl: process.env.VUE_APP_BASE_URL
            }
        },
        methods: {
            fakeAxiosCall: function() {
                 return axios.get('http://localhost:8080/mockdata/piemock.json')
                    .then(result => { console.log(result); return result; })
                    .catch(error => { console.error(error); throw error; });
            }
        },

【问题讨论】:

  • axios 调用是异步的,所以在调用 mounted 钩子时它的承诺还没有解决。您应该能够从日志记录的顺序中看到这一点。
  • 嗯,有道理。有没有办法让我可以加载 JSON 文件?
  • 如果必须在安装此组件之前加载它,那么您需要在外部加载它,并且只有在数据可用时才创建组件。如果你想保持这个组件内部的加载,那么你需要处理在初始渲染期间不可用的数据。
  • 好吧,这很有道理,我将不得不研究如何将整个 JSON 数据树传递给组件,以便在创建组件之前创建我的 JSON。
  • 您确定需要避免创建组件吗?只是隐藏组件的template,直到加载数据?

标签: javascript vue.js axios


【解决方案1】:

我想分享一些可能有用的示例代码,因为看起来您正在尝试根据数据准备好的时间进行 DOM 操作。希望它会有所帮助。这是注释“您确定需要避免创建组件而不是在加载数据之前隐藏组件的模板吗?”的一个示例。

var app = new Vue({
  el: "#app",
  data() {
    this.fakeAxiosCall()
      .then((theData) => (this.data = theData))
      .finally(() => (this.loading = false));
    return {
      data: "",
      loading: true
    };
  },
  methods: {
    fakeAxiosCall: function() {
      return new Promise((resolve) => {
         setTimeout(() => resolve("hello Vue"), 2000);
      });
    }
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <div v-if="loading">Loading...</div>
  <div v-if="!loading">Data was loaded: "{{data}}"</div>
</div>

【讨论】:

  • 组件中是否也存在那个 fakeAxiosCall const? (是的,我正在尝试创建一个 D3JS 饼图组件)
  • 它可以存在于任何地方,我只是将它作为组件之外的一个常量作为示例。如果感觉更好,您可以将它移到 methods 块内并调用 this.fakeAxiosCall()。在一个大型应用程序中,它可能应该驻留在模型层的某个地方,可能是一个普通的 javascript 文件、vuex 或其他一些模型层库。不过,这取决于您喜欢如何构建应用程序。
  • 好的,我对代码做了一些调整,但现在遇到了不同的问题,请参阅 OP
  • 在您的应用中,它可能类似于fakeAxiosCall: function() { return axios.get(this.baseUrl + '/mockdata/piemock.json') }。但是,它当然不需要称为fake ?
  • 您的代码看起来不错。请参考stackoverflow.com/help/minimal-reproducible-exampleericlippert.com/2014/03/05/how-to-debug-small-programs。 SO 不适用于扩展调试帮助会话,因此如果您在程序中发现无法解决的特定错误,请打开一个新问题。
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 2018-09-27
  • 2021-06-10
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多