未处理的拒绝(错误):渲染的钩子比上一次渲染时更多(React Interface GrandStack with ApolloClient)

Posted

技术标签:

【中文标题】未处理的拒绝(错误):渲染的钩子比上一次渲染时更多(React Interface GrandStack with ApolloClient)【英文标题】:Unhandled Rejection (Error): Rendered more hooks than during the previous render (React Interface GrandStack with ApolloClient) 【发布时间】:2021-10-15 16:26:23 【问题描述】:

刷新页面时总是出现错误(在本地主机上) 我使用基于 Neo4J 数据库的 GrandStack React 接口,我想创建一个带有数据过滤器的表。 我使用了在here 找到的代码(CodeSandBox 上的完整代码在here)

在我使用我的数据(使用 ApolloClient)之前它工作得非常好

我在开头声明如下查询:

const GET_INSTANCE = gql`
  
    finalTab 
      classObject
      object
      classSubject
      subject
      relation
    
  
`

然后我定义const data并返回下表

  const  loading, error, data  = useQuery(GET_INSTANCE)
  return (
    <Paper>
      loading && !error && <p>Loading...</p>
      error && !loading && <p>Error</p>
      data && !loading && !error && (
        <Table
          columns=columns
          data=React.useMemo(() => data.finalTab, [])
        />
      )
    </Paper>
  )

它确实可以工作并且可以编译,但是一旦我刷新页面,它就会显示以下错误:

未处理的拒绝(错误):渲染的钩子比上一次渲染时更多。

它指向这条线:data=React.useMemo(() =&gt; data.finalTab, [])

编辑: 我还尝试在return语句之前声明数据如下:

  const  loading, error, data  = useQuery(GET_INSTANCE)
  if (error) return <p>error</p>
  if (loading) return <p>Loading...</p>
  const instances = data.finalTab
  const data1 = React.useMemo(() => instances, [])

然后只返回表格:

  return <Table columns=columns data=data1 />

但我仍然得到错误

而且我似乎无法理解我做错了什么, 有人可以帮忙吗? 非常感谢

【问题讨论】:

【参考方案1】:
  const  loading, error, data  = useQuery(GET_INSTANCE)
  const finalTab = React.useMemo(() => data.finalTab, [])
  return (
    <Paper>
      loading && !error && <p>Loading...</p>
      error && !loading && <p>Error</p>
      data && !loading && !error && (
        <Table
          columns=columns
          data=finalTab
        />
      )
    </Paper>
  )

useMemo 是一个钩子,必须在返回任何内容之前进行初始化。

【讨论】:

感谢您的回复,但我不确定我是否明白您的意思,当我在 React 文档中查找 useMemo 时,我没有看到 useMemo 初始化的任何语法,我该如何初始化它钩子? 使用钩子时:useEffect / useCallback / useMemo 等......它应该总是在返回任何东西之前。否则你会在你的标题中得到错误。只需将您的 useMemo 放在您的 useQuery 下方(就像在我的示例中一样)。 从反应文档中,您不能使用带有条件运算符的钩子。 reactjs.org/docs/hooks-overview.html#rules-of-hooks这就是为什么你应该在退货之前把你的钩子放好。

以上是关于未处理的拒绝(错误):渲染的钩子比上一次渲染时更多(React Interface GrandStack with ApolloClient)的主要内容,如果未能解决你的问题,请参考以下文章

React - 出现“渲染的钩子比上一次渲染时更多”错误

当钩子的初始值是来自数据库的查询结果时,“比上一次渲染期间渲染的钩子更多”错误

使用 useEffect 渲染的钩子比上一次渲染时更多

React/NextJS 使用 UseEffect 错误:渲染的钩子比上一次渲染期间更多

渲染的钩子比上一次渲染时更多

React Hooks 渲染的钩子比上一次渲染时更多