【发布时间】:2021-08-26 10:59:23
【问题描述】:
对于一个项目,我通过在上下文中运行 AuthenticationProvider 内的 GraphQL 查询来实现身份验证,我注意到该查询两次获取数据。
const AuthenticationProvider: FC = props => {
const {
loading,
data
} = useQuery(MeQuery)
if (loading) return null
return <AuthenticationContext.Provider value={{user: data?.me || null}} {...props} />
}
尽管查询运行完美,但我仍然想知道为什么它会两次获取数据。我做了一些谷歌搜索,遇到了这个问题,其中提供了this answer。我尝试了同样的事情,使用 skip 选项,基于数据是否加载。
const [skip, setSkip] = useState(false)
const {
loading,
data
} = useQuery(MeQuery, { skip })
useEffect(() => {
if (!loading && data?.me) {
setSkip(true)
}
}, [loading, data])
// ...
但是登录后就停止工作了。
const useLoginMutation = () => useMutation(LOGIN_QUERY, { update: (cache, { data }) => {
if (!data) {
return null
}
cache.writeQuery({ query: MeQuery, data: { me: data.login } })
}
})
缓存仍然使用正确的值更新,但不再检索用户(null)。
const { user } = useContext(AuthenticationContext)
我在这里缺少什么?查询似乎确实运行并获取了正确的数据。
【问题讨论】:
标签: reactjs apollo-client react-apollo react-context