我想accordion-content级,如果包括link-active或没有.所以我创建了这样的代码.

import {React, useRef, useEffect, useState } from 'react';

export function App(props) {
  const accordionOperation = useRef(null);
  const [isOperationActive, setOperationActive] = useState(false);
  const [isOperationOpen, setOperationOpen] = useState(false);

  useEffect(() => {
    const accordionOperationChildren = accordionOperation.current?.children;
    for (let i = 0; i < accordionOperationChildren?.length; i++) {
      if (accordionOperationChildren[i].classList.contains("link-active")) {
        setOperationActive(true);
      } else {
        setOperationActive(false);
      }
    }
  }, []);

  return (
    <div className='App'>
      <ul className="accordion-content" ref={accordionOperation}>
        <NavLink
          to="/hc20/bee"
          className={({ isActive }) => (
            isActive ? "link-active" : "disable"
          )}
        >
          <li className="aside_list-item">Bees</li>
        </NavLink>
        <NavLink
          to="/hc20/command"
          className={({ isActive }) => (
            isActive ? "link-active" : "disable"
          )}
        >
          <li className="aside_list-item">Commands</li>
        </NavLink>
      </ul>
    </div>
  );
}

但我的状态称为isOperationActive并没有根据active-link改变

enter image description here

那么,我如何才能保持我的isOperationActive个状态更新?

This is rest of my code

<div className="accordion operations">
  <div className="accordion-item">
    <div
      className="accordion-title"
      role="button"
      tabIndex={0}
      onClick={() => setOperationOpen(!isOperationOpen)}
    >
      <div
        className={isOperationOpen
        ? "accordion-title-head "
        : "accordion-title-head"}
      >
        <ArrowsHorizontal style={{ paddding: "4px" }} />
        <div className={"dropdownOperation"}>Operations</div>
        <div className="text-white">
          {isOperationOpen ? <ChevronUp /> : <ChevronDown />}
        </div>
      </div>
    </div>
    {isOperationOpen && (
      <ul className="accordion-content" ref={accordionOperation}>
        <NavLink
          to="/hc20/bee"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Bees</li>
        </NavLink>
        <NavLink
          to="/hc20/command"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Commands</li>
        </NavLink>
        <NavLink
          to="/hc20/company"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Companies</li>
        </NavLink>
        <NavLink
          to="/hc20/dashboard"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Dashboards</li>
        </NavLink>{" "}
        <NavLink
          to="/hc20/device-profile"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Device Profiles</li>
        </NavLink>
        <NavLink
          to="/hc20/location"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Location</li>
        </NavLink>{" "}
        <NavLink
          to="/hc20/route"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Routes</li>
        </NavLink>{" "}
        <NavLink
          to="/hc20/sub"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Subscriptions</li>
        </NavLink>
        <NavLink
          to="/hc20/trackable"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Trackables</li>
        </NavLink>{" "}
        <NavLink
          to="/hc20/user"
          className={({ isActive }) => (isActive ? "link-active" : "disable")}
        >
          <li className="aside_list-item">Users</li>
        </NavLink>
      </ul>
    )}
  </div>
</div>

推荐答案

目前,假设一旦for循环中的if语句计算结果为true并执行setOperationActive(true);,for循环将停止判断其他元素.但这不会发生.查看其他元素的for循环的后续迭代将调用else块中的setOperationActive(false);,因此不会像预期的那样将状态设置为true.

通常,如果您发现自己试图在循环中设置状态(这样做时不会中断),则很可能是做错了什么.其思想是,您只需要设置一次状态值.虽然可以通过循环计算将该状态值设置为什么,但该值的设置应该只需要发生一次,例如:

const accordionOperationChildren = accordionOperation.current?.children;
let active = false; // determines what we set out state value to
for (let i = 0; i < accordionOperationChildren?.length && !active; i++) { // stop looping if active is true or we've reached the end of our children
  if (accordionOperationChildren[i].classList.contains("link-active")) {
    active = true;
  } 
}
setOperationActive(active); // only call this once

我们还有其他方法可以编写上述内容,例如使用.some():

const accordionOperationChildren = Array.from(accordionOperation.current?.children ?? []);
const active = accordionOperationChildren.some(
  elem => elem.classList.contains("link-active")
);
setOperationActive(active);

或者,您可以使用.querySelector()判断是否匹配:

const activeLink = Boolean(accordionOperation.current?.querySelector(".active-link"));
setOperationActive(activeLink);

上面的操作与您所做的略有不同,因为这不仅搜索accordion-content的直接子级,还搜索嵌套子级(即:每个<a>标记的子级),以查找与active-link类匹配的元素.如果这是一个问题(HTML屏幕截图中的juding看起来不像),您也可以将:scope pseudo-class(记住其浏览器可用性)与子combinator Select 器一起使用:

const activeLink = Boolean(accordionOperation.current?.querySelector(":scope > .active-link"));
setOperationActive(activeLink);

Javascript相关问答推荐

如何在react + react路由域名中使用DeliverBrowserRouter?

JavaScript:循环访问不断变化的数组中的元素

用户单击仅在JavaScript中传递一次以及其他行为

如何在Angular中插入动态组件

Redux查询多个数据库Api reducerPath&

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

如何从调整大小/zoom 的SVG路径定义新的d属性?""

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

在react JS中映射数组对象的嵌套数据

如何在输入元素中附加一个属性为checkbox?

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

VUE 3捕获错误并呈现另一个组件

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

环境值在.js文件/Next.js中不起作用

传递方法VS泛型对象VS事件特定对象

警告框不显示包含HTML输入字段的总和

为什么NULL不能在构造函数的.Prototype中工作

如何在下一个js中更改每个标记APEXCHARTS图表的 colored颜色

material UI自动完成全宽

在HTML中使用meta标记来指定定制元数据以用于使用JavaScript进行检索是不是一个坏主意?