useQuery 和 useState 是不是仅在组件安装时触发?
Posted
技术标签:
【中文标题】useQuery 和 useState 是不是仅在组件安装时触发?【英文标题】:Does useQuery and useState fire only on component mount?useQuery 和 useState 是否仅在组件安装时触发? 【发布时间】:2020-03-22 03:58:23 【问题描述】:我今天对这种行为感到有些困惑,希望您能对此有所了解。很抱歉懒得写最小的代码版本,但应该很容易理解。
我有一个 React 组件(您填写并提交它的表格),其中包括另一个组件(面包屑组件)。 Breadcrumb 在禁用此表步骤之后有步骤 - 这是由从 GraphQl API 返回的布尔值管理的,它检查表是否已填写。
我面临的问题是我的 GraphQl API 没有在 Breadcrumb 组件重新渲染时触发 - 并且 - 我还将一个道具从 TableComponent 传递到 Breadcrumb 并存储在 BreadCrumb 的 useState 中 - 但是 - 默认状态没有改变。
这是为什么? GraphQl 查询和 useState 是否仅在组件挂载时更新,而不是在每次渲染时更新?
【问题讨论】:
【参考方案1】:您的查询很可能是从缓存中解析的。您必须明确使用禁用从缓存解析的获取策略。依靠重新渲染来触发查询听起来像是您可能想要避免的事情。相反,您可以使用触发refetch query 的useEffect
。然后,您的效果可以侦听(通过将依赖项列为第二个参数)您实际想要观察的值。您的架构可能不太完善。我听到的另一件事是您正在从道具创建状态。同样,除非您确切知道自己在做什么,否则您应该避免这样做。
为什么您的组件不能简单地接收属性tableCompleted
?
【讨论】:
它不是缓存 - 我将“无缓存”作为默认设置,甚至使用“无缓存”作为参数@此特定查询。我最终使用了 useEffect 来监听道具( tableCompleted 是道具)并调用 refetch() - 但无论如何 - 我不明白为什么我必须这样做。为什么你的意思是我应该避免从道具创建状态?我知道这有点囧,我本来打算解决这个查询问题,但事实上,状态没有存储在渲染上确实让我感到惊讶。你知道,如果钩子只在组件安装时触发,而不是渲染? 我不确定你所说的 hooks fire 是什么意思?也许您真的应该创建一个显示您的意思的存储库。useState
保留多个渲染的状态并在更改时触发重新渲染。当依赖关系发生变化时,使用效果触发器。 useRef
也可用于跨渲染保持值。
火 - 被调用
我能隐约联想到 fire 的唯一钩子是 useEffect
钩子。这是一个通用的钩子概念吗?效果不同于生命周期事件:dev.to/ijones16/stop-thinking-in-lifecycle-methods-1fjj以上是关于useQuery 和 useState 是不是仅在组件安装时触发?的主要内容,如果未能解决你的问题,请参考以下文章
仅在第一次以惯用方式和优雅方式呈现组件时执行 react-apollo-hooks useQuery