我遇到useQuery
中的@apollo/client
的问题
我有一个Navbar
组件
const Navbar = () => {
const { loading, data, error } = useQuery(GET_CURRENT_USER);
console.log('navbar', data)
return <ReactStuff />
}
我还有一个UserProfile
组件,它允许用户通过按钮注销。当用户按下按钮时,将运行以下代码:
const {
getCurrentUser,
changePassword,
changePasswordData,
logoutUser,
} = useUsers();
const logout = () => {
logoutUser();
localStorage.removeItem("authToken");
props.history.push("/");
};
useUsers
是一个自定义钩子,其中包含resetStore函数:
const useUser = () => {
const { client, loading, error, data, refetch } = useQuery(GET_CURRENT_USER);
const logoutUser = () => {
console.log("firing logout user");
client
.resetStore()
.then((data) => {
console.log("here in reset store success");
})
.catch((err) => {
console.log("here in error");
}); // causes uncaught error when logging out.
};
return {
// other useUser functions
logoutUser
}
}
现在,我无法确定为什么按下Navbar
时logout
组件不会得到更新。
我有一个withAuth
高阶组件,它执行完全相同的查询,因此绝对可以正常工作。用户被发送到/ login页面,并且如果我去过console.log(data)
,它会被更新为undefined-符合预期。
import { GET_CURRENT_USER } from "../graphql/queries/user";
/**
* Using this HOC
* we can check to see if the user is authed
*/
const withAuth = (Component) => (props) => {
const history = useHistory();
const { loading, data, error } = useQuery(GET_CURRENT_USER);
if (error) console.warn(error);
if (loading) return null;
if (data && data.user) {
return <Component {...props} />;
}
if (!data) {
history.push("/login");
return "null";
}
return null;
};
出于某种原因,useQuery
中的Navbar
出于某种原因保留了该过时的数据,我不知道如何使它正确运行。
更新1:
我已将logoutUser
函数更改为使用clearStore()
,并且发生了同样的事情,导航栏未更新,但是我重定向到了/login
并且withAuth可以正常工作。
const logoutUser = () => {
client
.clearStore()
.then((data) => console.log(data)) // logs []
.catch((err) => console.log(err)); // no error because no refetch
};
答案 0 :(得分:1)
您不是在等待存储重置,可能是在重置完成之前发生了重定向和存储清理,请尝试在重置完成后执行
COPY