javascript - 从循环中显示和隐藏 React 中的特定组件

标签 javascript css reactjs loops state

每个 div 都有一个按钮。当我按下它时,它必须用相同的键显示 div,并隐藏其他的。 最好的方法是什么?这是我的代码

class Main extends Component {
    constructor(props) {
      super(props);
      this.state = {
        messages: [
          { message: "message1", key: "1" },
          { message: "message2", key: "2" }
          ]
      };
    }
    handleClick(message) {
     //something to show the specific component and hide the others
    }
    render() {
      let messageNodes = this.state.messages.map(message => {
        return (
        <Button key={message.key} onClick={e => this.handleClick(message)}>
         {message.message}
        </Button>
        )
     });
     let messageNodes2 = this.state.messages.map(message => {
        return <div  key={message.key}>
           <p>{message.message}</p>
           </div>
     });
     return <div>
         <div>{messageNodes}</div>
         <div>{messageNodes2}</div>
            </div>
    }
}

最佳答案

import React from "react";
import { render } from "react-dom";

class Main extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      messages: [
        { message: "message1", id: "1" },
        { message: "message2", id: "2" }
      ],
      openedMessage: false
    };
  }
  handleClick(id) {
    const currentmessage = this.state.messages.filter(item => item.id === id);
    this.setState({ openedMessage: currentmessage });
  }
  render() {
    let messageNodes = this.state.messages.map(message => {
      return (
        <button key={message.id} onClick={e => this.handleClick(message.id)}>
          {message.message}
        </button>
      );
    });
    let messageNodes2 = this.state.messages.map(message => {
      return (
        <div key={message.key}>
          <p>{message.message}</p>
        </div>
      );
    });
    const { openedMessage } = this.state;
    console.log(openedMessage);
    return (
      <div>
        {openedMessage ? (
          <div>
            {openedMessage.map(item => (
              <div>
                {" "}
                {item.id} {item.message}{" "}
              </div>
            ))}
          </div>
        ) : (
          <div> Not Opened</div>
        )}
        {!openedMessage && messageNodes}
      </div>
    );
  }
}

render(<Main />, document.getElementById("root"));

Edit zl2vxor7jm

这里的主要概念是下面这行代码。

  handleClick(id) {
    const currentmessage = this.state.messages.filter(item => item.id === id);
    this.setState({ openedMessage: currentmessage });
  }`

当我们映射我们的 messageNodes 时,我们传递消息 ID。当一条消息被点击时,该消息的 id 被传递给 handleClick 并且我们过滤所有不包含被点击消息的 id 的消息。然后,如果状态中有 openedMessage,我们将呈现消息,但同时我们将停止呈现消息节点,使用此逻辑 {!openedMessage && messageNodes}

关于javascript - 从循环中显示和隐藏 React 中的特定组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711981/

相关文章:

reactjs - Webpack 在热重载我的 React 应用程序时出错

javascript - React.js webview 和 native 代码之间进行通信?

java - 如何将 javascript 文件捆绑到 Java 应用程序中?

javascript - 使用javascript将一个div分成2个

Javascript 检查变量是否为 null 显示结果

ruby-on-rails - 图片在 chrome 中显示正确,但在 firefox 或 IE 中显示不正确

javascript - 在使用 javascript 和 css3 更改图像时产生效果

reactjs - React Hook Forms + Material UI 复选框

javascript - 在 R Shiny 的数据表中添加工具提示

javascript - 当 DIV 具有子 DIV 时,如何在 DIV 上使用 Javascript onmouseout