Запретить активацию нескольких кнопок в ReactJS - PullRequest
2 голосов
/ 17 января 2020

У меня есть две кнопки с ReactJS и SemanticUI. При нажатии на каждый из них цвет фона меняется. Мне бы хотелось, чтобы за один раз активировалась только одна кнопка, а это означает, что при нажатии на красную кнопку зеленая деактивируется и наоборот, возвращая белый фоновый цвет по умолчанию. Прямо сейчас оба могут быть нажаты с изменением цвета одновременно.

Вот мой компонент:

export class BoutonRefus extends Component {
  constructor(props) {
    super(props);
    this.state = {
      button: true
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({
      button: !this.state.button
    });
  }
  render() {
    return (
      <>
        <div
          className={
            this.state.button
              ? "ui button medium refus true"
              : "ui button medium refus false"
          }
          onClick={this.handleClick}
        ></div>
      </>
    );
  }
}

export class BoutonAccepte extends Component {
  constructor(props) {
    super(props);
    this.state = {
      button: true
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({
      button: !this.state.button
    });
  }
  render() {
    return (
      <>
        <div
          className={
            this.state.button
              ? "ui button medium accepte true"
              : "ui button medium accepte false" && 
          }
          onClick={this.handleClick}
        ></div>
      </>
    );
  }
}

Этот компонент называется здесь:

boutonAccepter(t) {
        return (
            <>
            <BoutonAccepte 
            className="ui button medium accepte true"
            onClick={() => {this.voter(true)}}
            text={t('flot.split.vote.accepter')}
                />
            </>
        )
    }

boutonRefuser(t) {
        return (
            <>
            <BoutonRefus 
            className="ui button medium refus true"
            onClick={() => {
                this.justifierRefus()
                this.voter(false)
            }}
            text={t('flot.split.vote.refuser')}
            />
            </>
        )
    }

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Поднимите состояние за пределами компонента Button и обработайте состояние в родительском компоненте, компонент Button может использовать prop для определения цвета кнопки, prop можно передать из родительского компонента, содержащего обе кнопки

Это может помочь - https://codesandbox.io/s/red-green-button-5t7ds

0 голосов
/ 17 января 2020

Для этого вам не нужен компонент класса. Просто используйте useState() hook для вашего локального состояния и создайте функциональный компонент. Кроме того, создание различных компонентов для каждой кнопки кажется излишним. Попробуйте это, просто вставьте ваши имена классов конечно:)

  function Buttons(){
   const [selectedButton, setSelectedButton] = React.useState();

   return (
      <div>
          <button type="button" 
             className={selectedButton === "refuse" ? "active-classname" : "inactive-classname"}
             onClick={() => setSelectedButton("refuse")}>Refus</button>
          <button type="button" 
             className={selectedButton === "refuse" ? "active-classname" : "inactive-classname"}
             onClick={() => setSelectedButton("refuse")}>Accepte</button>
      </div>
   ); 
}
...