使用 Nuxt 获取数据
Fetching data with Nuxt
我正在使用 Nuxt async fetch() 调用数据,如下所示:
export default {
....
async fetch() {
let childrenUrl = process.env.VUE_APP_MGNL_API_PAGES + this.projectPage + "/@nodes";
await this.$http.$get(childrenUrl).then(childResult => {
this.projectsPageChildren = childResult;
})
},
fetchOnServer: false,
...
}
projectsPageChildren returns 一个包含 objects 的数组,每个数组包含一个 属性 “servicesMain”,其中包含一个 URL 路径,请参见下面的屏幕截图。
我需要访问 servicesMain URL 路径的数据,我假设要获取它,我需要使用“servicesMain”进行另一个获取调用 URL。
所以我正在尝试的是:
我使用 v-for 遍历 projectsPageChildren,在每个 child 上我调用一个函数“getMainService”,我将 servicesMain URL.
传递给该函数
<div class="card" v-if="projectsPageChildren" v-for="project in projectsPageChildren">
<div class="title">{{ getMainService(project.servicesMain) }}</div>
<div class="title">{{ project.title }}</div>
<Btn :to="project['@path']">More</Btn>
</div>
方法“getMainService”被放置在 VUE 的“方法”钩子中,并使用它作为参数接收的 URL 进行另一个异步调用。
methods: {
async getMainService(servicePath) {
let url = process.env.VUE_APP_MGNL_API_PAGES + servicePath;
await fetch(url)
.then(result => {
result.json().then((data) => {
console.log(data);
console.log(data.title);
return data.title;
});
})
.catch(error => console.log(error));
},
},
函数中的两个控制台日志语句显示了我需要该函数的数据return。
然而,我在浏览器中看到的只是“[object Promise]”。
总结一下:我正在使用 Nuxt 的 fetch() 钩子来获取我的数据,return 是一个数组。数组中的每个 object 都包含一个指向更多数据的 URL。
如何正确设置第二次获取调用?我在这里错过了什么?
我阅读了有关 Nuxt 数据获取和 Javascript 承诺和响应的文档,但 none 似乎完全解决了我的问题。
我最终是这样解决的:
在我的原始代码中,我在 Vue 模板部分调用了方法“getMainService()”,但它不起作用。现在我在 async fetch() 方法中发出第二个请求并从那里调用该方法。在 forEach 循环中,我基本上是将对象的 属性 重写为方法 returns.
这是新代码:
async fetch() {
let thisPageUrl = process.env.VUE_APP_MGNL_API_PAGES + this.projectPage;
await this.$http.$get(thisPageUrl).then(thisPageResult => {
this.projectsPageData = thisPageResult;
})
let childrenUrl = process.env.VUE_APP_MGNL_API_PAGES + this.projectPage + "/@nodes";
await this.$http.$get(childrenUrl).then(projectPages => {
this.projectsPageChildren = projectPages;
this.projectsPageChildren.forEach(projectPage => {
this.getMainService(projectPage.extras[0].serviceMain).then(res => {
projectPage.extras[0].serviceMain = res;
});
})
})
},
fetchOnServer: false,
方法 getMainService() 调用路径和 returns 字符串值:
methods: {
getMainService(servicePath) {
let url = process.env.VUE_APP_MGNL_API_PAGES + servicePath;
return this.$http.$get(url).then(serviceMain => {
return serviceMain.title;
})
},
},
模板位如下所示:
<div>
<div class="card" v-if="projectsPageChildren" v-for="(project, index) in projectsPageChildren">
<div class="column_title">{{ project.serviceMain }}</div>
<div class="title">{{ project.title }}</div>
<Btn :to="project['@path']">More</Btn>
</div>
</div>
也许不是最漂亮的解决方案,但它确实有效。
感谢@kissu 和@GrafiCode,你的评论让我朝着正确的方向前进。
我正在使用 Nuxt async fetch() 调用数据,如下所示:
export default {
....
async fetch() {
let childrenUrl = process.env.VUE_APP_MGNL_API_PAGES + this.projectPage + "/@nodes";
await this.$http.$get(childrenUrl).then(childResult => {
this.projectsPageChildren = childResult;
})
},
fetchOnServer: false,
...
}
projectsPageChildren returns 一个包含 objects 的数组,每个数组包含一个 属性 “servicesMain”,其中包含一个 URL 路径,请参见下面的屏幕截图。
我需要访问 servicesMain URL 路径的数据,我假设要获取它,我需要使用“servicesMain”进行另一个获取调用 URL。
所以我正在尝试的是: 我使用 v-for 遍历 projectsPageChildren,在每个 child 上我调用一个函数“getMainService”,我将 servicesMain URL.
传递给该函数 <div class="card" v-if="projectsPageChildren" v-for="project in projectsPageChildren">
<div class="title">{{ getMainService(project.servicesMain) }}</div>
<div class="title">{{ project.title }}</div>
<Btn :to="project['@path']">More</Btn>
</div>
方法“getMainService”被放置在 VUE 的“方法”钩子中,并使用它作为参数接收的 URL 进行另一个异步调用。
methods: {
async getMainService(servicePath) {
let url = process.env.VUE_APP_MGNL_API_PAGES + servicePath;
await fetch(url)
.then(result => {
result.json().then((data) => {
console.log(data);
console.log(data.title);
return data.title;
});
})
.catch(error => console.log(error));
},
},
函数中的两个控制台日志语句显示了我需要该函数的数据return。
然而,我在浏览器中看到的只是“[object Promise]”。
总结一下:我正在使用 Nuxt 的 fetch() 钩子来获取我的数据,return 是一个数组。数组中的每个 object 都包含一个指向更多数据的 URL。
如何正确设置第二次获取调用?我在这里错过了什么?
我阅读了有关 Nuxt 数据获取和 Javascript 承诺和响应的文档,但 none 似乎完全解决了我的问题。
我最终是这样解决的:
在我的原始代码中,我在 Vue 模板部分调用了方法“getMainService()”,但它不起作用。现在我在 async fetch() 方法中发出第二个请求并从那里调用该方法。在 forEach 循环中,我基本上是将对象的 属性 重写为方法 returns.
这是新代码:
async fetch() {
let thisPageUrl = process.env.VUE_APP_MGNL_API_PAGES + this.projectPage;
await this.$http.$get(thisPageUrl).then(thisPageResult => {
this.projectsPageData = thisPageResult;
})
let childrenUrl = process.env.VUE_APP_MGNL_API_PAGES + this.projectPage + "/@nodes";
await this.$http.$get(childrenUrl).then(projectPages => {
this.projectsPageChildren = projectPages;
this.projectsPageChildren.forEach(projectPage => {
this.getMainService(projectPage.extras[0].serviceMain).then(res => {
projectPage.extras[0].serviceMain = res;
});
})
})
},
fetchOnServer: false,
方法 getMainService() 调用路径和 returns 字符串值:
methods: {
getMainService(servicePath) {
let url = process.env.VUE_APP_MGNL_API_PAGES + servicePath;
return this.$http.$get(url).then(serviceMain => {
return serviceMain.title;
})
},
},
模板位如下所示:
<div>
<div class="card" v-if="projectsPageChildren" v-for="(project, index) in projectsPageChildren">
<div class="column_title">{{ project.serviceMain }}</div>
<div class="title">{{ project.title }}</div>
<Btn :to="project['@path']">More</Btn>
</div>
</div>
也许不是最漂亮的解决方案,但它确实有效。 感谢@kissu 和@GrafiCode,你的评论让我朝着正确的方向前进。