如何在React JS中渲染之前等待状态?

时间:2020-08-23 13:43:01

标签: reactjs react-router react-context

我使用“反应上下文”将状态user传递给子组件。

问题:每次重新加载页面时,状态user的值为空。这导致页面在重定向到'/ dashboard`之前短暂地重定向到/login。这样可以防止用户手动访问页面。

目标:如何在渲染之前等待状态user

App.js

function App() {
  const [user, setUser] = useState(null);
  useEffect(() => {
    firebase.auth().onAuthStateChanged((user) => {
      if (user) setUser(user);
      else setUser(null);
    });
  }, []);
  return (
    <Router>
      <AuthDataContext.Provider value={user}>
        <Layout>
          <Routes />
        </Layout>
      </AuthDataContext.Provider>
    </Router>
  );
}

路线

export const Routes = () => {
  const user = useContext(AuthDataContext);
  if (user) {
    return (
      <Switch>
        <Route path="/dashboard" component={Dashboard} />
        <Route path="/list" component={List} />
        <Redirect to="/dashboard" />
      </Switch>
    );
  } else {
    return (
      <Switch>
        <Route path="/login" component={LogIn} />
        <Route path="/register" component={Register} />
        <Route path="/passwordreset" component={PasswordReset} />
        <Redirect to="/login" />
      </Switch>
    );
  }
};

authdata

import React from "react";

export const AuthDataContext = React.createContext(null);

编辑:快速修复 App.js

const [user, setUser] = useState("first");

路线

else if (user === "first") return null

1 个答案:

答案 0 :(得分:0)

您可以使用一个组件来启动API调用,并在用户等待响应时呈现某种类型的加载器。然后,如果用户通过了身份验证,则可以呈现常规的应用程序路由;否则,可以呈现sign insign up等的路由。