繁体   English   中英

React.js | 如何以更好的方式处理className?

[英]React.js | How to handle className in a better way?

我想使用事件和状态来处理className,就像这样

class SampleComponent extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      class1: 'bar',
      class2: 'bar'
    };
  }

  handleBarClick() {
    this.setState({
      class1: 'bar active',
      class2: 'bar'
    });
  }

  handleFooClick() {
    this.setState({
      class1: 'bar',
      class2: 'bar active'
    });
  }

  render() {
    return (
      <div>
        <span className={this.class1} onClick={this.handleBarClick.bind(this)}>bar</span>
        <span className={this.class2} onClick={this.handleFooClick.bind(this)}>foo</span>
      </div>
    );
  }
}

但是这段代码有点浪费,应该更简单。

我想以更好的方式写作,有人可以给出一些建议吗? 谢谢。

您可以使用classNames( https://github.com/JedWatson/classnames )以更好的方式实现相同的目标,如下所示:

首先导入className:

import className from 'classnames'

第二个从你的州获得课程:

<span className={ className('bar', {'active': this.state.active, 'otherClass': this.state.booleanValue }) } />

如果你在active和booleanValue中有true,这将以这样结束:

<span class='bar active otherClass'  />

或者像这样,如果是假的

<span class='bar'  />

尝试这个:

class SampleComponent extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      itemName='bar'
    };
  }

  handleItemClick(itemName) {
    this.setState({itemName:itemName});
  }

  render() {
    return (
      <div>
        <span className={this.state.itemName == 'bar' ? 'bar active' : 'bar'} onClick={this.handleItemClick.bind(this, 'bar')}>bar</span>
        <span className={this.state.itemName == 'foo' ? 'bar active' : 'bar'} onClick={this.handleItemClick.bind(this, 'foo')}>foo</span>
      </div>
    );
  }
}

这稍微清洁一点

class SampleComponent extends React.Component {

  constructor(props) {
    super(props);

    this.state = {
      activeBar: 0
    };
  }

  handleBarClick(number) {
    this.setState({
      activeBar: number
    });
  }

  render() {
    var class1 = this.state.activeBar == 1 ? "bar active" : "bar";
    var class2 = this.state.activeBar == 2 ? "bar active" : "bar";

    return (
      <div>
        <span className={class1} onClick={this.handleBarClick.bind(this, 1))}>bar</span>
        <span className={class2} onClick={this.handleBarClick.bind(this, 2)}>foo</span>
      </div>
    );
  }
}

我会这样做:

class SampleComponent extends React.Component {

  state = {
    activeIndex: 0
  };

  handleClick(index) {
    this.setState({ activeIndex: index });
  }

  render() {
    const { activeIndex } = this.state;

    return (
      <div>
        {
          ['bar', 'foo'].map((item, index) => (
            <span
              className={`bar${activeIndex === index ? ' active' : ''}`}
              onClick={() => this.handleClick(index)}
              key={index}
            >
              {item}
            </span>
          ))
        }
      </div>
    );
  }
}

请参阅演示小提琴: https//jsfiddle.net/free_soul/6snyL2rc/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM