我不确定为什么App.js中的返回语句在页面刷新期间被调用3次.

My Index.js:

import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";

import "assets/plugins/nucleo/css/nucleo.css";
import "@fortawesome/fontawesome-free/css/all.min.css";
import "assets/scss/argon-dashboard-react.scss";

import { Auth0ProviderWithNavigate } from "./auth0-provider-with-navigate";
import { App } from "./app";
import store from "./app/store";
import { Provider } from "react-redux";

const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  <BrowserRouter>
    <Auth0ProviderWithNavigate>
      <Provider store={store}>
        {console.log("Hit from Index")}
        <App />
      </Provider>
    </Auth0ProviderWithNavigate>
  </BrowserRouter>
);

我的App.js

import { useAuth0 } from "@auth0/auth0-react";
import React, { useEffect } from "react";
import { Route, Routes } from "react-router-dom";
import { AuthenticationGuard } from "./components/authentication-guard";
import Admin from "layouts/Admin.js";
import Auth from "layouts/Auth.js";

export const App = () => {
  const { isLoading } = useAuth0();

  useEffect(() => {
    console.log("Hit from App UseEffect");
  }, []);

  return (
    <>
      {console.log("Hit from App Return", isLoading)}{" "}
      {isLoading ? (
        <div className="page-layout">
          <Auth />
        </div>
      ) : (
        <Routes>
          <Route path="/" element={<Auth />} exact />
          <Route path="/auth/*" element={<Auth />} />
          <Route
            path="/admin/*"
            element={<AuthenticationGuard component={Admin} />}
          />
        </Routes>
      )}
    </>
  );
};

console.log results

当我第一次通过登录加载页面时,App.js内的返回语句被调用2次(预期),但是如果我刷新页面,它将被调用3次,而我预期是2次.

推荐答案

你似乎对你的日志(log)的含义有些困惑.在App组件的返回语句中,您将控制台日志(log)记录为无意的副作用,因此任何"预期行为"都应该被抛出窗口.为了计算需要提交给DOM的内容,Reaction可以尽可能多次地"呈现"组件,例如调用函数.

始终使用useEffect挂钩记录数据,以便在Render(101)和Effect之间有一对一的关系.

export const App = () => {
  const { isLoading } = useAuth0();

  useEffect(() => {
    console.log("Mounting App useEffect");
  }, []); // <-- run once when component mounted/initial render

  useEffect(() => {
    console.log("Render App to the DOM useEffect");
  }); // <-- no dependency, run once each render

  useEffect(() => {
    console.log("useEffect because isLoading updated", isLoading);
  }, [isLoading]); // <-- run only when isLoading updates

  return (
    <>
      {isLoading ? (
        <div className="page-layout">
          <Auth />
        </div>
      ) : (
        <Routes>
          <Route path="/" element={<Auth />} exact />
          <Route path="/auth/*" element={<Auth />} />
          <Route
            path="/admin/*"
            element={<AuthenticationGuard component={Admin} />}
          />
        </Routes>
      )}
    </>
  );
};

Reactjs相关问答推荐

props 可以在Reaction中锻造吗?

有没有办法将在服务器端全局获取的一些数据传递到Next&>13应用程序目录中的客户端组件?

Next.js:提交表单时状态尚未就绪

页面永远加载API/从数据库获取数据

ReactJS:唯一项目的数量总和

验证 Yup 中的对象项

Chakra UI:如何在选中状态下设置复选框 colored颜色

是的验证:使用 useFieldArray 访问表单值

无法设置 null 的属性(设置src)

将 clerk 与 supabase 集成的最佳实践

ReactJS 动态禁用按钮

无法在 KeyDown 上调用 useCallback 函数

更新和删除功能不工作 Asp.net MVC React

SonarCloud 代码覆盖率不适用于 Github Action

为什么我在此代码段中看不到 useEffect for count = 1?

理解 React 中的 PrevState

如何用实际的br标签替换axios响应中的br标签?

在react 钩子中将数组添加到数组状态给出一个数字

错误未捕获的错误:[App] 不是 组件. 的所有子组件必须是

我想将悬停 colored颜色 更改为红色.写了一个话题,这个元素没有react ,怎么解决呢?