【问题标题】:Failed to redirect in react无法在反应中重定向
【发布时间】:2020-05-14 08:18:01
【问题描述】:

我有一个应用程序组件,如果条件不满足,我想在它从那里着陆后进行重定向,并在完成渲染时渲染另一个组件,但不知何故,当我转到 "path/myURl" 我不查看我的<Home> 组件:

const App: FunctionComponent<{}> = () => {
  useEffect(() => {
    if (!localstorage.getItem("token")) {
      window.location.replace("/myUrl");
    }
  }, []);

  return (
    <>
      <Route
        exact
        path="/myUrl"
        render={() => <Home />}
      />
    </>
  );
};
export default App;

首页组件:

const Home: FunctionComponent<{}> = () => {
  return <> Hello</>
}

索引页面:

class WebComponent extends HTMLElement {
  render() {
    ReactDOM.render(
      <root.div style={{ all: "initial" }}>
        <BrowserRouter>
          <App />
        </BrowserRouter>
      </root.div>,
      this
    );
  }

  connectedCallback(): void {
    this.render();
  }
}

【问题讨论】:

  • App 是否在路由器中呈现?您可以(并且应该)使用路由道具或 useHistory 挂钩来执行 history.replace 重定向。在“/myUrl”之前还渲染了哪些其他路由?
  • react-router 的做法是渲染一个 &lt;Redirect /&gt; 或者将新的 url 推送到它的 history 对象。此外,/myUrl 路由需要在主 &lt;Router&gt; 内部,而不是在触发重定向的组件中。
  • @DrewReese 实际上,我没有在“/myUrl”之前呈现的任何其他路线,页面一旦登陆它就会检查是否有令牌,然后将用户重定向到另一条路线

标签: javascript reactjs react-router components


【解决方案1】:

通常在 React 应用中有更好的重定向方式。我会为此目的使用 useHistory 钩子,因为你有一个函数组件。

尝试如下:

import { useHistory } from 'react-router-dom'

const App: FunctionComponent<{}> = () => {
   const history = useHistory();

   useEffect(() => {
    if (!localstorage.getItem("token")) {
      history.push('/myUrl');
    }
   }, []);

   // return
}

此外,您还应该使用&lt;Router&gt;&lt;Switch&gt; 组件包装组件以使其工作。

如果您对表示 React Apps 的不同编程可能重定向选项的更多选项感兴趣,请查看我的 GitHub 存储库:
https://github.com/norbitrial/react-router-programmatically-redirect-examples

我希望这会有所帮助!

【讨论】:

  • 实际上没有工作,我知道是什么原因,你检查我最近的更新了吗?
  • @A.H 您错过了&lt;Switch&gt; 组件,正如我在回答中提到的那样,这是必需的。
【解决方案2】:

使用反应路由器:

class WebComponent extends HTMLElement {
  render() {
    ReactDOM.render(
      <root.div style={{ all: "initial" }}>
        <BrowserRouter>
          <Switch>
          <Route
            exact
            path="/myUrl"
            render={() => <Home />}
          />
          <Route
            path="/-"
            render={() => <App />}
          />
          </Switch>
        </BrowserRouter>
      </root.div>,
      this
    );
  }

  connectedCallback(): void {
    this.render();
  }
}

// Your App component


import { useHistory } from 'react-router-dom'

const App: FunctionComponent<{}> = () => {
   const history = useHistory();

   useEffect(() => {
    if (!localstorage.getItem("token")) {
      history.push('/myUrl');
    }
   }, []);

   // return
}

【讨论】:

  • 感谢您的快速响应,但它说:无法 GET /myUrl 将我重定向到该路径时还有一种方法可以让我重新加载到页面而不使用 Redirect from react-路由器?
  • 您是否像文档中那样将您的 Route 组件包装在路由器提供程序中? reacttraining.com/react-router/web/guides/quick-start
  • 能否显示索引页?
  • 请看
  • 我编辑了我的答案,不知道这样有没有帮助。
猜你喜欢
  • 2022-01-11
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2021-06-09
  • 1970-01-01
  • 2022-10-13
  • 2018-10-27
相关资源
最近更新 更多