【问题标题】:Redirecting using useEffect hook使用 useEffect 挂钩重定向
【发布时间】:2020-02-15 01:12:19
【问题描述】:

我的想法是我有一个渲染某些东西的组件,但同时正在检查将返回或重定向到另一个组件的东西:

useEffect(() => {
  (() => {
    if (true) {
      // return to one component
    }

    // return to another component
  })();
});

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

我认为可以使用useEffect hook,但问题是,它不会重定向到我的组件,我尝试使用react-router 中的Redirect,返回组件本身,并使用history 包,在这种情况下,只替换了 url,根本没有重定向。

这可能吗?或者也许我离题了。

非常感谢!

【问题讨论】:

标签: javascript reactjs react-hooks


【解决方案1】:

如果你只需要条件渲染,你可以这样做:

const LoadingComponent = () => <div> Javier </div>

function Landing(props) {
    const [state={notLoaded:true}, setState] = useState(null);
    useEffect(() => {
        const asyncCallback = async () =>{
            const data = await axios.get('/someApiUrl')
            setState(data)
        }

        asyncCallback()
    },[]);

    if(!state){
        return <FalseyComponent />
    }
    if(state.notLoaded){
        //return some loading component(s) (or nothing to avoid flicker)
        return <LoadingComponent /> // -or- return <div/>
    }
    return <TruthyComponent />
}

或完全重定向:

const LoadingComponent = () => <div> Javier </div>

function Landing(props) {
    const [state={notLoaded:true}, setState] = useState(null);
    useEffect(() => {
        const asyncCallback = async () =>{
            const data = await axios.get('/someApiUrl')
            setState(data)
        }

        asyncCallback()
    },[]);

    if(!state){
        return <Redirect to='/falseyRoute' />
    }
    if(state.notLoaded){
        //return some loading component(s) or (nothing to avoid flicker)
        return <LoadingComponent /> // -or- return <div/>
    }
    return <Redirect to='/truthyRoute' />
}

【讨论】:

    【解决方案2】:

    使用 React 路由器 v6,您可以使用 useEffect 创建重定向:

    import React, { useEffect } from 'react';
    import {
      BrowserRouter, Route, Routes, useNavigate,
    } from 'react-router-dom';
    
    const App = () => (
      <div>
        <BrowserRouter>
          <Routes>
            <Route path="/" element={<Main />} />
            <Route path="/home" element={<Home />} />
          </Routes>
        </BrowserRouter>
      </div>
    );
    
    const Main = () => {
      const navigate = useNavigate();
      useEffect(() => {
        let didCancel = false;
        const goToHomePage = () => navigate('/home');
        if (!didCancel) { goToHomePage(); }
        return () => { didCancel = true; };
      }, [navigate]);
      return (
        <div>
          <h1>Welcome Main!</h1>
        </div>
      );
    };
    
    const Home = () => (
      <div>
        <h1>Welcome Home!</h1>
      </div>
    );
    
    export default App;
    

    如果你想创建一个替代重定向到另一个组件,你可以这样做:

    import React, { useEffect } from 'react';
    import {
      BrowserRouter, Route, Routes, useNavigate,
    } from 'react-router-dom';
    
    const App = () => (
      <div>
        <BrowserRouter>
          <Routes>
            <Route path="/" element={<Main />} />
            <Route path="/home" element={<Home />} />
            <Route path="/other" element={<Other />} />
          </Routes>
        </BrowserRouter>
      </div>
    );
    
    const Main = () => {
      const navigate = useNavigate();
      useEffect(() => {
        let didCancel = false;
        const goToHomePage = () => navigate('/home');
        const goToOtherPage = () => navigate('/other');
        if (!didCancel) { goToHomePage(); } else { goToOtherPage(); }
        return () => { didCancel = true; };
      }, [navigate]);
      return (
        <div>
          <h1>Welcome Main!</h1>
        </div>
      );
    };
    
    const Home = () => (
      <div>
        <h1>Welcome Home!</h1>
      </div>
    );
    
    const Other = () => (
      <div>
        <h1>Welcome Other!</h1>
      </div>
    );
    
    export default App;
    

    在更改了旧语法的 React 路由器 5 中,它也应该可以工作。但是,在 React 路由器 6 中我没有找到 Redirect,所以上面的重定向更有用。

    【讨论】:

    • 在 React Router v6 中,Redirect 被重命名为 Navigate,就像 history 被重命名为 navigate。另外,我更喜欢在useEffect 中重定向,而不是返回&lt;Redirect /&gt; 组件。
    【解决方案3】:

    尝试根据这样的状态值返回。

    import { Redirect } from "react-router-dom"; //import Redirect first
    
    const [redirctTo, setRedirctTo] = useState(false); // your state value to manipulate
    
    useEffect(() => {
      (() => {
        if (true) {
          setRedirctTo(true)
        }
    
        // return to another component
      })();
    });
    
    if(redirctTo){
      return <Redirect to="/your-url" />
    } else {
      return (
      <div> Javier </div>
    );
    }
    
    

    【讨论】:

      猜你喜欢
      • 2021-02-13
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2020-07-14
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多