使用 useState 存储来自 useQuery 的数据

Fel*_*ger 9 javascript reactjs graphql react-apollo react-hooks

我正在使用 React 钩子来获取 GraphQL 数据react-apollo并存储本地状态:

const [userData, setUserData] = useState({})
const { loading, error, data } = useQuery(USER_QUERY)
Run Code Online (Sandbox Code Playgroud)

但是,我想知道如何存储datauserData. 这是它应该如何工作:

useEffect(() => {
  setUserData(data)
}, [Object.entries(data).length])
Run Code Online (Sandbox Code Playgroud)

小智 12

看起来你所拥有的可能有效。参数中还有一个onCompleted可用选项options。它需要一个回调类型:

(data: TData | {}) => void
Run Code Online (Sandbox Code Playgroud)

所以这是另一种方式:

const { loading, error, data } = useQuery(USER_QUERY, {onCompleted: setUserData})
Run Code Online (Sandbox Code Playgroud)

  • 我认为“onCompleted”应该是“onSuccess”。 (3认同)

Chr*_* B. 8

您想对返回的数据做什么,而这些数据是您无法通过简单地将其用作从查询挂钩解构来完成的?在大多数用例中,它可以立即使用,因为它会在重新获取时自行更新。

如果有必要(并且可能是),正如另一个答案所说,useEffect您发布的钩子应该可以工作,但我会将依赖替换为 simple data,以防止响应具有相同长度的边缘情况,其中包含不同的数据和不更新:

useEffect(() => {
  setUserData(data)
}, [data])
Run Code Online (Sandbox Code Playgroud)

  • 不建议以这种方式使用`useEffect`,因为它仅在组件安装后运行,导致`loading` === true 和`setUserData` 填充之间存在延迟。更多信息请参阅 React 文档 https://beta.reactjs.org/learn/you-might-not-need-an-effect (3认同)