渲染的钩子比上一个渲染期间更多

时间:2019-08-19 16:05:15

标签: react-hooks react-apollo react-apollo-hooks

如何将2个graphql查询与react-apollo-hooks结合使用,其中第二个查询取决于从第一个查询中检索到的参数?

我尝试使用2个看起来像这样的查询:

const [o, setO] = useState()

const { loading: loadingO, error: errorO, data: dataO } = useQuery(Q_GET_O, { onCompleted: d => setO(d.getO[0].id) });

if (loadingO) { return "error" }

const { loading: loadingOP, error: errorOP, data: dataOP } = useQuery(Q_GET_OP, { variables: { o } })

但是,当我运行我的项目时,react-hooks给我以下消息:

“ index.js:1437警告:React已检测到升级所引起的Hooks顺序的更改。如果未修复,这将导致错误和错误。有关更多信息,请阅读Hooks规则”

我想知道如何使用react-apollo-hooks来运行依赖于另一个查询的查询。如果事先知道graphql查询变量,则效果很好。但是,我没有找到来自其他查询的变量的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以将skip选项添加到第二个查询中,并失去if条件:

const { loading: loadingOP, error: errorOP, data: dataOP } 
    = useQuery(Q_GET_OP, { variables: { o }, skip: !o  })
来自文档的

If skip is true, the query will be skipped entirely

答案 1 :(得分:1)

这里的问题是,所有钩子都有运行之前,您正在短路返回。

如果您在所有钩子有机会被调用之前退出渲染函数,React将会抱怨。

例如:

function BrokenFoo () {
  const query = useSomeQuery();
  if (query.loading) return <Loading />

  // This will cause some issues because 
  // it's possible that we return before our useState hook gets called

  const [bar, setBar] = useState();

  return <SomeComponent bar={bar} setBar={setBar} data={query.data} />
}

要解决:

function FixedFoo () {
  // This will be fine because 
  // all of the hooks have a chance to be called before a return
  const query = useSomeQuery();
  const [bar, setBar] = useState();

  if (query.loading) return <Loading />

  return <SomeComponent bar={bar} setBar={setBar} data={query.data} />
}