next中服务端组件共享接口数据

1、首先创建一个共享的数据获取文件:

getSharedData.ts

javascript 复制代码
import { cache } from 'react'
import { getAnchorArticle } from '@/service/supabase/api/article'
import { getMaterialCategory } from '@/service/supabase/api/materials'
import { getTechnologyCategory } from '@/service/supabase/api/technology'

export type SharedData = {
  anchorArticle: any // 替换为实际的类型
  materialCategory: any // 替换为实际的类型
  technologyCategory: any // 替换为实际的类型
}

export const getSharedData = cache(async (): Promise<SharedData | null> => {
  try {
    const [anchorArticle, technologyCategory, materialCategory] = await Promise.all([
      getAnchorArticle(),
      getTechnologyCategory(),
      getMaterialCategory(),
    ])

    return {
      anchorArticle,
      technologyCategory,
      materialCategory,
    }
  } catch (error) {
    console.error('Error fetching shared data:', error)
    return null
  }
})

2、然后在需要使用这些数据的服务端组件中:

index.tsx

javascript 复制代码
import { getSharedData } from '@/lib/getSharedData'

const Header = async () => {
  const data = await getSharedData()
  const { anchorArticle, technologyCategory, materialCategory } = data!

  return (
    // ... rest of the component
  )
}

3、在其他服务端组件中也可以直接使用:

SomeOtherServerComponent.tsx

javascript 复制代码
import { getSharedData } from '@/lib/getSharedData'

const SomeOtherServerComponent = async () => {
  const data = await getSharedData()
  // 使用相同的数据,不会触发新的请求
  
  return (
    // ... component JSX
  )
}

这种方式的优点:

  • 数据获取逻辑集中管理,易于维护
  • 使用 cache 确保多个组件调用时只请求一次
  • 可以在 getSharedData.ts 中定义清晰的类型
  • 便于添加错误处理和数据转换逻辑

如果某些组件只需要部分数据,你也可以拆分成多个更小的缓存函数:

getSharedData.ts

javascript 复制代码
export const getAnchorArticleData = cache(async () => {
  return await getAnchorArticle()
})

export const getMaterialCategoryData = cache(async () => {
  return await getMaterialCategory()
})

export const getTechnologyCategoryData = cache(async () => {
  return await getTechnologyCategory()
})

这样组件可以只获取它们需要的数据:

javascript 复制代码
const SomeComponent = async () => {
  // 只获取需要的数据
  const anchorArticle = await getAnchorArticleData()
  
  return (
    // ... component JSX
  )
相关推荐
kyriewen8 分钟前
我用 Codex 重写了同事维护三年的代码,他没说谢谢——而是找了领导
前端·javascript·ai编程
OpenTiny社区21 分钟前
从零开发 AI 聊天页要两周?试试这款 Vue3 垂直对话组件库 TinyRobot,直接开箱即用
前端·vue.js·github
铁皮饭盒37 分钟前
S3已成为文件存储标准,阿里/腾讯/华为云都支持,Bun率先原生支持
前端·javascript·后端
Cobyte42 分钟前
22.Vue Vapor 组件 props 的实现
前端·javascript·vue.js
lichenyang45342 分钟前
从 has.showToast 看 ASCF 的 API 调用链路
前端
张就是我1065922 小时前
DOMPurify 的一个漏洞:你以为 {} 是空的?
前端
浮生望3 小时前
JS字符串与回文算法:从包装类到双指针的面试进阶之路
javascript·算法
疯狂的魔鬼3 小时前
一套 Schema 驱动四视图:记 useCrudSchemas 的设计与实践
前端·javascript·typescript
风骏时光牛马3 小时前
大模型开发工具高频故障与实操问题汇总代码案例大全
前端
没落英雄3 小时前
2. 让 Agent 能读写文件、执行命令 —— LocalShellBackend 实战
前端·人工智能·架构