如何在 ReactJS 中添加或删除事件上的 className?

IT技术 javascript node.js reactjs
2021-04-11 00:23:16

我对 React 很陌生,我在将我的想法从标准 js 转换过来时遇到了一些困难。

在我的react组件中,我有以下元素:

<div className='base-state' onClick={this.handleClick}>click here</div>

我正在寻找的行为是在点击时添加一个额外的类。我的第一个想法是尝试在点击处理函数中添加类,例如

handleClick : function(e) {
   <add class "click-state" here>
}

尽管如此,我还没有找到任何类似的例子,所以我很确定我没有以正确的方式思考这个问题。

任何人都可以指出我正确的方向吗?

5个回答

类列表可以从组件的状态派生。例如:

var Component = React.createClass({
  getInitialState: function() {
    return {
      clicked: false
    };
  },

  handleClick: function() {
    this.setState({clicked: true});
  },

  render: function() {
    var className = this.state.clicked ? 'click-state' : 'base-state';
    return <div className={className} onClick={this.handleClick}>click here</div>;
  }
});

调用this.setState将触发组件的重新渲染。

我有一个元素列表,当我在我的解决方案中实现它时,列表中所有元素的类都会发生变化。我希望它只更改列表中的一项,即我单击的一项。有什么解决办法吗?
2021-05-30 00:23:16
您还可以使用classSet()插件助手:facebook.github.io/react/docs/class-name-manipulation.html
2021-06-11 00:23:16
对于 Temp O'rary 人:对于元素列表,您可能还没有绑定点击处理程序。在具有类似元素的元素中onClick={() => this.handleClick}或在您的构造函数中:this.handleClick = this.handleClick.bind(this);并在您的 handleClick 中,使状态为特定元素(this.setState({someName})例如),而不仅仅是泛型clicked: true
2021-06-15 00:23:16
@TempO'rary 在您的点击处理程序中设置一些状态,即点击项目的 id 或索引,然后在渲染中,如果当前项目是点击项目,则呈现替代类。
2021-06-17 00:23:16

您可以只使用 Vanilla JS(event.targetclassList):

handleClick = event => event.target.classList.add('click-state');

render() {
  return <div className="base-state" onClick={this.handleClick}>Click here</div>;
}

但是不要那样做!

React 应该处理 DOM 中的更改,因此依赖于通过 React 修改 CSS 类。

事件目标

元素.classList

react/样式和 CSS

当您想从多个元素中更改一个元素时,这是一个很好的响应。谢谢!
2021-06-06 00:23:16
如果重新渲染目标,则该类不再存在!
2021-06-13 00:23:16
这是 React 中的反模式,请避免这样做。
2021-06-17 00:23:16

您可以在单击处理程序函数中设置单击状态,并使用它来使用模板文字有条件地设置类名。

如果您使用的是函数组件,则可以使用useState钩子以这种方式执行此操作

const [clicked, setClicked] = useState(false);

<div className={ `base-state ${clicked && 'click-state'}` } onClick={ () => setClicked(true) }>click here</div>

上述每个解决方案都是关于className='click-state'单击设置,但如果双击时已存在,则不删除类。如果有人正在使用功能组件,则可以通过使用useState钩子和一些条件语句来实现这种行为

const [clicked, setClicked] = useState('');

const handleClick = () => {
  clicked ? setClicked('') : setClicked('base-state click-state');
};

<div className={clicked || 'base-state' } onClick={handleClick}>click here</div>

让我们有一个 div 块:

<div id={props.id} key={props.id} 
    onMouseEnter={() => onMouseEnter(props.id)}
    onMouseLeave={() => onMouseLeave(props.id) } 
    className="other fixed classes"
</div>

要在不影响旧类的情况下添加和删除新类,我们可以使用 onMouseEnter/ onMouseLeave 事件或其他类似点击事件:

   const onMouseEnter = (id) => {
    let element = document.getElementById(id)
    ReactDOM.findDOMNode(element).classList.add("myNewClass") 
   }

   const onMouseLeave = (id) => {
    let element = document.getElementById(id)
    ReactDOM.findDOMNode(element).classList.remove("myNewClass")
   }
这不是 React 应该被使用的方式。
2021-06-13 00:23:16
当我使用 ReactDOM.findDOMNode 时,我的 linter 很快就抱怨了。不要使用 findDOMNode。它不适用于函数组件并且在 StrictMode 中被弃用。参见reactjs.org/docs/react-dom.html#finddomnodeeslintreact/...
2021-06-19 00:23:16