【问题标题】: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";}
    else{return(alert("Username or Password is not valid!"))}  
    });
  
  }

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

【问题讨论】:

    标签: javascript reactjs routes react-router navigation


    【解决方案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";}
            else{return(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/>)
         )
        }
        

        这很好用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-11
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          • 2019-07-19
          • 2022-08-10
          • 2018-01-26
          • 2018-11-19
          相关资源
          最近更新 更多