简体   繁体   English

useEffect 处于无限循环中

[英]useEffect is in infinite loop

I have a component which once once it rendered I need to redirect a user to another path and I'm using useEffect hook of react but it's getting rendered over and over and over without stopping:我有一个组件,一旦它呈现,我需要将用户重定向到另一条路径,我正在使用 useEffect 反应钩子,但它会一遍又一遍地渲染而不会停止:

const App: FunctionComponent<{}> = () => {
const [message, setMessage] = useState("");

  useEffect(() => {
    if (condition) {
      setMessage("you are being redirected");
      setTimeout(() => {
        location.href = `http://localhost:4000/myurl`;
      }, 2000);
    } else {
      setMessage("you are logged in");
      setTimeout(() => {
        <Redirect to={"/pages"} />;
      }, 2000);
    }
  }, [message]);

  return (
    <>
      {message}
      <BrowserRouter>
        <Route exact path="/login/stb" render={() => <Code />} />
      </BrowserRouter>
    </>
  );
};

export default App;

It looks like setMessage is setting a message state variable in the component.看起来setMessage正在组件中设置message state 变量。 This occurs during every run of useEffect .这发生在每次运行useEffect期间。 State changes will cause your component to rerender. State 更改将导致您的组件重新呈现。

Basically, the flow causing the loop is this:基本上,导致循环的流程是这样的:

  1. Initial component render初始组件渲染
  2. useEffect is run useEffect 运行
  3. message state is updated message state 已更新
  4. Component rerenders due to state change由于 state 更改,组件重新渲染
  5. useEffect is run as it's trigged on message changemessage更改时触发 useEffect 运行
  6. Back to step 3返回第 3 步

If you want useEffect to only run on initial render, and redirect after a user has logged in, you could change it to something like this:如果您希望useEffect仅在初始渲染时运行,并在用户登录后重定向,您可以将其更改为如下所示:

  const [loggedIn, setLoggedIn] = useState(false);

  useEffect(() => {
    if (someConditionHere) {
      setLoggedIn(true);
  }, []);

  return (
    loggedIn ? <Redirect to={"/pages"} /> :
    <BrowserRouter>
      <Route exact path="/login/stb" render={() => <Code />} />
    </BrowserRouter>
  );

I don't know everything about the setup, so that's simplifying and making some assumptions.我对设置一无所知,所以这是简化并做出一些假设。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM