Return 仅当 API returns 来自 React 后端的成功响应时来自函数
Return from a funtion only when API returns a success response from backend in React
我需要有关 react-router-6.Actually 中私有路由的帮助,我想 return 只有当后端 API return 成功时回复。
请看下面的代码片段,
export default function PrivateOutlet() {
const dispatch = useDispatch();
useEffect(() => {
dispatch(getCurrentUser())
.then((res) => {
localStorage.setItem('id', res.id);
})
.catch(error => console.log(error) );
}, [);
return (localStorage.getItem('id') !== "undefined") ? <Outlet /> : <Navigate to="/login" />
};
这里的问题是,在 return 从 getCurrentUser() API 这个函数 PrivateOutlet return 的值获得成功响应之前。
你能帮忙吗?
如果您真正想要的是使用 getCurrentUser
操作来获取 id
,则 localStorage 似乎完全 extraneous/superfluous。使用与已验证或未验证的 id
值不匹配的本地状态 id
。等到 id
状态被填充以呈现 Outlet
或重定向。
示例:
export default function PrivateOutlet() {
const [id, setId] = React.useState();
const dispatch = useDispatch();
useEffect(() => {
dispatch(getCurrentUser())
.then((res) => {
setId(res.id); // valid id or null
})
.catch(error => {
console.log(error);
setId(null);
);
}, []);
if (id === undefined) return null; // or loading indicator/spinner/etc
return (id)
? <Outlet />
: <Navigate to="/login" replace />
};
如果想继续使用 localStorage,则使用本地“正在加载”状态并有条件地呈现 null
或一些加载指示器,直到获取当前用户 ID。另外,我不确定这是否是一个错字,但您很可能打算将 localStorage 的值与 undefined
而不是 [=33 进行比较=] 字符串文字 "undefined"
。这仍然有效,因为加载状态更新触发了重新渲染,并且组件可以读取刚刚在 localStorage 中设置的 id
值。
示例:
export default function PrivateOutlet() {
const [isLoaded, setIsLoaded] = React.useState(false);
const dispatch = useDispatch();
useEffect(() => {
dispatch(getCurrentUser())
.then((res) => {
localStorage.setItem('id', res.id);
})
.catch(error => {
console.log(error);
localStorage.removeItem('id');
)
.finally(() => setIsLoaded(true));
}, []);
if (!isLoaded) return null; // or loading indicator/spinner/etc
return (localStorage.getItem('id') !== undefined)
? <Outlet />
: <Navigate to="/login" replace />
};
我需要有关 react-router-6.Actually 中私有路由的帮助,我想 return 只有当后端 API return 成功时回复。 请看下面的代码片段,
export default function PrivateOutlet() {
const dispatch = useDispatch();
useEffect(() => {
dispatch(getCurrentUser())
.then((res) => {
localStorage.setItem('id', res.id);
})
.catch(error => console.log(error) );
}, [);
return (localStorage.getItem('id') !== "undefined") ? <Outlet /> : <Navigate to="/login" />
};
这里的问题是,在 return 从 getCurrentUser() API 这个函数 PrivateOutlet return 的值获得成功响应之前。 你能帮忙吗?
如果您真正想要的是使用 getCurrentUser
操作来获取 id
,则 localStorage 似乎完全 extraneous/superfluous。使用与已验证或未验证的 id
值不匹配的本地状态 id
。等到 id
状态被填充以呈现 Outlet
或重定向。
示例:
export default function PrivateOutlet() {
const [id, setId] = React.useState();
const dispatch = useDispatch();
useEffect(() => {
dispatch(getCurrentUser())
.then((res) => {
setId(res.id); // valid id or null
})
.catch(error => {
console.log(error);
setId(null);
);
}, []);
if (id === undefined) return null; // or loading indicator/spinner/etc
return (id)
? <Outlet />
: <Navigate to="/login" replace />
};
如果想继续使用 localStorage,则使用本地“正在加载”状态并有条件地呈现 null
或一些加载指示器,直到获取当前用户 ID。另外,我不确定这是否是一个错字,但您很可能打算将 localStorage 的值与 undefined
而不是 [=33 进行比较=] 字符串文字 "undefined"
。这仍然有效,因为加载状态更新触发了重新渲染,并且组件可以读取刚刚在 localStorage 中设置的 id
值。
示例:
export default function PrivateOutlet() {
const [isLoaded, setIsLoaded] = React.useState(false);
const dispatch = useDispatch();
useEffect(() => {
dispatch(getCurrentUser())
.then((res) => {
localStorage.setItem('id', res.id);
})
.catch(error => {
console.log(error);
localStorage.removeItem('id');
)
.finally(() => setIsLoaded(true));
}, []);
if (!isLoaded) return null; // or loading indicator/spinner/etc
return (localStorage.getItem('id') !== undefined)
? <Outlet />
: <Navigate to="/login" replace />
};