[nuxt]useFetch客户端渲染 data返回为null

2023-12-12 449 views
8
Environment
  • Operating System: Darwin
  • Node Version: v18.16.0
  • Nuxt Version: 3.5.3
  • Nitro Version: 2.4.1
  • Package Manager: yarn@1.22.19
  • Builder: vite
  • User Config: app, components, runtimeConfig, modules, pinia, vite, css, alias, experimental
  • Runtime Modules: @pinia/nuxt@0.4.11, nuxt-icon@0.4.2
  • Build Modules: -
Reproduction
onMounted(async () => {
    if (process.client) {
        const { data } = await useFetch('http://192.168.0.134:9900/api/order/quotationbar/queryQuotationBarNumber', {
            method: 'post',
            headers: {
                Authorization: 'bearer b70d7091-aa41-4857-9eec-1b1ef336043f',
            },
            server: false,
            lazy: true,
        })
        console.log(data)
    }
})

data为null

Describe the bug

客户端渲染获取到data为null

Additional context

做了以下尝试

onMounted请求 判断process.client 修改useFetch配置为server为false lazy为true

都获取不到数据

在浏览器的network是可以看到请求成功的~

Logs

No response

回答

9
image
6
image
4

前边增加了个await nextTick() 解决了 但是不知道是否是正确的用法

8
你能解释一下你想做什么吗?我发现根据描述有点难以弄清楚。但是使用时数据将为空lazy: true。例如,您可以设置默认值以返回空数组,或者检查请求是否处于待处理状态并显示加载微调器
5

我想实现进入页面购物车数量的加载,客户端发送请求,lazy:true 只是我的一个尝试

1
const { data, pending } = await useFetch('http://192.168.0.134:9900/api/order/quotationbar/queryQuotationBarNumber', {
            method: 'post',
            headers: {
                Authorization: 'bearer b70d7091-aa41-4857-9eec-1b1ef336043f',
            },
            lazy: true,
        })

在顶层,而不是嵌套在 onMounted 等中,这将是我所追求的。然后在您的模板中检查 v-if="pending" 并相应地呈现您的加载状态

1

那我应该如何正确的处理他,从客户端获取数据,目前我用await nextTick()解决了这个问题 但是我感觉这样式不科学的

image
4

onMounted中会立即触发useFetch的then,其中的data就为null,因此直接在then内进行缓存操作应该是不行的,我也在头疼这个问题,或许应该抛弃useFetch,而我的方式是封装useFetch,传入回调函数,在onResponseCallback中进行操作,感觉也并不是很棒。

2

use $fetch

8

我也遇到了这个问题,为什么第一次请求有,刷新浏览器就 Chrome网络面板就看不到发送的请求,useFetch返回的data为 null,网上说清缓存,useClearData试了没效果,

const cards = ref([])

async function queryAccess() {
  const defaultQueryObj = {
    conditions: [],
    limit: 10,
    start: 0,
    count: false,
    replyWithCount: true,
    noError: false,
    sortBy: 'createDate',
    sortDirection: 'asc',
  }

  const { data } = await useFetch('/website/api', {
    // key: 'queryAccess',
    method: 'POST',
    body: {
      'com.syscxp.header.website.access.APIQueryQuickAccessMsg': defaultQueryObj,
    },
  })
  return data.value as any
}

const dv = await queryAccess()
// await clearNuxtData('queryAccess')
const result = dv ? Object.values(JSON.parse(dv.result))[0] as any : {}
cards.value = result.success ? result.inventories : []
console.log('[ cards.value  ]-114', cards.value)
使用$fetch项目直接报错

image

使用await nextTick()也报错
const cards = ref([])

async function queryAccess() {
  const defaultQueryObj = {
    conditions: [],
    limit: 10,
    start: 0,
    count: false,
    replyWithCount: true,
    noError: false,
    sortBy: 'createDate',
    sortDirection: 'asc',
  }
  await nextTick()
  const { data } = await useFetch('/website/api', {
    key: 'queryAccess',
    method: 'POST',
    body: {
      'com.syscxp.header.website.access.APIQueryQuickAccessMsg': defaultQueryObj,
    },
  })
  return data.value as any
}
// await clearNuxtData('queryAccess')
const dv = await queryAccess()
const result = dv ? Object.values(JSON.parse(dv.result))[0] as any : {}
cards.value = result.success ? result.inventories : []
console.log('[ cards.value  ]-114', cards.value)

image

7

set useNuxtApp().payload.serverRendered = false

8

set useNuxtApp().payload.serverRendered = false

8

这种方式就不走服务端渲染了,渲染页面能展示,但是检查网页源代码发现只渲染了空标签没实际的内容,这种方式还能做seo吗?