vue.js Nuxt 3中的嵌套useFetch

332nm8kg  于 2022-11-25  发布在  Vue.js
关注(0)|答案(3)|浏览(998)

如何在Nuxt 3中实现嵌套获取?我有两个API。第二个API必须基于第一个API中返回的值触发。
我尝试了下面的代码片段,但是它不起作用,因为page.Id在被调用时是null。我知道第一个API返回有效数据。所以我猜第二个API在第一个API返回结果之前被触发。

<script setup>
  const route = useRoute()
  const { data: page } = await useFetch(`/api/page/${route.params.slug}`)
  const { data: paragraphs } = await useFetch(`/api/page/${page.Id}/paragraphs`)
</script>

显然,这是一个简单的尝试,因为没有检查第一个API是否返回任何数据,甚至没有等待响应。
在Nuxt2中,我会把第二个API调用放在.then()中,但是对于这个新的组合API设置,我有点不知所措。

pepwfjgg

pepwfjgg1#

您可以监视page,然后在页面可用时运行API调用,您应该将paragraphs作为ref,然后将析构的数据分配给它:

<script setup>
const paragraphs = ref()

const route = useRoute()

const { data: page } = await useFetch(`/api/page/${route.params.slug}`)

watch(page, (newPage)=>{
    if (newPage.Id) {

      useFetch(`/api/page/${newPage.Id}/paragraphs`).then((response)=>{
         paragraphs.value  = response.data

     })
        
    }
}, {
    deep: true,
    immediate:true
})
</script>
koaltpgm

koaltpgm2#

一个解决方案是避免使用await。另外,使用引用来保存值。这将允许您的UI和其他逻辑是React式的。

<script setup>
  const route = useRoute()
  const page = ref()
  const paragraphs = ref()
  useFetch(`/api/page/${route.params.slug}`).then(it=> {
     page.value = it
     useFetch(`/api/page/${page.value.Id}/paragraphs`).then(it2=> {
        paragraphs.value = it2
     }
  }
</script>
cqoc49vn

cqoc49vn3#

您可以将第二个useFetch设置为不立即执行,直到第一个具有值:

<script setup>
  const route = useRoute()
  const { data: page } = await useFetch(`/api/page/${route.params.slug}`)
  const { data: paragraphs } = await useFetch(`/api/page/${page.value?.Id}/paragraphs`, {
    // prevent the request from firing immediately
    immediate: false,
    // watch reactive sources to auto-refresh
    watch: [page]
  })
</script>

你也可以在这里省略watch选项,然后手动execute第二个useFetch。但是为了让它得到更新,你需要传递一个返回url的函数:

const { data: page } = await useFetch(`/api/page/${route.params.slug}`)
const { data: paragraphs, execute } = await useFetch(() => `/api/page/${page.value?.Id}/paragraphs`, {
  immediate: false,
})

watch(page, (val) => {
  if (val.Id === 69) {
    execute()
  }
})

永远不要在挂接内调用可组合对象。
更多useFetch选项可参见here

相关问题