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

Next.js使用useState报错:page非React函数组件/自定义Hook

解决React Hook "useState" 在Next.js页面组件中调用的错误

问题根源

你的代码里定义了大写的Page组件,但最后导出时用了小写的page:

export default page; // 此处为小写,与组件定义的`Page`不匹配

React要求组件名称必须以大写字母开头,ESLint的react-hooks/rules-of-hooks规则会以此判断函数是否为合法React组件。由于导出的是小写page,ESLint无法识别这是一个React组件,因此报错提示useState被调用在非组件/非Hook函数中。

修复步骤

只需将导出语句中的小写page改为大写Page,与组件定义保持一致:

export default Page;

额外优化建议:避免GraphQL变量硬编码拼接

你当前用模板字符串直接把data属性拼进GraphQL查询的写法,存在GraphQL注入风险,且组件每次渲染都会重复创建查询变量,影响性能。建议改用GraphQL变量传递参数:

修改后的查询与提交函数示例

// 将查询定义放在组件外部,避免重复创建
const CREATE_COMMENT = gql`
  mutation Contact($name: String!, $email: String!, $number: String!) {
    createContact(
      data: { name: $name, email: $email, number: $number }
    ) {
      id
      name
      email
      number
    }
  }
`;

const PUBLISH_CONTACT = gql`
  mutation PublishContact($id: ID!) {
    publishContact(
      where: { id: $id }
      to: PUBLISHED
    ) {
      id
      name
      email
    }
  }
`;

const Page = () => {
  const [data, setData] = useState({
    name: "",
    email: "",
    number: "",
  });

  const formSubmit = async (e: any) => {
    e.preventDefault();
    // 通过变量传递参数
    const { createContact }: any = await graphcms.request(CREATE_COMMENT, {
      name: data.name,
      email: data.email,
      number: data.number
    });

    const publish = await graphcms.request(PUBLISH_CONTACT, {
      id: createContact.id
    });

    // 提交后重置表单
    setData({ name: "", email: "", number: "" });
  };

  // ... 其余代码保持不变
};

export default Page;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:15:07