【发布时间】: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