如何在三元运算符上导航反应页面?

Posted

技术标签:

【中文标题】如何在三元运算符上导航反应页面?【英文标题】:How to navigate react page on ternary operators? 【发布时间】:2022-01-14 23:12:56 【问题描述】:

如果 LoggedIn 和 admin 在向 /admin 发送道具时为真,我正在尝试导航到管理页面,但这不起作用。你能帮忙吗?



export default function Auth() 


  function login(e) 
    e.preventDefault();
    const data =  email, password ;
    axios
      .post("http://localhost:3001/api/Login", data,  withCredentials: true )
      .then((response) => 
      
      if(!!response.data.loggedIn && !!response.data.admin) return( <Navigate to="/admin"  loggedIn="response.data.loggedIn" replace/> )
     else if(!!response.data.loggedIn && ! !!response.data.admin) window.location.href = "https://www.dummyweb.com/webmail";
    elsereturn(alert("Username or Password is not valid!"))  
    );
  
  

  return (
    <div>
    <LogginForm/>
</div>
 )

【问题讨论】:

【参考方案1】:

可以使用 react-router 重定向组件

return <>props.isLoggedIn ?  (<div>
   <Row className=stylesadmin.root> 
     <Uploader/>
     <ToastContainer/>  
   </Row>
 </div>) : <Redirect to='/Auth'/> </>

【讨论】:

【参考方案2】:

要有条件地呈现内容或重定向,您应该使用以下内容:

react-router-dom

由于您尝试使用 useNavigate 挂钩,因此我假设您使用的是 react-router-dom v6 并将从那里开始。

版本 6

Redirect 组件已在 react-router-dom v6 中删除。使用Navigate 组件并指定replace 属性来执行重定向而不是正常导航。

export default function Admin(props) 
  return props.isLoggedIn ? (
    <div>
      <Row className=stylesadmin.root> 
        <Uploader/>
       <ToastContainer/>  
      </Row>
    </div>
  ) : (
    <Navigate to="/Auth" replace />
  );

版本 5

使用Redirect 组件重定向到“/Auth”。

export default function Admin(props) 
  return props.isLoggedIn ? (
    <div>
      <Row className=stylesadmin.root> 
        <Uploader/>
       <ToastContainer/>  
      </Row>
    </div>
  ) : (
    <Redirect to="/Auth" />
  );

更新

使用命令式导航/重定向。

导入useNavigate (v6) / useHistory (v5) 挂钩并发出命令式重定向。

export default function Auth() 
  const navigate = useNavigate();  // v6
  // const history = useHistory(); // v5

  function login(e) 
    e.preventDefault();
    const data =  email, password ;

    axios
      .post("http://localhost:3001/api/Login", data,  withCredentials: true )
      .then((response) => 
        if (!!response.data.loggedIn && !!response.data.admin) 
          navigate(
            "/admin",
            
              replace: true,
              state:  loggedIn: response.data.loggedIn ,
            
          );
          // history.replace(
          //   "/admin",
          //   
          //     loggedIn: response.data.loggedIn,
          //   
          // );
         else if (!!response.data.loggedIn && ! !!response.data.admin) 
          window.location.href = "https://www.dummyweb.com/webmail";
         else 
          alert("Username or Password is not valid!");
          
      );
  

  return (
    <div>
      <LogginForm/>
    </div>
  );

【讨论】:

我使用了 但没有任何反应,页面保持不变 嗯,我有点明白发生了什么, @FirasSCMP 您是否仔细检查过props.isLoggedIn 是否为假?如果您 only 呈现重定向会怎样,即const Admin = () =&gt; &lt;Navigate to="/Auth" replace /&gt; 它会导航吗?这个Admin 组件是如何/在哪里呈现的? 首先我正在执行 axios.post 请求以检查凭据是否正确,然后如果正确,我将尝试导航到 /admin,但我猜 在返回渲染之外不起作用。对吗? 非常感谢,我使用 state 传递了一些有效的数据。【参考方案3】:

您可以使用Redirect 组件或使用react-router-dom 中的useHistory 挂钩

【讨论】:

【参考方案4】:
import  useNavigate  from 'react-router-dom';
export default function Auth() 

  let navigate = useNavigate();
  function login(e) 
    e.preventDefault();
    const data =  email, password ;
    axios
      .post("http://localhost:3001/api/Login", data,  withCredentials: true )
      .then((response) => 
      
      if(!!response.data.loggedIn && !!response.data.admin) return(  navigate( "/admin" ,  state:loggedIn:response.data.loggedIn )
     else if(!!response.data.loggedIn && ! !!response.data.admin) window.location.href = "https://www.dummyweb.com/webmail";
    elsereturn(alert("Username or Password is not valid!"))  
    );
  
  

  return (
    <div>
    <LogginForm/>
</div>
 )

在管理页面上我按如下方式处理它

export default function Admin() 
  const state = useLocation();
 const  loggedIn = state;

return(
loggedIn?
(<whatever/>):(<whatever2/>)
 )

这很好用

【讨论】:

以上是关于如何在三元运算符上导航反应页面?的主要内容,如果未能解决你的问题,请参考以下文章

在反应中更新三元运算符内的状态

如何在ajax调用中在jquery中使用三元运算符?

javascript React - 三元运算符或jsx中的条件包含带反应的html

如何在三元运算符上添加routerLink?

如何在剃刀中使用三元运算符(特别是在 HTML 属性上)?

在 Console.WriteLine 上使用三元运算符