我有一个应用程序,它的标题包含图标,用户登录时应该显示该图标。我将登录信息保存在sessionStorage
中,但当它更改时,我的组件不会再次呈现。我试着使用useEffect
和useMemo
,但没有成功。
更新部分:
const isLoggedIn = useMemo(() => sessionStorage.getItem('isLogged'), [sessionStorage.getItem('isLogged')]);
用途:
{isLoggedIn === 'true' ? ['left'].map((anchor) => (
...some jsx
)) : null}
CCD_ 4值是一个字符串:;false";或";真";。
我有路由和常量标头,标头不是路由的一部分,所以当它更改时,我的标头不会重新发送,所以我尝试使用useMemo。
根据通过评论获得的澄清发布我的答案。
如果您使用Redux
:
我建议将用户登录信息存储在redux store
中,并通过连接HOC和mapStateToProps
连接到隔离标头组件。无论何时更新(用户登录成功后(用户登录状态,组件都会侦听store
更新。
或
如果没有使用redux
的,则可以使用Reactcontext
方法
// Declare it outside of your App component/any other file and export it
const GlobalState = React.createContext();
// Declare state variable to store user logged in info inside of your App component
const [isLoggedIn, setIsLoggedIn] = useState(false);
// Add them to context to access anywhere in your components via useContext
// In App render or where you have route mapping
<GlobalState.Provider value={{
isLoggedIn,
setIsLoggedIn
}}>
....
</GlobalState.Provider>
// Update the status using setIsLoggedIn upon successful login where you are making login call
// In your Header get it via useContext
const context = useContext(GlobalState);
`context.isLoggedIn` is what you need.
// You can use useEffect/useMemo approach to get the login status updates
查找有关React上下文和useContext 的更多信息
sessionStorage不是观察器对象,您必须将当前身份验证状态存储到变量或React状态中,并在组件中使用该变量。当您对用户进行身份验证时,您应该将变量更新为true
,并在用户注销时将其更改为false
。要实现我所说的,您可以通过以下方式获得帮助:
- Redux
- React上下文
您可以通过自己从头开始或使用React hooks全局状态来实现React上下文
const isLoggedIn = useCallback(() => sessionStorage.getItem('isLogged'), [sessionStorage.getItem('isLogged')]);
您能尝试将sessionStorage
数据放入State
并更新该状态吗?据我所知,react不会知道会话存储。因此,即使您直接更改会话存储中的操作数据,它也不会更新您的UI。
let [storeData, setStoreData] = useState(true);
let isLoggedIn = useMemo(() => ({ sessionData: storeData }), [storeData]);
{isLoggedIn === 'true' ? ['left'].map((anchor) => (
...some jsx
)) : null}
<button
onClick={() => {
sessionStorage.setItem("isLogged", !storeData);
setStoreData(sessionStorage.getItem("isLogged"));
}} > Update Store </button>