【发布时间】:2021-02-09 15:51:51
【问题描述】:
我遇到了来自@apollo/client 的useQuery 的问题
我有一个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),它会更新为未定义 - 正如预期的那样。
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;
};
出于某种原因,Navbar 中的这个 useQuery 出于某种原因保留了这些陈旧的数据,我不知道如何使其正常工作。
更新 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
};
【问题讨论】:
-
您是否通过控制台在导航栏组件内记录用户数据来检查导航栏是否在您注销后重新呈现?
标签: javascript reactjs graphql apollo