【问题标题】:How to toggle CSS styles with Toggle method in React如何在 React 中使用 Toggle 方法切换 CSS 样式
【发布时间】:2021-05-01 13:52:09
【问题描述】:

这是带有 React-Bootstrap 的 Header 组件。我用纯 CSS 创建了一个菜单图标,但我想更改图标功能 onClick 但我收到错误 - TypeError: Cannot read property 'toggle' of undefined 。有什么方法我弄错了吗?好心检查。谢谢。

另外,有没有办法,我可以用 React Hooks 方法代替?

谢谢。

import styles from './Landing.module.css';
import './Landing.module.css';;

const openMenu = (open) => {
    open.classList.toggle('change');
};

 <Nav className="ml-auto">
  <div className={styles.allMenus}>
    <div className="menuIcon" onClick={openMenu}>
       <div className={styles.bar1}></div>
         <div className={styles.bar2}></div>
           <div className={styles.bar3}></div>
         </div>
      </div>
 </Nav>

我的 CSS - 它有变化的样式

div[class="menuIcon"] {
    background-color: #ffffff;
    padding: 13px;
    margin-right: 46px;
    float: right;
    cursor: pointer;
}

.bar1, .bar2, .bar3 {
    width: 32px;
    height: 3px;
    background-color: #333;
    margin: 6px 0;
    transition: 0.4s;
}

.change .bar1 {
    -webkit-transform: rotate(-45deg) translate(-9px, 6px) ;
    transform: rotate(-45deg) translate(-9px, 6px) ;
}
  
.change .bar2 {
    opacity: 0;
}
  
.change .bar3 {
    -webkit-transform: rotate(45deg) translate(-8px, -8px) ;
    transform: rotate(45deg) translate(-8px, -8px) ;
}

【问题讨论】:

  • className="menuIcon" 是这样声明类名的吗?!在标准 HTML 中,它只是 class="my_class"。我会改变它......并试一试。特别是考虑到您似乎正在尝试使用 javascript 函数...

标签: javascript css reactjs ecmascript-6 react-bootstrap


【解决方案1】:

您正在尝试在 React 中使用 DOM 的 classList,但 React JSX 元素不是 DOM 元素,而是基于 XML 的标记,已被翻译为 JS。

在 React 中,您需要使用 state/props 来控制行为,并添加或删除类。

在示例中,我使用useState() 挂钩来切换布尔值,然后在模板字符串中添加或删除类名。

您可以使用诸如classnames 之类的库来防止自己编写大量带有类名的模板字符串。

const { useState } = React;

const styles = {
  menuIcon: 'menuIcon',
  change: 'change',
  bar1: 'bar1',
  bar2: 'bar2',
  bar3: 'bar3',
};

const Demo = () => {
  const [changed, setChange] = useState(false);
  
  const openMenu = (open) => {
    setChange(c => !c);
  };

  return (
    <nav className="ml-auto">
      <div className="allMenus">
        <div className={`${styles.menuIcon} ${changed ? styles.change : ''}`} onClick={openMenu}>
          <div className={styles.bar1}></div>
          <div className={styles.bar2}></div>
          <div className={styles.bar3}></div>
        </div>
      </div>
    </nav>
  );
}

ReactDOM.render(
  <Demo />,
  root
);
.menuIcon {
  padding: 13px;
  margin-right: 46px;
  float: right;
  cursor: pointer;
}

.bar1,
.bar2,
.bar3 {
  width: 32px;
  height: 3px;
  background-color: #333;
  margin: 6px 0;
  transition: 0.4s;
}

.change .bar1 {
  -webkit-transform: rotate(-45deg) translate(-9px, 6px);
  transform: rotate(-45deg) translate(-9px, 6px);
}

.change .bar2 {
  opacity: 0;
}

.change .bar3 {
  -webkit-transform: rotate(45deg) translate(-8px, -8px);
  transform: rotate(45deg) translate(-8px, -8px);
}
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

<div id="root"></div>

【讨论】:

  • 这行得通。但就我而言,这些样式没有得到应用。所有样式都不起作用,当我检查元素时,更改已应用于菜单图标,但样式不适用于它。
  • 您使用的是变量(样式)而不是字符串。不要用引号括起来。
  • 可能是因为我使用 className 作为 - className={styles.theStyleName}?我还是没听懂。
  • 尝试将 className 更改为 className={styles.bar1} 和其余部分。我会使用字符串,但我使用的是 CSS 框架。
  • styles.allMenus 是一个字符串,因为这是 className 接受的。尝试console.log(styles),你会发现它是一个带有字符串属性的对象。
猜你喜欢
  • 2021-01-10
  • 2022-01-07
  • 2021-01-26
  • 1970-01-01
  • 2011-12-12
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多