javascript - 如何创建一个动态列表,其中的元素描述仅在单击元素时显示?

标签 javascript css reactjs list

我有一个用 React 生成的元素列表。当我单击这些元素时,每个元素都必须在元素下方显示一个带有选项的栏。当前代码的问题是我必须双击才能显示栏,还必须双击才能隐藏。我只想单击一下。请记住,列表是动态的。对于静态列表,这很容易做到。

我曾尝试更改代码,但我得到的最接近的结果是单击一下即可同时显示所有元素的所有栏。

_list() {
    return (
        <>
            <div>
                {
                    this.state.places
                        .map(place =>
                            (
                                <div key={place.id} className="listItem">
                                    <div className="place" onClick={this.toggleListItem}>
                                        <div className="placeTitle">{place.name}</div>
                                        <div className="placeAddress">{place.address}</div>
                                    </div>
                                    <div className="content">
                                        <div>
                                            <i className="fas fa-edit fa-2x" onClick={this.handleClick('edit', place)}></i>
                                            <i className="far fa-trash-alt fa-2x"></i>
                                        </div>
                                    </div>
                                </div>
                            )
                        )
                }
            </div>
            <div className="addPlaceButton" onClick={this.handleClick('edit')}>
                <span className="addPlace">ADD A NEW PLACE</span>
            </div>
        </>
    );
}



toggleListItem() {
    var coll = document.getElementsByClassName("place");
    var i;

    for (i = 0; i < coll.length; i++) {
        coll[i].addEventListener("click", function () {
            this.classList.toggle("active");



            let siblingContent = this.nextElementSibling;

            if (siblingContent.style.maxHeight) {
                siblingContent.style.maxHeight = null;
                this.style.webkitBorderBottomLeftRadius = 8;
                this.style.webkitBorderBottomRightRadius = 8;

            } else {
                siblingContent.style.maxHeight = siblingContent.scrollHeight + "px";
                this.style.webkitBorderBottomLeftRadius = 0;
                this.style.webkitBorderBottomRightRadius = 0;
            }
        });
    }
}

最佳答案

问题似乎是当您单击一个列时,您将单击事件监听器分配给所有列,要解决此问题,您可以将列的索引作为 toggleListItem(index) 传递给 toggleListItem 函数并相应地分配 eventListener 函数。

this.state.places.map((place, index) =>(
         <div key={place.id} className="listItem">
             <div className="place" onClick={this.toggleListItem(index)}>
...

toggleListItem(index){
  var coll = document.getElementsByClassName("place");
  coll[index].addEventListener("click", function () {
  this.classList.toggle("active");

  let siblingContent = this.nextElementSibling;

  if (siblingContent.style.maxHeight) {
    siblingContent.style.maxHeight = null;
    this.style.webkitBorderBottomLeftRadius = 8;
    this.style.webkitBorderBottomRightRadius = 8;

  } else {
       siblingContent.style.maxHeight = siblingContent.scrollHeight + "px";
       this.style.webkitBorderBottomLeftRadius = 0;
       this.style.webkitBorderBottomRightRadius = 0;
    }
 }

关于javascript - 如何创建一个动态列表,其中的元素描述仅在单击元素时显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55451709/

相关文章:

javascript - 两个具有通用工厂和 ng-repeat 刷新功能的 Controller

javascript - 如何使用 JavaScript 从 Ajax 请求解析 JSON

javascript - 如何为我的任务实现实现 Promise.all 的等价物?

javascript - 如何将唯一 id 分配给与其行号对应的复选框(更新 : or item ID) under Bootstrap 4?

reactjs - 在 Vue/Vuex 中是否有类似 mapStateToProps 的 react/redux 方式

html - 粘性导航栏页脚 CSS 不起作用

html - Eclipse css 内容辅助( Bootstrap )

javascript - 如何得到这种网页效果

javascript - 使用没有 async/await 的 Promise 时, Electron 打开对话框会挂起

reactjs - 有没有办法禁用 Material UI 扩展面板的动画?