在状态改变时react改变类名

IT技术 javascript reactjs
2021-04-19 17:24:24

我有一个这样的状态,我正在设置activeclass标记这样的:

constructor(props) {
  super(props);
  this.state = {'active': false, 'class': 'album'};
}

handleClick(id) {
  if(this.state.active){
    this.setState({'active': false,'class': 'album'})
  }else{
    this.setState({'active': true,'class': 'active'})
  }
}

我有一个带有状态类名称的项目列表:

<div className={this.state.class} key={data.id} onClick={this.handleClick.bind(this.data.id}>
  <p>{data.name}</p>
</div>

这里如何更改特定 div 的类名?

1个回答

下面是我认为您正在尝试做的功能齐全的示例(带有功能片段)。

解释

根据您的问题,您似乎正在state为所有元素修改 1 个属性这就是为什么当您单击一个时,所有这些都将被更改。

特别要注意,状态会跟踪哪个元素处于活动状态的索引MyClickable被点击时,它告诉Container它的索引,Container更新state,随后isActive相应的财产MyClickable秒。

例子

class Container extends React.Component {
  state = {
    activeIndex: null
  }

  handleClick = (index) => this.setState({ activeIndex: index })

  render() {
    return <div>
      <MyClickable name="a" index={0} isActive={ this.state.activeIndex===0 } onClick={ this.handleClick } />
      <MyClickable name="b" index={1} isActive={ this.state.activeIndex===1 } onClick={ this.handleClick }/>
      <MyClickable name="c" index={2} isActive={ this.state.activeIndex===2 } onClick={ this.handleClick }/>
    </div>
  }
}

class MyClickable extends React.Component {
  handleClick = () => this.props.onClick(this.props.index)
  
  render() {
    return <button
      type='button'
      className={
        this.props.isActive ? 'active' : 'album'
      }
      onClick={ this.handleClick }
    >
      <span>{ this.props.name }</span>
    </button>
  }
}

ReactDOM.render(<Container />, document.getElementById('app'))
button {
  display: block;
  margin-bottom: 1em;
}

.album>span:after {
  content: ' (an album)';
}

.active {
  font-weight: bold;
}

.active>span:after {
  content: ' ACTIVE';
}
<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="app"></div>

更新:“循环”

在回应关于“循环”版本的评论时,我相信问题是关于渲染MyClickable元素数组我们不会使用循环,而是使用map,这在 React + JSX 中很典型。以下应该为您提供与上述相同的结果,但它适用于元素数组。

// New render method for `Container`
render() {
  const clickables = [
    { name: "a" },
    { name: "b" },
    { name: "c" },
  ]

  return <div>
      { clickables.map(function(clickable, i) {
          return <MyClickable key={ clickable.name }
            name={ clickable.name }
            index={ i }
            isActive={ this.state.activeIndex === i }
            onClick={ this.handleClick }
          />
        } )
      }
  </div>
}
@maxwell 这可能会令人困惑。onClickpropMyClickable它是一个传递给 的函数MyClickable每个MyClickable都传递了 中handleClick定义函数Container然后MyClickable负责在适当的时间使用适当的参数调用此函数。这是根据子组件中发生的情况更新父组件状态的典型方式。在这个例子中,每个人MyClickable都会onClick用他们的索引调用他们的函数,有效地告诉Container哪个是活动的。
2021-05-25 17:24:24
啊我现在明白了;对我来说似乎很直观,react 会找到一种方法来在组件之间传输状态访问,而无需将属性作为中间步骤,但他们是专家
2021-05-30 17:24:24
在组件构造和容器中分配的 onClick 是相同的 onClicks 吗?为什么你需要4个onclick方法设置属性和状态,困惑
2021-06-15 17:24:24