debugging 如何使用useRef()访问特定元素的类名以添加/删除该类名?

uubf1zoe  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(111)

下面是这个jQuery片段

$("#navbarSupportedContent").on("click", "li", function (e) {
  $("#navbarSupportedContent ul li").removeClass("active");
  $(this).addClass("active");
});

我试图将上面的代码片段转换为React.js代码。但是,它是不正确的。我甚至无法通过删除active类部分,这是上面代码片段的第一行。

const tabsNewAnimRef = useRef(null);
const horiSelectorRef = useRef(null);
const activeItemNewAnimRef = useRef(null);

tabsNewAnimRef.current.addEventListener("click", () => {
            let children = tabsNewAnimRef.current.children;

            // Convert an HTMLCollection to an Array
            let array = [...children];

            let childrenArray = array[0].children;
            console.log(childrenArray[2].classList[1].remove('active'));
});

<div className="collapse navbar-collapse" id="navbarSupportedContent" ref={tabsNewAnimRef}>
                <ul className="navbar-nav ml-auto">
                    <div className="hori-selector" ref={horiSelectorRef}>
                        <div className="left"></div>
                        <div className="right"></div>
                    </div>
                    <li className="nav-item" ref={activeItemNewAnimRef}>
                        <a className="nav-link" href="javascript:void(0);"><i className="fas fa-tachometer-alt"></i>Dashboard</a>
                    </li>
                    <li className="nav-item active" ref={activeItemNewAnimRef}>
                        <a className="nav-link" href="javascript:void(0);"><i className="fas fa-house-user"></i>Home</a>
                    </li>
                    <li className="nav-item" ref={activeItemNewAnimRef}>
                        <a className="nav-link" href="javascript:void(0);"><i className="far fa-clone"></i>Components</a>
                    </li>
                    <li className="nav-item" ref={activeItemNewAnimRef}>
                        <a className="nav-link" href="javascript:void(0);"><i className="far fa-calendar-alt"></i>Calendar</a>
                    </li>
                </ul>
</div>

我试着寻找各种可能的方法来做到这一点,但我总是遇到失败。我该如何做到这一点呢?

svmlkihl

svmlkihl1#

似乎useState适合处理active是否相关。

const [active, setActive] = useState(true);

<div id="navbarSupportedContent" onClick={() => setActive(!active);}>
 <ul>
  <li className={active ? "active" : ""}>...</li>
 </ul>
</div>

我认为您完全可以不使用useRef。

f3temu5u

f3temu5u2#

忘了使用useRef吧--在这个例子中,它不会有太大的用处,你需要在state中存储列表项的活动状态。
在这个例子中,为了使事情简单一点,有一个对象的配置数组,我们用它来初始化状态-所有项目的活动属性都设置为false。然后,我们可以在状态中使用此数组,通过mapping在每个对象上构建JSX中的列表项,并创建一个具有nav-item类的元素以及一个活动类(如果在状态。
第一个

相关问题