【问题标题】:Toggle class for clicked element only in React.js仅在 React.js 中为单击的元素切换类
【发布时间】:2018-08-12 20:24:02
【问题描述】:

我有一个带有Edit 按钮的联系人列表。单击它时,我想让<div> 出现输入。目前,当单击该按钮时,此<div> 将针对我的联系人列表中的所有元素显示。 这是代码。我没有在这里放从 API 等获取联系人的代码。

```

class App extends Component {

  state = {
    contacts: [],
    firstName: '',
    lastName: '',
    phoneNumber: '',
    email: '',
    editVisible: true
  };

  showEditDiv = (id) => {
    this.setState({
      editVisible: !this.state.editVisible
    })
  };

  render() {

  const visibility = this.state.editVisible ? 'unvisible' : 'visible';

    return (
        <ul>
          {this.state.contacts.map(contact => {
            return (
              <div>
                <li key={contact.id}>
                  <p>{contact.firstName} {contact.lastName}</p>
                  <p>{contact.phoneNumber}</p>
                  <p>{contact.email}</p>
                  <button onClick={() => this.removeContact(contact.id)}>Remove</button>
                  <button onClick={() => this.showEditDiv(contact.id)}>Edit</button>
                  <div key={contact.id} className={`edit-form ${visibility}`}>
                    <p>This is edit form</p>
                  </div>
                </li>
              </div>
            )
          })}
        </ul>
      </div>
    );
  }
}

export default App;
.edit-form {
  height: 100px;
  background: #a7a7a7;
}

.unvisible {
  display: none;
}

.visible {
  display: block;
}

【问题讨论】:

  • 您的渲染方法末尾似乎有一个额外的关闭 &lt;/div&gt; 标记 - 这可能会导致您出现布局问题

标签: javascript reactjs forms onclick


【解决方案1】:

根据您的情况,您需要在您的状态中保留一个单独的属性并设置各个项目的可见性。这是一个工作示例。如果我是你,我会将联系人项目提取到它自己的组件中,并摆脱在你的 onClick 处理程序中调用的那些函数。

class App extends React.Component {
  state = {
    contacts: [
      { id: 1, firstName: "foo", lastName: "foo", email: "foo@foo.com" },
      { id: 2, firstName: "bar", lastName: "bar", email: "bar@bar.com" }
    ],
    firstName: "",
    lastName: "",
    phoneNumber: "",
    email: "",
    editVisibles: {}
  };

  showEditDiv = id => {
    this.setState(prevState => ({
      editVisibles: {
        ...prevState.editVisibles,
        [id]: !prevState.editVisibles[id]
      }
    }));
  };

  render() {
    return (
      <ul>
        {this.state.contacts.map(contact => {
          return (
            <div>
              <li key={contact.id}>
                <p>
                  {contact.firstName} {contact.lastName}
                </p>
                <p>{contact.email}</p>
                <button onClick={() => this.removeContact(contact.id)}>
                  Remove
                </button>
                <button onClick={() => this.showEditDiv(contact.id)}>
                  Edit
                </button>
                <div
                  key={contact.id}
                  className={`edit-form ${
                    !this.state.editVisibles[contact.id]
                      ? "unvisible"
                      : "visible"
                  }`}
                >
                  <p>This is edit form</p>
                </div>
              </li>
            </div>
          );
        })}
      </ul>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
.edit-form {
height: 100px;
background: #a7a7a7;
}

.unvisible {
display: none;
}

.visible {
display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

【讨论】:

  • 谢谢!那是工作的。我刚刚开始部署小型应用程序,所以一开始我把所有东西都放到了 App.js 。后来我把这些部分分成小组件。
  • 但是如果一个打开并且当你点击下一个时,已经打开的应该关闭并且点击的那个应该只打开。我面临同样的问题..你能帮助@devserkan
  • @midhunk,然后只保留一个可见状态属性并将其值设置为项目的 id,如果我理解正确的话。
  • 你是对的,你能像 tat 一样在 jsfiddle 中展示上面的例子吗,会很棒..
  • 您只需要更改这些:editVisible: undefined 我删除了“s”,因为它不再是复数。设置状态:this.setState({ editVisible: id}) 和 div 部分${this.state.editVisible !== contact.id ? "unvisible" : "visible"}
【解决方案2】:

您可以使用“contact.id”来代替editVisible,意思是:

showEditDiv = (id) => { 
   this.setState(prevState => ({ editingContactId: prevState.editingContactId === id? null:id})) 
};

而 div 将是:

<div key={contact.id} className={contact.id === this.state.editingContactId?'edit-form visible' :'edit-form unvisible'}>
  ... 
</div>

【讨论】:

  • 谢谢!这是一个很好的解决方案,但我必须弄清楚当再次点击编辑时如何隐藏相同的div
猜你喜欢
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
相关资源
最近更新 更多