开发者问题收集

React-useEffect 块加载页面

2022-04-12
682

几天前我开始学习 React,现在我被 useEffect 问题困住了。

为了让您了解情况,我正在构建一个单一行星页面,您可以在行星之间切换并显示它们的信息。

我们必须点击一些按钮才能获取有关行星的一些详细信息。因此,当选择按钮时,它们会获得特定的类。因此,当我们前往另一个星球时,我希望这些按钮能恢复其默认的 className!

因此,我编写了一个 useEffect,每次我们在星球之间切换时,通过单击星球按钮来编辑某些按钮的 className。

但此后,如果我从 Google 的重新加载按钮重新加载页面,我的组件根本不会呈现,我只能获得应用程序的背景。

useEffect(() => {
  buttonOverview.className = planetDetails[selectedPlanet].name;
  buttonStructure.className = "buttonStructure";
  buttonSurface.className = "buttonSurface";
}, [selectedPlanet]);

谷歌给出了错误代码:“未捕获的 TypeError:无法设置 null 属性(设置‘className’)”

但我不明白,因为我了解到 useEffect 仅在渲染后播放,那么问题是什么?

2个回答

您实际上不需要 在此处使用 。将所选行星存储在状​​态下,然后使用CSS更新类。

这是一个示例(行星不扩展)。

781199040
Andy
2022-04-12

您需要利用 React 状态来存储和设置这些类名。您可以使用 useState 钩子来执行此操作。

场景 1:

这应该可以解决问题:

const [buttonOverviewClassName, setButtonOverviewClassName] = useState("");
const [buttonStructureClassName, setButtonStructureClassName] = useState("");
const [buttonSurfaceClassName, setButtonSurfaceClassName] = useState("");

useEffect(() => {
  setButtonOverviewClassName(planetDetails[selectedPlanet].name);
  setButtonStructureClassName("buttonStructure");
  setButtonSurfaceClassName("buttonSurface");
}, [selectedPlanet]);

然后,对于 return 语句中的 button ,您只需将 className 设置为与该值匹配,如下所示:

<button className={buttonOverviewClassName}>Overview</button>

场景 2:

另一种选择是将所有 className 组合在一起作为一个对象,因为无论如何您都会一起更改它们。

您可以这样做:

const [classNames, setClassNames] = useState({
  overview: "",
  structure: "",
  surface: "",
});

useEffect(() => {
  setClassNames({
    overview: planetDetails[selectedPlanet].name,
    structure: "buttonStructure",
    surface: "buttonSurface"
  });
}, [selectedPlanet])

然后像这样使用它:

<button className={classNames.overview}>Overview</button>
Barry Michael Doyle
2022-04-12