Как я могу переключать только одну кнопку одновременно? - PullRequest
0 голосов
/ 20 ноября 2019

Я хотел бы знать, как я мог бы переключать одну кнопку на зеленый цвет по одной за раз. В моем текущем коде, когда я нажимаю на одну (с намерением переключить одну из них на зеленую), она также переключает на три другие кнопки зеленые.

Примечание: white-btn и green-btn - классы CSSчто я определил.

Я сделал слишком много попыток перечислить здесь, чтобы попытаться исправить это. Что я делаю неправильно?

constructor(props) {
    super(props);
    this.state = {
        white: true,
        smallSize: false,
        mediumSize: false,
        largeSize: false,
        xLargeSize: false,
    };
    this.smallClicked = this.smallClicked.bind(this);
    this.mediumClicked = this.mediumClicked.bind(this);
    this.largeClicked = this.largeClicked.bind(this);
    this.xLargeClicked = this.xLargeClicked.bind(this);
}

smallClicked() {
    console.log("clicked small");
    this.setState({smallSize: true, mediumSize: null, largeSize: null, xLargeSize: null, white: !this.state.white});
}

mediumClicked() {
    console.log("clicked medium");
    this.setState({mediumSize: true, smallSize: null, largeSize: null, xLargeSize: null, white: !this.state.white});
}

largeClicked() {
    console.log("clicked large");
    this.setState({largeSize: true, smallSize: null, mediumSize: null, xLargeSize: null, white: !this.state.white});
}

xLargeClicked() {
    console.log("clicked x-large");
    this.setState({xLargeSize: true, smallSize: null, mediumSize: null, largeSize: null, white: !this.state.white});
}

render() {
    let color_switch_size = this.state.white ? "white-btn" : "green-btn";

   return(
     <button className={color_switch_size} onClick={this.smallClicked}>Small</button>
     <button className={color_switch_size} onClick={this.mediumClicked}>Medium</button>
    <button className={color_switch_size} onClick={this.largeClicked}>Large</button>
   <button className={color_switch_size} onClick={this.xLargeClicked}>X-Large</button>
   );
}

Ответы [ 5 ]

0 голосов
/ 20 ноября 2019

Я думаю, что вы можете достичь этого гораздо проще. Будет ли это решение работать на вас?

    constructor(props) {
    super(props);
    this.state = {
      smallSize: false,
      mediumSize: false,
      largeSize: false,
      xLargeSize: false
    };
  }

  onButtonPress = buttonName => {
    console.log('clicked  ' + buttonName);
    let myButtonsState = this.state;
    myButtonsState[buttonName] = !myButtonsState[buttonName];
    this.setState({
      ...myButtonsState
    });
  };

  render() {

    return (
      <View>
        <button
          className={this.state.smallSize ? 'white-btn' : 'green-btn'}
          onClick={() => this.onButtonPress('smallSize')}
        >
          Small
        </button>
        <button
        className={this.state.mediumSize ? 'white-btn' : 'green-btn'}
          onClick={() => this.onButtonPress('mediumSize')}
        >
          Medium
        </button>
        <button
        className={this.state.largeSize ? 'white-btn' : 'green-btn'}
          onClick={() => this.onButtonPress('largeSize')}
        >
          Large
        </button>
        <button
        className={this.state.xLargeSize ? 'white-btn' : 'green-btn'}
          onClick={() => this.onButtonPress('xLargeSize')}
        >
          X-Large
        </button>
      </View>
    );
  }
0 голосов
/ 20 ноября 2019
this.state = {
    small: true,
    medium: true,
    large: true,
    xLarge: true,
}

changeColor = event => {
    this.setState({ [event.target.name]: !this.state[event.target.name] });
}

getButtons = () => {
    const sizes = ['small', 'medium', 'large', 'xlarge'];
    return sizes.map(size => <button className={this.state[size] ? 'white-btn' : 'green-btn'} onClick={this.changeColor} name={size}>{size.toCamelCase()}</button>)
}

render() {
    return (
        <div>
            {this.getButtons()}
        </div>
    )
}
0 голосов
/ 20 ноября 2019

Я бы изменил несколько вещей о том, как это структурировано. Я бы использовал один обработчик изменений и больше не использовал бы переменную white.

Вот мое предложение:

const initialValues = {
  small: false,
  medium: false,
  large: false,
  x_large: false,
};

.....

constructor(props) {
  super(props);
  this.state = {...initialValues};
}

// We'll use a generic handler that receives the button name
handleClick = (button) => (e) => {
  // Update the button to be the opposite of what it was before
  this.setState({[button]: !this.state[button]});

  // OR

  // If you want to restrict it to one white button at a time
  this.setState({
    ...initialValues,
    [button]: !this.state[button]
  });
}

// Separate this into its own function to keep render cleaner
getClassName = (button) => {
  // if button is set to true, use white
  if (this.state[button]) {
    return "white-btn";
  }
  // else use green
  return "green-btn";
}

render() {
  // Now each button has its class name managed independently
  return(
    <>
      <button 
        className={this.getClassName('small')}
        onClick={this.handleClick('small')}
      >
        Small
      </button>
      <button 
        className={this.getClassName('medium')} 
        onClick={this.handleClick('medium')}
      >
        Medium
      </button>
      <button
        className={this.getClassName('large')} 
        onClick={this.handleClick('large')}
      >
        Large
      </button>
      <button 
        className={this.getClassName('x_large')} 
        onClick={this.handleClick('x_large')}
      >
        X-Large
      </button>
    </>
   );
}
0 голосов
/ 20 ноября 2019

Вот моя идея. Я просто добавляю небольшое условие для проверки кнопки перед применением стиля

constructor(props) {
    super(props);
    this.state = {
      white: true,
      smallSize: false,
      mediumSize: false,
      largeSize: false,
      xLargeSize: false
    };
    this.smallClicked = this.smallClicked.bind(this);
    this.mediumClicked = this.mediumClicked.bind(this);
    this.largeClicked = this.largeClicked.bind(this);
    this.xLargeClicked = this.xLargeClicked.bind(this);
  }

  smallClicked() {
    console.log("clicked small");
    this.setState({
      smallSize: true,
      mediumSize: null,
      largeSize: null,
      xLargeSize: null,
      white: !this.state.white
    });
  }

  mediumClicked() {
    console.log("clicked medium");
    this.setState({
      mediumSize: true,
      smallSize: null,
      largeSize: null,
      xLargeSize: null,
      white: !this.state.white
    });
  }

  largeClicked() {
    console.log("clicked large");
    this.setState({
      largeSize: true,
      smallSize: null,
      mediumSize: null,
      xLargeSize: null,
      white: !this.state.white
    });
  }

  xLargeClicked() {
    console.log("clicked x-large");
    this.setState({
      xLargeSize: true,
      smallSize: null,
      mediumSize: null,
      largeSize: null,
      white: !this.state.white
    });
  }

  render() {
    let color_switch_size = this.state.white ? "white-btn" : "green-btn";

    return (
      <React.Fragment>
        <button
          className={this.state.smallSize && color_switch_size}
          onClick={this.smallClicked}
        >
          Small
        </button>
        <button
          className={this.state.mediumSize && color_switch_size}
          onClick={this.mediumClicked}
        >
          Medium
        </button>
        <button
          className={this.state.largeSize && color_switch_size}
          onClick={this.largeClicked}
        >
          Large
        </button>
        <button
          className={this.state.xLargeSize && color_switch_size}
          onClick={this.xLargeClicked}
        >
          X-Large
        </button>
      </React.Fragment>
    );
  }
0 голосов
/ 20 ноября 2019

Способ сделать это - создать класс для обработки нажатого состояния, например, 'greenClas'.

Для каждой кнопки вы добавляете этот класс в случае, если он был нажат или нет.

 return(
     <button className={`buttonClass ${this.state.smallSize} ? 'greenClass' : ''`} onClick={this.smallClicked}>Small</button>

... 

   );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...