当前位置: 首页 > 知识库问答 >
问题:

如何删除活动类时单击另一个切换按钮在React.js?

衡丰茂
2023-03-14

在React.js中,我在header.js中有页面链接菜单和3个切换按钮。

单击时,所有切换按钮都有div层。

我想做的是。。。

  1. 当单击切换按钮时,必须删除其他切换按钮和图层。类别活动
  2. 当单击页面链接菜单(menu1、menu2、menu3)时,所有切换按钮和层都必须被删除

我需要什么来更改代码?

这就是我目前为止所尝试的。

请帮忙。

演示:https://codesandbox.io/s/49io4

header.js

import React, { useState, useEffect } from "react";

import { NavLink } from "react-router-dom";

export default function Header() {
  const [show, setShow] = useState(false);
  const [show2, setShow2] = useState(false);
  const [show3, setShow3] = useState(false);

  useEffect(() => {
    if (show) {
      document.body.classList.add("bodyRemoveScroll");
    } else {
      document.body.classList.remove("bodyRemoveScroll");
    }
  }, [show]);
  const onToggleClick = () => setShow(!show);
  const onToggleClick2 = () => setShow2(!show2);
  const onToggleClick3 = () => setShow3(!show3);

  return (
    <div className="header">
      {/* <NavLink to="/">Home</NavLink> */}
      /<NavLink to="/menu1">menu1</NavLink>/
      <NavLink to="/menu2">menu2</NavLink>/<NavLink to="/menu3">menu3</NavLink>/
      <button onClick={onToggleClick} className={show ? "active" : ""}>
        toggle1
      </button>
      <nav className={`layer1 ${show ? "active" : ""}`}>layer 1</nav>/
      <button onClick={onToggleClick2} className={show2 ? "active" : ""}>
        toggle2
      </button>
      <nav className={`layer2 ${show2 ? "active" : ""}`}>layer 2</nav>/
      <button onClick={onToggleClick3} className={show3 ? "active" : ""}>
        toggle3
      </button>
      <nav className={`layer3 ${show3 ? "active" : ""}`}>layer 3</nav>
    </div>
  );
}

共有2个答案

艾泉
2023-03-14

我建议只使用一个"show"useState,并指定一个"type"useState来进一步澄清图层:

import React, { useState, useEffect } from "react";

import { NavLink } from "react-router-dom";

export default function Header() {
  const [show, setShow] = useState(false);
  const [type, setType] = useState("");

  useEffect(() => {
    if (show) {
      document.body.classList.add("bodyRemoveScroll");
    } else {
      document.body.classList.remove("bodyRemoveScroll");
    }
  }, [show]);
  const onToggleClick = (type) => {
    setShow(!show);
    setType(type);
  };

  return (
    <div className="header">
      {/* <NavLink to="/">Home</NavLink> */}/
      <NavLink to="/menu1">menu1</NavLink>/<NavLink to="/menu2">menu2</NavLink>/
      <NavLink to="/menu3">menu3</NavLink>/
      <button
        onClick={() => onToggleClick("layer1")}
        className={show ? "active" : ""}
      >
        toggle1
      </button>
      <nav className={`layer1 ${show && type === "layer1" ? "active" : ""}`}>
        layer 1
      </nav>
      /
      <button
        onClick={() => onToggleClick("layer2")}
        className={show ? "active" : ""}
      >
        toggle2
      </button>
      <nav className={`layer2 ${show && type === "layer2" ? "active" : ""}`}>
        layer 2
      </nav>
      /
      <button
        onClick={() => onToggleClick("layer3")}
        className={show ? "active" : ""}
      >
        toggle3
      </button>
      <nav className={`layer3 ${show && type === "layer3" ? "active" : ""}`}>
        layer 3
      </nav>
    </div>
  );
}
艾凯捷
2023-03-14

在您的示例中,您应该在单击某个项目后取消选择其他值。另一个(更好的)选项是有一个状态变量,您将在其中存储当前的活动按钮id

const onToggleClick = () => {
  setShow(!show)
  setShow2(false);
  setShow3(false);
};

const onToggleClick2 = () => {
  setShow(false)
  setShow2(!show2);
  setShow3(false);
};

const onToggleClick3 = () => {
  setShow(false)
  setShow2(false);
  setShow3(!show3);
};

所以下面的例子对我来说更漂亮

import React, { useState, useEffect } from "react";

import { NavLink } from "react-router-dom";

export default function Header() {
  const [active, setActive] = useState('');

  useEffect(() => {
    if (active) {
      document.body.classList.add("bodyRemoveScroll");
    } else {
      document.body.classList.remove("bodyRemoveScroll");
    }
  }, [active]);

  const onSetActiveMenuItem = (item) => {
    if (item !== active){
      setActive(item);
    }
    else {
      setActive(''); // handle click on currently active item
    }
  };

  return (
    <div className="header">
      {/* <NavLink to="/">Home</NavLink> */}/
      <NavLink to="/menu1">menu1</NavLink>/<NavLink to="/menu2">menu2</NavLink>/
      <NavLink to="/menu3">menu3</NavLink>/
      <button onClick={() => onSetActiveMenuItem('item1')} className={active === 'item1' ? "active" : ""}>
        toggle1
      </button>
      <nav className={`layer1 ${active === 'item1' ? "active" : ""}`}>layer 1</nav>/
      <button onClick={() => onSetActiveMenuItem('item2')} className={active === 'item2' ? "active" : ""}>
        toggle2
      </button>
      <nav className={`layer2 ${active === 'item2' ? "active" : ""}`}>layer 2</nav>/
      <button onClick={() => onSetActiveMenuItem('item3')} className={active === 'item3' ? "active" : ""}>
        toggle3
      </button>
      <nav className={`layer3 ${active === 'item3' ? "active" : ""}`}>layer 3</nav>
    </div>
  );
}
 类似资料:
  • 下拉框使用CSS和超文本标记语言/JS设计,使用从JS添加的名为“is-open”的类。一旦出现在指定的超文本标记语言div中,它将激活CSS来显示子菜单。 然而,有一个小问题,即一旦单击下拉框将不会消失,除非单击相同的菜单项。(当单击菜单内容div之外时,类不会取消切换) 作为一项基本功能,一旦用户不仅单击菜单,而且单击页面上的任何位置,该菜单都需要消失。 我目前的javascript如下所示:

  • 我有这样的标记 和像这样的JS 所以在这里,我希望当我点击课程时,只有课程内容会显示出来,就像这样,当我点击配置文件和库时,只有配置文件和库会显示出来。在这里,它的工作很好,但我想知道如何添加一个类活动时,一个项目被点击在锚标记。假设我点击了lessons,那么一个活动类应该被添加到lessons锚标记中,当我点击了profile,那么活动类应该被从lessons锚标记中移除,它应该在profil

  • 我编写了上面的代码来动态创建文本字段和按钮;但现在我需要删除两个文本字段和一个按钮时,按钮被点击。我该怎么做?

  • 我想做的是禁用一个按钮,当我启用另一个按钮时(因此最多可以激活一个按钮),但我对JS的了解非常基础。任何提示都将不胜感激。 Lorem ipsum dolor sit amet,concetetur adipiscing elit。车辆三体间前庭。前庭等扫描电镜。Ut venenatis sagittis孕妇。Nam enim tortor,lacinia pretium dolor sit am

  • 我的菜单显示向下,但然后水平。 我希望每一个导航项目都显示下来,在彼此的上面。 现场测试站点URL:ministerios-elim.herokuapp.com CodePen:(无法使菜单在单击CodePen时出现)。 https://codepen.io/ogonzales/pen/abnqxlg 更新2: 更新3: