React 首先给出 null 值,一段时间后值被初始化

发布于 2025-01-20 16:26:56 字数 2098 浏览 3 评论 0原文

我正在尝试创建一个组件以进行验证,无论是否对用户进行身份验证。 但是,我不是要重定向登录,但是,当我检查是否已进行身份验证时,首先是null,2000毫秒后的会话表示已进行身份验证。

app.js

    function App() {
    
     const session = useSelector((state) => state.user.user);
useEffect(() => {
    if (token) {
      axios
        .get(`http://localhost:4500/api/user/current`, {
          headers: {
            token: token,
          },
        })
        .then((res) => {
          dispatch(login(res.data));
        });
    } else {
      dispatch(logout());
      console.log("no token");
    }
  }, []);
    
      
      console.log(session?.role + " XX S"); //first goes null and then after it is initialized
    
      return (
    
     <Route
                element={
                  <RequireAuth allowedRoles={[3]} session_role={session?.role} /> //session?.role first is null and it is a problem with the logic of validation
                }
              >
                <Route path="/protected" element={<Protected />} />
              </Route>
    
    )

    const RequireAuth = ({ allowedRoles, session_role }) => {
  const session = useSelector((state) => state.user.user);
  const location = useLocation();

  console.log(session_role + " ROLE ");

  return session_role?.find((role) => allowedRoles?.includes(role)) ? (
    <Outlet />
  ) : session ? (
    <Navigate to="/unauthorised" state={{ from: location }} replace />
  ) : (
    <Navigate to="/login" state={{ from: location }} replace />
  );
};

export default RequireAuth;

需要

export const userSlice = createSlice({
  name: "user",
  initialState: {
    user: null,
    isLoggedIn: false,
  },
  reducers: {
    login: (state, action) => {
      state.user = action.payload;
      state.isLoggedIn = true;
    },
    logout: (state) => {
      state.user = null;
      state.isLoggedIn = false;
    },
  },
});

/I.SSTATIC.NET/XQ1QN.png“ rel =” nofollow noreferrer“>

I am trying to create a component to make the validation if the user is authenticated or not.
It is not I am redirecting to log in, however, when I am checking if is it authenticated, first the session is null and after 2000ms says that is authenticated.

App.js

    function App() {
    
     const session = useSelector((state) => state.user.user);
useEffect(() => {
    if (token) {
      axios
        .get(`http://localhost:4500/api/user/current`, {
          headers: {
            token: token,
          },
        })
        .then((res) => {
          dispatch(login(res.data));
        });
    } else {
      dispatch(logout());
      console.log("no token");
    }
  }, []);
    
      
      console.log(session?.role + " XX S"); //first goes null and then after it is initialized
    
      return (
    
     <Route
                element={
                  <RequireAuth allowedRoles={[3]} session_role={session?.role} /> //session?.role first is null and it is a problem with the logic of validation
                }
              >
                <Route path="/protected" element={<Protected />} />
              </Route>
    
    )

RequireAuth.js

    const RequireAuth = ({ allowedRoles, session_role }) => {
  const session = useSelector((state) => state.user.user);
  const location = useLocation();

  console.log(session_role + " ROLE ");

  return session_role?.find((role) => allowedRoles?.includes(role)) ? (
    <Outlet />
  ) : session ? (
    <Navigate to="/unauthorised" state={{ from: location }} replace />
  ) : (
    <Navigate to="/login" state={{ from: location }} replace />
  );
};

export default RequireAuth;

Reducer

export const userSlice = createSlice({
  name: "user",
  initialState: {
    user: null,
    isLoggedIn: false,
  },
  reducers: {
    login: (state, action) => {
      state.user = action.payload;
      state.isLoggedIn = true;
    },
    logout: (state) => {
      state.user = null;
      state.isLoggedIn = false;
    },
  },
});

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

三生池水覆流年 2025-01-27 16:26:56
function App() {
  const dispatch = useDispatch();
  let token = 1;
  useEffect(() => {
    async function initializeToken() {
      if (token) {
        setTimeout(() => {
          dispatch(login({
            user: {
              id: 'id',
              name: 'name',
              surname: 'surname',
              email: 'email',
              role: 'role',
            },
          }))
        }, 2000);
      } else {
        dispatch(logout());
        console.log("no token");
      }
    }
    initializeToken();
  }, [dispatch]);

  const session = useSelector((state) => state.user);

  const sessionObject = session ? JSON.parse( JSON.stringify(session)) : null ;
  console.log(sessionObject, 'sessionObject');

  const isAuth = sessionObject ? sessionObject.isLoggedIn : null ;
  console.log(isAuth + "isAuth");
  const role = sessionObject ? sessionObject.user && session.user.user ? session.user.user.role : null : null
  console.log(role, 'role')


  return (
    <div className="App">
      <Router>
        <Routes>
          <Route exact path="/" element={<Home />} />
          <Route exact path="login" element={<Login />} />
          <Route exact path="unauthorised" element={<Unauthorised />} />
          <Route
            element={
              <RequireAuth allowedRoles={[3]} session_role={session?.role} />
            }
          >
            <Route path="/protected" element={<Protected />} />
          </Route>
        </Routes>
      </Router>
    </div>
  );
}

export default App;

使用 setTimeout 而不是 api ,它可以模拟相同的东西。 null 背后的原因是解析数据,而不是我认为的初始状态。上面的代码应该可以解决问题。

function App() {
  const dispatch = useDispatch();
  let token = 1;
  useEffect(() => {
    async function initializeToken() {
      if (token) {
        setTimeout(() => {
          dispatch(login({
            user: {
              id: 'id',
              name: 'name',
              surname: 'surname',
              email: 'email',
              role: 'role',
            },
          }))
        }, 2000);
      } else {
        dispatch(logout());
        console.log("no token");
      }
    }
    initializeToken();
  }, [dispatch]);

  const session = useSelector((state) => state.user);

  const sessionObject = session ? JSON.parse( JSON.stringify(session)) : null ;
  console.log(sessionObject, 'sessionObject');

  const isAuth = sessionObject ? sessionObject.isLoggedIn : null ;
  console.log(isAuth + "isAuth");
  const role = sessionObject ? sessionObject.user && session.user.user ? session.user.user.role : null : null
  console.log(role, 'role')


  return (
    <div className="App">
      <Router>
        <Routes>
          <Route exact path="/" element={<Home />} />
          <Route exact path="login" element={<Login />} />
          <Route exact path="unauthorised" element={<Unauthorised />} />
          <Route
            element={
              <RequireAuth allowedRoles={[3]} session_role={session?.role} />
            }
          >
            <Route path="/protected" element={<Protected />} />
          </Route>
        </Routes>
      </Router>
    </div>
  );
}

export default App;

Have used setTimeout instead of api , it can simulate same stuff. The reason behind null is parsing the data, not the initial state i thought it would be. The above code should do the trick.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文