【问题标题】:Whole page reloading after changing one state更改一种状态后重新加载整个页面
【发布时间】:2021-08-02 19:26:09
【问题描述】:

我目前正在构建一个包含大量图表的页面,并且我正在使用 Material UI 菜单来切换图表。
当我单击一个新的 MenuItem 时,它会更改我的部件状态并显示一个新的组件数组。
我现在的主要问题是,每当我单击按钮时,所有图表都会快速加载,但是对于这么多图表,这是一个问题。 我试过调试它,但老实说我找不到问题,我所有的状态都在需要设置时设置,并且 useEffects 在开始时只运行一次,所以没有额外的负载。
这是它的样子:

这就是我目前正在渲染的代码。如果您需要我的代码中的任何进一步信息,请告诉我,如果您可以为改进我的代码提供任何建议,我将很高兴,谢谢。

    <>
      <div className={classes.actionBar}>
        <SelectEstimatedMonthForm />
      </div>
      <div>
        <Card>
          <div>
            <h1>Gráficos de DRE</h1>
            <Button
              aria-controls="simple-menu"
              aria-haspopup="true"
              onClick={handleClick}
            >
              Open Menu
            </Button>
            <Menu
              id="simple-menu"
              anchorEl={anchorEl}
              keepMounted
              open={Boolean(anchorEl)}
              onClose={handleClose}
            >
              <MenuItem onClick={handleClose}>Todos Gráficos</MenuItem>
              <MenuItem onClick={handleClose}>
                Gráficos DRE Orçamento Evolução
              </MenuItem>
              <MenuItem onClick={handleClose}>
                Gráficos de Evolução Parte 2
              </MenuItem>
              <MenuItem onClick={handleClose}>
                Gráficos de Representatividade
              </MenuItem>
            </Menu>
          </div>
          <div>
            {chartDataPart?.part1 && part === 1 && values && (
              <div>
                {chartDataPart?.part1?.map((data) => {
                  if (data?.type === "bar") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartBar
                            data={data}
                            text={data?.text}
                            noLabel={data?.noLabel}
                            stacked={data?.stacked}
                            newPlugin={data?.customPlugin}
                          />
                        )}
                      </div>
                    );
                  } else if (data?.type === "pie") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartPie text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else if (data?.type === "doughnut") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartDoughnut text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else {
                    return (
                      <div>
                        <h1>{data?.text} esta sem type</h1>
                      </div>
                    );
                  }
                })}
              </div>
            )}
            {chartDataPart?.part2 && part === 2 && values && (
              <div>
                {chartDataPart?.part2?.map((data) => {
                  if (data?.type === "bar") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartBar
                            data={data}
                            text={data?.text}
                            noLabel={data?.noLabel}
                            stacked={data?.stacked}
                            newPlugin={data?.customPlugin}
                          />
                        )}
                      </div>
                    );
                  } else if (data?.type === "pie") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartPie text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else if (data?.type === "doughnut") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartDoughnut text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else {
                    return (
                      <div>
                        <h1>{data?.text} esta sem type</h1>
                      </div>
                    );
                  }
                })}
              </div>
            )}
            {chartDataPart?.part3 && part === 3 && values && (
              <div>
                {chartDataPart?.part3?.map((data) => {
                  if (data?.type === "bar") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartBar
                            data={data}
                            text={data?.text}
                            noLabel={data?.noLabel}
                            stacked={data?.stacked}
                            newPlugin={data?.customPlugin}
                          />
                        )}
                      </div>
                    );
                  } else if (data?.type === "pie") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartPie text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else if (data?.type === "doughnut") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartDoughnut text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else {
                    return (
                      <div>
                        <h1>{data?.text} esta sem type</h1>
                      </div>
                    );
                  }
                })}
              </div>
            )}
            {chartData && part === 0 && values && (
              <div>
                {chartData?.map((data) => {
                  if (data?.type === "bar") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartBar
                            data={data}
                            text={data?.text}
                            noLabel={data?.noLabel}
                            stacked={data?.stacked}
                            newPlugin={data?.customPlugin}
                          />
                        )}
                      </div>
                    );
                  } else if (data?.type === "pie") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartPie text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else if (data?.type === "doughnut") {
                    return (
                      <div>
                        {data?.labels && (
                          <ChartDoughnut text={data?.text} data={data} />
                        )}
                      </div>
                    );
                  } else {
                    return (
                      <div>
                        <h1>{data?.text} esta sem type</h1>
                      </div>
                    );
                  }
                })}
              </div>
            )}
          </div>
        </Card>
     </div>
    </>
useEffect(() => {
    const fetchDreData = async () => {
      try {
        const res = await http.get(
          `call1`
        );
        const data = await res.data;
        const final = data.data;
        // console.log(final);
        setEstimatedMonths(final);
      } catch (e) {
        console.log("error", e);
      }
    };
    const fetchProductsData = async () => {
      try {
        const res = await http.get(
          `call2`
        );
        const data = await res.data;
        const final = data.data;
        // console.log(res);
        setEstimatedProducts(final);
      } catch (e) {
        console.log("error", e);
      }
    };
    fetchDreData();
    fetchProductsData();
    // console.log("useffect1");
  }, [estimatedMonthContext.monthId]);

  useEffect(() => {
    if (estimatedProducts && estimatedMonths) {
      // console.log("useffect2");
      flatData();
    }
    // productsFlatData();
  }, [estimatedProducts, estimatedMonths]);

  useLayoutEffect(() => {
    // if (values) {
    chart();
    // console.log("useffect3");
    // }
  }, [values]);

【问题讨论】:

    标签: javascript reactjs react-hooks material-ui


    【解决方案1】:

    页面上的某些内容导致页面在加载后再次重新呈现,这可能是状态更改或很可能是 useEffect。

    如果您正在使用 useEffect,请确保您正确执行 1. 不更新其中的状态或 2. 返回 '[]'。

    useEffect(() => {
    
    }, []) // this part here
    

    除此之外,您还从多个端点获取数据,并且每次数据返回时都会更新状态,这将导致页面多次重新呈现。相反,您应该将每个组件移动到它们各自的单独组件并单独获取它们自己的数据,这样它们就不会相互影响并更新整个页面。

    【讨论】:

    • 我添加了 useEffect 部分,但我的问题基本上是,每当控制我的菜单的状态更改时,整个图表内容都会重新加载,但它们之间没有任何关系。
    • 哦,我明白了。在这种情况下,您应该将图表移动到各个反应组件。在这种情况下,它们都由单个状态管理,但如果将它们分成多个组件,那么每个组件都将管理自己的状态。最重要的是,您还可以在父组件中应用更多关于其子组件应如何呈现的逻辑。它也将是更好的代码,因此所有内容都不在一个大文件中。
    • 知道了,问题是当有人在我的菜单上选择某些内容时,我需要有条件地在我的代码上呈现这些内容,并且将我的菜单移动到单个组件使得无法将状态更改为它的父级
    • 查看更新的答案。此外,如果您将回调传递给子级,您仍然可以从父级更新内容,您可以传递子级所需的任何道具以更新父级菜单。
    • 不需要使用promise.all,每个人都应该加载自己的数据,你不只是想在一切完成后更新页面,你可以在加载完成的那一刻显示每个图表,但是在他们自己的每个组件中都这样做,所以他们只会更新自己。然后看起来就像所有图表在完成加载时都一张一张地弹出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2012-02-19
    • 2015-07-29
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多