【问题标题】:How to make 3 buttons show and hide content when click on them?单击它们时如何使3个按钮显示和隐藏内容?
【发布时间】:2018-11-05 19:39:24
【问题描述】:

我是reactJS 的初学者,我正在尝试制作一个包含 3 个按钮 的 web 应用程序,最初应该可以看到第一个按钮的内容,然后单击我想要的任何其他按钮隐藏以前的内容并显示新内容对应于按下的新按钮。

比如说,我在屏幕上连续有3 按钮A,B and C。内容为 "Button A is pressed""Button B is pressed""Button C is pressed"

现在 A 的最初内容是“按钮 A 被按下”应该显示在按钮下方。

现在,当我按下任何其他按钮时,B 的内容应该可见,而 "Button B is pressed"A's 的内容应该被隐藏。现在这种情况一次又一次地发生,当我再次按下A 时,"Button A is pressed" 应该是可见的,B 的内容应该被隐藏。 C 也是如此。

我搜索的内容但我不明白如何应用它,因为它们只是切换或显示而不是完成我想做的事情?

https://reactjs.org/docs/faq-functions.html

Display a component on clicking a button in React

Show or hide element in React

我实施了什么?

var ASearch = React.createClass({
    getInitialState: function() {
        return { showResultsA: true };
    },
    onClick: function() {
        this.setState({ showResultsA: true, showResultsB: false, showResultsC: false  });
    },
    render: function() {
        return (
            <div>
                <Button type="submit" placeholder="Button A"  onClick={this.onClick} />
                { this.state.showResultsA ? <AResults /> : null }
            </div>
        );
    }
});
var BSearch = React.createClass({
    getInitialState: function() {
        return { showResultsB: false };
    },
    onClick: function() {
        this.setState({  showResultsA: false, showResultsB: true, showResultsC: false });
    },
    render: function() {
        return (
            <div>
                <Button type="submit" placeholder="Button B" onClick={this.onClick} />
                { this.state.showResultsB ? <BResults /> : null }
            </div>
        );
    }
});
var CSearch = React.createClass({
    getInitialState: function() {
        return { showResultsC: false };
    },
    onClick: function() {
        this.setState({  showResultsA: false, showResultsB: false, showResultsC: true });
    },
    render: function() {
        return (
            <div>
                <Button type="submit" placeholder="Button C" onClick={this.onClick} />
                { this.state.showResultsC ? <CResults /> : null }
            </div>
        );
    }
});

var AResults = React.createClass({
    render: function() {
        return (
            <div id="Aresults" className="search-results">
               Button A is Pressed
            </div>
        );
    }
});
var BResults = React.createClass({
    render: function() {
        return (
            <div id="Bresults" className="search-results">
              Button B is Pressed
            </div>
        );
    }
});
var CResults = React.createClass({
    render: function() {
        return (
            <div id="Cresults" className="search-results">
               Button C is pressed
            </div>
        );
    }
});

这些是我在导入 React 的课堂之外创建的。

export default class Program extends React.Component {
render{
return( <ASearch />
        <BSearch />
        <CSearch />);
}

【问题讨论】:

  • 所以按钮不会是动态的,它总是3对吗?
  • 是的,总是 3 个按钮

标签: reactjs jsx


【解决方案1】:
import React from "react";

class Button extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      showButton: false,
      showButton: false
    };
  }

  toggle = () => {
    this.setState({ showButton: true, showButton2: false });
  };

  toggle2 = () => {
    this.setState({ showButton: false, showButton2: true });
  };

      hideAll = () => {
    this.setState({ showButton: false, showButton2: false });
  };

  render() {
    return (
      <div>
        <h1 onClick={this.toggle} >Click me</h1>
        <h1 onClick={this.toggle2}>Click me</h1>
        <h1 onClick={this.hideAll}>Hide all</h1>

        {this.state.showButton ? <h1>Show Me</h1> : null}
        {this.state.showButton2 ? <h1>Show Me2</h1> : null}
      </div>
    );
  }
}

export default Button;

为此,您需要某种 HOC(高阶组件)组件。我重新编辑了我的第一篇文章,我快速测试了它,以确保它可以正常工作。

您只需将您的状态公开以用于某种功能。如果不使用道具/非类组件,您根本无法更改另一个函数的状态。

上面的例子展示了最优雅的方式:

每个状态都可以被点击的函数操作,因为组件本身在this.state中携带了这些状态。

您还可以将其进一步分解,以便每个组件都是非类常量,您可以通过 props 放入值。如果您只是想切换 3 个组件,我建议您按照上面显示的方式进行。

这里可以测试代码:

您好!

【讨论】:

  • 在您的 onSubmit 中,第一种形式是 this.handleButton1,第二种形式是 this.showButton2,您能详细说明一下吗?
  • 就像你在切换功能中所做的那样,我通过类也做了同样的事情,这有什么问题?为什么它不起作用?
  • 我不认为你给出的例子是一样的。您使用反应组件为每个按钮简单地创建了函数。这与复制我的示例相同,但每个按钮一个组件。就像我在 1 篇文章中所说的那样,你不能改变另一个类的状态,至少在不使用 props 和非函数组件的情况下不能改变,这会使这变得过于复杂。如您所见,该示例非常干净。一个组件处理所有按钮的逻辑。
  • 好的,所以我不得不使用道具来改变不同的类状态,谢谢解释。我可以要您的电子邮件 ID 或 whatsapp 号码吗,我刚刚开始学习它并且需要帮助(例如 1)和顺利进行的提示?
【解决方案2】:

您不需要在较低级别的组件中拥有状态。

import React from 'react';

const ResultA = (props) => {
  return (
    <div>
      Hi, This is component A
    </div>
  );
};

const ResultB = () => {
  return (
    <div>
      Hi, This is component B
    </div>
  );
}

const ResultC = () => {
  return (
    <div>
      Hi, This is component C
    </div>
  );
}

class Main extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      displayedComponent: 'A'
    };
  }

  buttonClickHandler (button) {
    this.setState({
      displayedComponent: button
    });
  }

  getDisplayedComponent () {
    let {displayedComponent} = this.state;

    if (displayedComponent === 'B') {
      return (
        <ResultB />
      );
    }

    if (displayedComponent === 'C') {
      return (
        <ResultC />
      );
    }

    return (<ResultA />);
  }


  render () {
    return (
      <div> 
        <input type="button" value="Button A" onClick={this.buttonClickHandler.bind(this, 'A')} />
        <input type="button" value="Button B" onClick={this.buttonClickHandler.bind(this, 'B')} />
        <input type="button" value="Button C" onClick={this.buttonClickHandler.bind(this, 'C')}/>

        {this.getDisplayedComponent()}
      </div>
    );
  }
}

export default Main;

【讨论】:

  • 你能解释一下 AComponent 、 BComponent 和 CComponent 是什么吗?将 onBottonClick 函数作为下层组件的 props 是什么意思?
  • 我已经重构了。检查这是否对您有帮助。
  • 这是一个很好的答案,但我已经勾选了上面的答案,因为它也有效。感谢您的帮助!
猜你喜欢
  • 2018-03-27
  • 2017-08-28
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多