更新sessionStorage时,useMemo不起作用



我有一个应用程序,它的标题包含图标,用户登录时应该显示该图标。我将登录信息保存在sessionStorage中,但当它更改时,我的组件不会再次呈现。我试着使用useEffectuseMemo,但没有成功。

更新部分:

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。要实现我所说的,您可以通过以下方式获得帮助:

  1. Redux
  2. React上下文

您可以通过自己从头开始或使用React hooks全局状态来实现React上下文

UseMemo用于存储计算值。您应该使用useCallback。useCallback用于记忆函数引用。参考本
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>

相关内容

  • 没有找到相关文章

最新更新