You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Apollo Client传入特定ID并解决文章详情页加载异常问题

解决Apollo Client获取文章详情的异常问题

我来帮你梳理下当前代码里的问题,主要有几个关键错误导致了异常,咱们一步步修正:

1. 查询结果的解构逻辑错误

你的GraphQL查询返回的data对象是嵌套结构的——因为你查询的字段是singleDetail,所以实际data的格式是 { singleDetail: { id, title, content } },但你直接从data里解构id、title,这会导致这些变量未定义,直接引发错误。

2. 多余的按钮点击处理

你在NavLink包裹的按钮上添加了onClick={() => detailPostButton(id)},但这个detailPostButton函数只是手动调用了SinglePostShow({id}),这完全是多余的操作:NavLink已经会跳转到对应路由,路由匹配后SinglePostShow组件会自动渲染并执行查询,这个额外的函数调用不仅没用,还可能引发不必要的渲染异常。

3. Input标签的写法错误

你写的<input>{title}</input>是不符合HTML规范的,input标签需要通过value属性来展示内容,直接把文本放在标签内部会报错。


修改后的完整代码

文章列表组件(移除多余的点击逻辑)

// 直接删掉这个没用的函数
// const detailPostButton = (id:number) => SinglePostShow({id})

return (
  <Col span={6} key={id}>
    <div style={{ backgroundColor: 'beige' }}>
      <p>title:{title}</p>
      <p>content:{content}</p>
      <div className="buttonPlace">
        <Button onClick={() => deletePostButton(id)}>削除</Button>
        <div>
          {/* 只保留NavLink跳转,去掉多余的onClick */}
          <NavLink to={`/AllPostsShow/${id}`}>
            <Button>詳細</Button>
          </NavLink>
        </div>
      </div>
    </div>
  </Col>
)

文章详情组件SinglePostShow(修复解构与Input)

import { useQuery, gql } from '@apollo/client'
// 建议把$id改成非空Int,和后端定义匹配(后端返回非空Post,id必填)
const SINGLE_POST_DETAIL = gql`
query singleDetail($id: Int!) {
  singleDetail(id: $id) {
    id
    title
    content
  }
}
`
export const SinglePostShow = ({id}:{id:number}) => {
  console.log(id,'id')
  const { data, loading, error } = useQuery(SINGLE_POST_DETAIL,{
    variables:{ id },
  })
  if (loading) return <p>Loading...</p>
  if (error) {
    // 加上错误日志方便排查
    console.error('文章详情查询出错:', error)
    return <p>加载文章详情失败...</p>
  }
  // 从data.singleDetail里解构数据,这是正确的结构
  const {id:singleId,title,content} = data.singleDetail
  return (
    <div key={singleId}>
      <h3>detailForm</h3>
      {/* 使用value属性展示内容,添加readOnly防止误编辑(需要编辑的话可以去掉) */}
      <input value={title} readOnly />
      <input value={content} readOnly />
    </div>
  )
}
export default SinglePostShow

额外优化建议

  • 后端的Query定义里,singleDetail(id:Int)建议改成singleDetail(id:Int!),因为你返回的是Post!(非空文章),不传id的话查询必然失败,强制id为必填能避免潜在的空值问题,前端的GraphQL查询也对应改成$id: Int!即可。
  • 保留错误日志的输出,方便后续排查类似问题。

内容的提问来源于stack exchange,提问作者businessryuya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 19:22:37