Реакция-бутстрап ButtonGroup как переключатели

Я пытаюсь создать группу кнопок "реакция-бутстрап" в набор радиокнопок. Я легко могу сделать это с помощью бутстрапа с элементами <input type="radio">, но не могу понять, как это сделать с помощью реакции-бутстрапа. Следующий код позволяет пользователю выбирать каждую кнопку, а не только одну.

JS:

const operationButtons = (    
  <ButtonGroup>
    <Button active>Radio 1</Button>
    <Button>Radio 2</Button>
  </ButtonGroup>
);

React.render(operationButtons, document.getElementById('operationButtonsDiv'));

HTML:

<div name="operationButtonsDiv" id="operationButtonsDiv" data-toggle="buttons"/>

Ответ 1

С момента принятия ответа изменилась структура, и теперь они реплицировали поведение группы параметров Bootstrap. Все, что вам нужно сделать, это добавить имя группы для каждой опции в группе:

<Radio name="groupOptions">Option 1</Radio>
<Radio name="groupOptions">Option 2</Radio>
<Radio name="groupOptions">Option 3</Radio>

Ответ 2

Итак, я вложил радио Input в Button, как обычно, в Bootstrap.

render() {
  return (
    <ButtonGroup>
      <Button active>Radio 1
        <Input ref="input1" type="radio" name="radioButtonSet" value='input1' standalone defaultChecked/>
      </Button>
      <Button>Radio 2
        <Input ref="input2" type="radio" name="radioButtonSet" value='input2' standalone/>
      </Button>
    </ButtonGroup>
  )
}

Я также переопределил по умолчанию .radio css, чтобы исправить его отображение.

.radio {
  margin-top: 0;
  margin-bottom: 0;
}

React-bootstrap планирует реализовать RadioGroup в конце концов: https://github.com/react-bootstrap/react-bootstrap/issues/342

Ответ 3

Я только что столкнулся с той же проблемой и решил ее, используя состояние компонента:

_onOptionChange(option) {
    this.setState({
        option: option
    });
}

render() {
    render (
        <ButtonGroup>
            <Button onClick={this._onOptionChange.bind(this, 'optionA')} active={this.state.option === 'optionA'}>Option A</Button>
            <Button onClick={this._onOptionChange.bind(this, 'optionB')} active={this.state.option === 'optionB'}>Option B</Button>
        </ButtonGroup>
    );
}

Ответ 4

Некоторые ответы на этой странице не работают. Возможно, с тех пор все изменилось.

Я собрал это с помощью сайта React Bootstrap.

<Col>
    <InputGroup>
        <InputGroup.Prepend>
            <InputGroup.Radio  name="group1"/>
            <InputGroup.Text >London</InputGroup.Text>
        </InputGroup.Prepend>
        <FormControl/>
    </InputGroup> 
    <InputGroup>
        <InputGroup.Prepend>
            <InputGroup.Radio  name="group1"/>
            <InputGroup.Text >New York</InputGroup.Text>
        </InputGroup.Prepend>
        <FormControl/>
    </InputGroup> 
    <InputGroup>
        <InputGroup.Prepend>
            <InputGroup.Radio  name="group1"/>
            <InputGroup.Text >Colombo</InputGroup.Text>
        </InputGroup.Prepend>
        <FormControl/>
    </InputGroup> 

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

Добавление элемента управления формы делает края ввода хорошо округленными, но также делает метку переключателя редактируемой. Если это проблема, вы можете пропустить контроль формы.

Если вы хотите изменить внешний вид, попробуйте это.

<Form.Check
    type="radio"
    label="London"
    name="group2"
    id="radio1"
/> 
<Form.Check
    type="radio"
    label="New York"
    name="group2"
    id="radio2"
/> 
<Form.Check
    type="radio"
    label="Colombo"
    name="group2"
    id="radio3"
/> 

Однако с этим получить значение и обработать onChange было сложно. В конце концов я использовал другой элемент управления.

Это пакет npm, называемый реагирующая радиогруппа. Вы должны установить его, запустив эту строку в команде.

npm install react-radio-group

Затем импортируйте его в свой файл.

import { Radio, RadioGroup} from 'react-radio-group'

Здесь код для группы кнопок.

<RadioGroup name="fruits" onChange={(e) => handleOnChange(e)}>
   <div className="radio-button-background">
       <Radio value="Apple" className="radio-button" />Apple
   </div>
   <div className="radio-button-background">
       <Radio value="Orange" className="radio-button" />Orange
   </div>
   <div className="radio-button-background">
       <Radio value="Banana" className="radio-button" />Banana
   </div>
</RadioGroup>

classNames - это место, где я дал стили.

Ответ 5

Просто используя теги, сработанные для меня. Убедитесь, что все они имеют одинаковое значение name= "radio-group-value-here". Чтобы выбрать одну из кнопок, выбранных для рендеринга, используйте checked = {bool}. Я также использовал disabled = {bool}, чтобы показать, но запретить некоторые варианты. Я решил использовать onClick, который, похоже, работает. Наконец, все это в диалоговом окне, и смещение необходимо для того, чтобы радиокнопки не smogли против левого края.


<Row>
    <Col sm={11} smOffset={1} >
        <Radio name="changeset-chooser"
               checked={this.state.checked === 'current'}
               disabled={this.props.changeset.status === "pending"}
               onClick={ (e) => { /* event handler */ } } >
            Current Data
        </Radio>
    </Col>
</Row>
<Row>
    <Col sm={3} smOffset={1} >
        <Radio name="changeset-chooser"
               onClick={ (e) => { /* event handler */ } } >
            History
        </Radio>
    </Col>
    <Col sm={7}  >
          <NotPartOfSample />
    </Col>
</Row>