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

从通过map呈现的序列的单个div中移除类

  •  3
  • theJuls  · 技术社区  · 6 年前

    我正在呈现一个带有一些内容和按钮的div序列。所有的div都有一个特定的类,它们也有一个按钮。当我点击这个按钮时,我想删除它所属的div类。我的渲染代码如下所示:

    render () {
      return (
        <div>
          {
            arr.map(x => {
              return (
                <div className={this.state.displayClass ? 'someClass' : ''}>
                  <button onClick={() => this.handleClick()}> Remove class <button>
                </div>
              )
            })
          }
        </div>
      )
    }
    

    displayClass 为false,我成功地删除了div:

    handleClick () {
      this.setState({ displayClass: false })
    }
    

    这里的问题显然是,我这样做,它将删除所有div中的所有类。所以我的问题是,如何使每个按钮单击后只从它自己的div中删除类?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Alejandro    6 年前

    只需将每个div提取到具有自己状态的单独组件中:

    class ClassManagableDiv extends PureComponent {
      state = {
        displayClass: true
      };
    
      handleClick = () => {
        this.setState({ displayClass: false })
      }
    
      render() {
        return <div className={this.state.displayClass ? 'someClass' : ''}>
          <button onClick={this.handleClick}> Remove class </button>
        </div>
      }
    }
    

    render () {
      return (
        <div>
          {
            arr.map(x => <ClassManagableDiv />)
          }
        </div>
      )
    }
    
        2
  •  0
  •   Anthony Garcia-Labiad    6 年前

    您可以为单个 div 它将包含那个状态。然后当你点击按钮时,它只会更新该组件的状态,而不是所有组件的状态。

        3
  •  0
  •   D3Portillo    6 年前
    render () {
      return (
        <div>
          {
            arr.map(x => {
              return (
                <div className={this.state.displayClass ? 'someClass' : ''}>
                  <button onClick={(ev) => this.handleClick(ev,"someClass")}> Remove class <button>
                </div>
              )
            })
          }
        </div>
      )
    

    handleClick (ev,classN) {
        ev.currentTarget.parentNode.classList.remove(classN)
    }
    

    它是干什么的?在调用handleClick plus时,您将sen de event“ev”添加要删除的类名,然后在handleClick中获得触发该事件的目标el,然后查找其父级/即持有该类的父级/并将其删除