代码之家  ›  专栏  ›  技术社区  ›  Darren

通过循环中的setState添加类名

  •  1
  • Darren  · 技术社区  · 6 年前

    如何分配 className="active" 以循环方式 setState

    this.state = {clicked: true}
    ...
    {i.rate_plans.map((j,index) => {
      return(
        <div key={index}>
          <h2 onClick= {() => this.setState({clicked: !this.state.clicked})}>{j.name}</h2>
          <div className=${this.state.clicked ? '' : 'active'}>...</div>
        </div>
      )
    })}
    

    这会将类添加到循环中的所有项。如何添加到已单击的项,而不是其他项?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Tholle    6 年前

    你可以保留一个跟踪你所有 rate_plans 已经点击了。

    例子

    class App extends React.Component {
      state = {
        rate_plans: [{ name: "test" }, { name: "test2" }],
        clicked_rate_plans: {}
      };
    
      onClick = plan => {
        this.setState(previousState => {
          const clicked_rate_plans = { ...previousState.clicked_rate_plans };
          clicked_rate_plans[plan.name] = !clicked_rate_plans[plan.name];
          return { clicked_rate_plans };
        });
      };
    
      render() {
        return (
          <div>
            {this.state.rate_plans.map((j, index) => {
              return (
                <div key={index}>
                  <h2 onClick={() => this.onClick(j)}>
                    {j.name} {this.state.clicked_rate_plans[j.name] && " clicked"}
                  </h2>
                </div>
              );
            })}
          </div>
        );
      }
    }
    
        2
  •  0
  •   Zohaib Aslam    6 年前

    好吧,这就是问题所在。您只需使用一个变量来存储单击的元素。如果你只点击一个元素,它就会添加 active 类的所有元素,因为它们仅基于一个变量。你需要的是有一个数组,并根据数组中元素的索引来存储点击状态。那就行了。我已经为你创建了一个沙盒。 这是 ( CodeSandbox )