【问题标题】:react change class name on state change对状态更改做出反应更改类名
【发布时间】:2016-02-05 12:20:30
【问题描述】:

我有这样的状态,我正在设置 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 的类名?

【问题讨论】:

  • 您必须发布更多代码。如果&lt;div&gt; 在您在第一个代码 sn-p 中描述的组件的渲染方法中,那么是的,应该可以。
  • 是的,它在渲染方法中..但是列表中的所有 div 都在改变..我想更改我点击的 div 的类..

标签: javascript reactjs


【解决方案1】:

下面是我认为您正在尝试做的一个完整功能示例(使用功能性 sn-p)。

说明

根据您的问题,您似乎正在为您的所有元素修改 state 中的 1 个属性。这就是为什么当你点击一个时,它们都被改变了。

特别注意,状态跟踪哪个元素处于活动状态的索引。当点击MyClickable 时,它告诉Container 其索引,Container 更新state,随后更新相应MyClickables 的isActive 属性。

示例

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>
}

【讨论】:

  • 组件构造和容器中分配的onClick是否相同?为什么需要4个onclick方法设置属性和状态,一头雾水
  • @maxwell 这可能会令人困惑。 onClickpropMyClickable。它是一个传递给 MyClickable 的函数。每个MyClickable 都被传递给Container 中定义的handleClick 函数。然后MyClickable 负责在适当的时间使用适当的参数调用此函数。这是根据子组件中发生的情况更新父组件状态的典型方式。在这个例子中,每个MyClickable 都将调用它们的onClick 函数并使用它们的索引,有效地告诉Container 哪个是活动的。
  • 啊我明白了;在我看来,react 会找到一种在组件之间转移状态访问的方法,而无需在中间步骤中涉及属性,这似乎很直观,但他们是专家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多