Reactjs 使用react路由器dom的受保护页面不';行不通

Reactjs 使用react路由器dom的受保护页面不';行不通,reactjs,react-router-dom,Reactjs,React Router Dom,我正在尝试实现仅登录用户仪表板页面 App.js <BrowserRouter history={hist}> <Route path="/sign-in" exact component={SignIn} /> <PrivateRoute path="/dashboard"> <Dashboard /> </PrivateRoute> </BrowserRouter> privaterout.js

我正在尝试实现仅登录用户仪表板页面

App.js

<BrowserRouter history={hist}>
  <Route path="/sign-in" exact component={SignIn} />
  <PrivateRoute path="/dashboard">
    <Dashboard />
  </PrivateRoute>
</BrowserRouter>

privaterout.js

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated ? children : <Redirect to="/sign-in" />
    }
    />
  );
}

const isAuthenticated = () => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
}
导出函数privaterout({children,…props}){
返回(
是否已验证?儿童:
}
/>
);
}
常量已验证=()=>{
const userToken=JSON.parse(sessionStorage.getItem(“用户令牌”);
返回userToken?真:假'
}
我正在检查sessionStorage的用户令牌,如果为null,则返回false或true。 事件虽然返回“false”,但会重定向到仪表板,而不是登录页面。
我的问题是什么?

在PrivateRoute.js中这样做

<Route {...props} render={( {location} ) =>
  isAuthenticated() ? children : <Redirect to="/sign-in" />
}
/>

是否已验证()?儿童:
}
/>

原因是您没有调用
isAuthenticated
。如果问题仍然存在,请随时讨论。

在PrivateRoute.js中执行此操作

<Route {...props} render={( {location} ) =>
  isAuthenticated() ? children : <Redirect to="/sign-in" />
}
/>

是否已验证()?儿童:
}
/>

原因是您没有调用
isAuthenticated
。如果问题仍然存在,请随时讨论。

路由器重定向到仪表板(即使未经验证的用户)的原因是
已验证
是一个函数。因此,您需要调用此函数:

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated() ? children : <Redirect to="/sign-in" />
    }
    />
  );
}

const isAuthenticated = () => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
}
const isAuthenticated = (() => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
})()

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated ? children : <Redirect to="/sign-in" />
    }
    />
  );
}
导出函数privaterout({children,…props}){
返回(
isAuthenticated()?子项:
}
/>
);
}
常量已验证=()=>{
const userToken=JSON.parse(sessionStorage.getItem(“用户令牌”);
返回userToken?真:假'
}
如果不希望在每次路由更改时调用函数,可以实现立即调用的函数:

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated() ? children : <Redirect to="/sign-in" />
    }
    />
  );
}

const isAuthenticated = () => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
}
const isAuthenticated = (() => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
})()

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated ? children : <Redirect to="/sign-in" />
    }
    />
  );
}
const isAuthenticated=(()=>{
const userToken=JSON.parse(sessionStorage.getItem(“用户令牌”);
返回userToken?真:假'
})()
导出函数PrivateRoute({children,…props}){
返回(
是否已验证?儿童:
}
/>
);
}

路由器重定向到仪表板(即使未经身份验证的用户)的原因是
isAuthenticated
是一个函数。因此,您需要调用此函数:

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated() ? children : <Redirect to="/sign-in" />
    }
    />
  );
}

const isAuthenticated = () => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
}
const isAuthenticated = (() => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
})()

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated ? children : <Redirect to="/sign-in" />
    }
    />
  );
}
导出函数privaterout({children,…props}){
返回(
isAuthenticated()?子项:
}
/>
);
}
常量已验证=()=>{
const userToken=JSON.parse(sessionStorage.getItem(“用户令牌”);
返回userToken?真:假'
}
如果不希望在每次路由更改时调用函数,可以实现立即调用的函数:

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated() ? children : <Redirect to="/sign-in" />
    }
    />
  );
}

const isAuthenticated = () => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
}
const isAuthenticated = (() => {
  const userToken = JSON.parse(sessionStorage.getItem("user-token"));
  return userToken ? true : false'
})()

export function PrivateRoute({children, ...props}) {
  return (
    <Route {...props} render={( {location} ) =>
      isAuthenticated ? children : <Redirect to="/sign-in" />
    }
    />
  );
}
const isAuthenticated=(()=>{
const userToken=JSON.parse(sessionStorage.getItem(“用户令牌”);
返回userToken?真:假'
})()
导出函数PrivateRoute({children,…props}){
返回(
是否已验证?儿童:
}
/>
);
}