【问题标题】:How to toggle the display of a division with onclick event with a button in react?如何使用按钮在反应中切换带有 onclick 事件的分区的显示?
【发布时间】:2021-02-01 07:09:10
【问题描述】:

我试图在单击相应按钮时显示相应的<div>。基本上我想在单击相应按钮时显示hey man!hey woman!。 所以,我有两个这样的按钮:

<div className="row">
  <button className="btn col-6 bg-transparent col-12 col-sm-6" onclick={() => this.togglediv("showdiv1")}  >
    <img className="humanbody profile" src={malebody} />
  </button>
  <button className="btn col-6 bg-transparent col-12 col-sm-6" onclick={() => this.togglediv("showdiv2")}  >
    <img className="humanbody profile" src={femalebody} alt="" />
   </button>
</div>

这里使用以下代码处理 onclick 事件:

class Home extends React.Component {

    constructor() {
        super();
        this.state = {
            showdiv1: false,
            showdiv2: false
        };
        this.togglediv = this.togglediv.bind(this);
    }

    togglediv(div_name) {
        switch (div_name) {
            case "showdiv1":
                this.setState({ showdiv1: !this.state.showdiv1 });
                break;
            case "showdiv2":
                this.setState({ showdiv2: !this.state.showdiv2 });
                break;
        }
    }

    render() {

        const { showdiv1, showdiv2 } = this.state;

        return (
            <div className="container py-5">

                <div className="row">
                    <button className="btn col-6 bg-transparent col-12 col-sm-6" onclick={() => this.togglediv("showdiv1")}  >
                        <img className="humanbody profile" src={malebody} />
                    </button>
                    <button className="btn col-6 bg-transparent col-12 col-sm-6" onclick={() => this.togglediv("showdiv2")}  >
                        <img className="humanbody profile" src={femalebody} />
                    </button>
                </div>

                
                {/* Hidden div */}
                <div className="row">
                    {
                        showdiv1 && (
                            <div>
                                Hey man!
                            </div>
                        )
                    }
                    {
                        showdiv2 && (
                            <div>
                                Hey woman!
                            </div>
                        )
                    }
                </div>
                {/* Hidden div */}
            </div>
        )
    }
}

export default Home;

点击按钮时隐藏的分区不会出现在屏幕上。

编辑:我错误地在代码中写了onlcick 代替了onClick,在更正后,它工作正常。

【问题讨论】:

  • 那为什么要隐藏class=row呢?
  • 你没有重新显示隐藏的row

标签: javascript css reactjs


【解决方案1】:

工作示例:Stackblitz

您在button 中使用onclick 而不是onClick

<div className="row">
    <button className="btn col-6 bg-transparent col-12 col-sm-6" onClick={() => this.togglediv("showdiv1")}  >
        <img className="humanbody profile" src={malebody} />
    </button>
    <button className="btn col-6 bg-transparent col-12 col-sm-6" onClick={() => this.togglediv("showdiv2")}  >
        <img className="humanbody profile" src={femalebody} />
    </button>
</div>

完整的工作源代码:

import React from "react";
import "./style.css";

class Home extends React.Component {
  constructor() {
    super();
    this.state = {
      showdiv1: false,
      showdiv2: false
    };
    this.togglediv = this.togglediv.bind(this);
  }

  togglediv(div_name) {
    switch (div_name) {
      case "showdiv1":
        this.setState({ showdiv1: !this.state.showdiv1 });
        break;
      case "showdiv2":
        this.setState({ showdiv2: !this.state.showdiv2 });
        break;
    }
  }

  render() {
    const { showdiv1, showdiv2 } = this.state;

    return (
      <div className="container py-5">
        <div className="row">
          <button
            className="btn col-6 bg-transparent col-12 col-sm-6"
            onClick={() => this.togglediv("showdiv1")}
          >
            <img
              className="humanbody profile"
              src={"https://i.stack.imgur.com/t8vJf.jpg?s=328&g=1"}
            />
          </button>
          <button
            className="btn col-6 bg-transparent col-12 col-sm-6"
            onClick={() => this.togglediv("showdiv2")}
          >
            <img
              className="humanbody profile"
              src={"https://i.stack.imgur.com/t8vJf.jpg?s=328&g=1"}
            />
          </button>
        </div>

        {/* Hidden div */}
        <div className="row">
          {showdiv1 && <div>Hey man!</div>}
          {showdiv2 && <div>Hey woman!</div>}
        </div>
        {/* Hidden div */}
      </div>
    );
  }
}

export default Home;

【讨论】:

    【解决方案2】:

    除了事件名称onClick 而不是onclick

    另一种方法,只使用一个名为 isShowMan 的状态,然后正确切换它以防您一次只需要显示一个 div。

      toggleShowMan(isShow) {
        this.setState({ isShowMan: isShow });
      }
      ...................................
      <button className="btn col-6 bg-transparent col-12 col-sm-6"
      onClick={() => this.toggleShowHide(true)}>malebody </button>
    
    
      ..................Show/Hide propertly................
        <div className="row">
          {isShowMan && <div>Hey man!</div>}
          {!isShowMan && <div>Hey woman!</div>}
        </div>
    

    class Home extends React.Component {
        constructor() {
        super();
        this.state = { isShowMan: true };
      }
    
      toggleShowMan(isShow) {
        this.setState({ isShowMan: isShow });
      }
    
      render() {
        const { isShowMan } = this.state;
    
        return (
          <div className="container py-5">
            <div className="row">
              <button disabled={isShowMan}
                className="btn col-6 bg-transparent col-12 col-sm-6"
                onClick={() => this.toggleShowMan(true)}
              >malebody </button>
              <button disabled={!isShowMan}
                className="btn col-6 bg-transparent col-12 col-sm-6"
                onClick={() => this.toggleShowMan(false)}
              >
                femalebody
              </button>
            </div>
    
            <div className="row">
              {isShowMan && <div>Hey man!</div>}
              {!isShowMan && <div>Hey woman!</div>}
            </div>
          </div>
        );
      }
    }
    
    ReactDOM.render(<Home />, document.getElementById('root'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    
    <div id="root"></div>

    【讨论】:

    • @Kanchan Bharti 这能回答你的问题吗?如果您需要任何帮助,请告诉我。
    • 是的,onClick 是此代码中的第一个问题。在状态中只使用showman 之后,我的代码现在能够一次显示一个 div,这是我想要的。非常感谢!
    • 太棒了,我根据 UI/UX 猜到了 ^^!
    • 我也在尝试转换代码,以便在不更改整个 div 的情况下只显示相应的单词,即 manwoman。你能帮我解决这个问题吗?
    • 另外,当只在状态下使用 showman 时,它将默认在屏幕上呈现 hey woman。如何解决?
    【解决方案3】:

    更简洁的方法可以是

    const MALE = 'MALE'
    const FEMALE = 'FEMALE'
    export const Home =  () => {
      const [visible, setVisible] = useState(null)
      const isMale = visible === MALE
      const isFemale = visible === FEMALE
    
      (
                <div className="container py-5">
    
                    <div className="row">
                        <button className="btn col-6 bg-transparent col-12 col-sm-6" onClick={() => setVisible(MALE)}  >
                            <img className="humanbody profile" src={malebody} />
                        </button>
                        <button className="btn col-6 bg-transparent col-12 col-sm-6" onClick={() => setVisible(FEMALE)}  >
                            <img className="humanbody profile" src={femalebody} />
                        </button>
                    </div>
    
                    
                    {/* Hidden div */}
                    <div className="row">
                        {
                            isMale && (
                                <div>
                                    Hey man!
                                </div>
                            )
                        }
                        {
                            isFemale && (
                                <div>
                                    Hey woman!
                                </div>
                            )
                        }
                    </div>
                    {/* Hidden div */}
                </div>
            )
      
    
    }
    
    
    

    【讨论】:

    • 很高兴使用functional component。但是一件事onClick 而不是onclick
    • @Phong 谢谢 :) 我从问题中复制了代码,但忘了更正那个错字
    猜你喜欢
    • 2022-01-15
    • 2021-11-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多