使用 React Context 中的使用效果检查本地存储中是否已有令牌的最佳方法

Best way to check if there is already a token in local storage using use effect in React Context

美好的一天。这是检查我的 AuthContext 的本地存储中是否已经有令牌的最佳方法吗?我使用了一个 useEffect 钩子来检查令牌是否已经存在。我是否应该更改 isAuthenticated 的初始状态,因为它在呈现时始终为 false?我不确定。谢谢

import React, { useState, useContext, useEffect } from "react";

const AuthContext = React.createContext();

export function useAuth() {
    return useContext(AuthContext);
}

export const AuthProvider = ({ children }) => {
    const [isAuthenticated, setAuthenticated] = useState(false);

    const login = () => {
        setAuthenticated(true);
    };

    useEffect(() => {
        const token = localStorage.getItem("AuthToken");
        if (token) {
            setAuthenticated(true);
        } else if (token === null) {
            setAuthenticated(false);
        }

        return () => {};
    }, []);

    return <AuthContext.Provider value={{ isAuthenticated, login }}>{children}</AuthContext.Provider>;
};

我建议使用状态初始化函数,这样您就有了正确的初始状态。您无需等到后续呈现周期才能获得正确的身份验证状态。

const [isAuthenticated, setAuthenticated] = useState(() => {
  const token = localStorage.getItem("AuthToken");
  return token !== null;
});

其余的可能保持不变。

我建议您也提供默认上下文值。

const AuthContext = React.createContext({
  isAuthenticated: false,
  login: () => {},
});

export function useAuth() {
  return useContext(AuthContext);
}

export const AuthProvider = ({ children }) => {
  const [isAuthenticated, setAuthenticated] = useState(() => {
    const token = localStorage.getItem("AuthToken");
    return token !== null;
  });

  const login = () => setAuthenticated(true);
  
  return (
    <AuthContext.Provider value={{ isAuthenticated, login }}>
      {children}
    </AuthContext.Provider>
  );
};