【问题标题】:react-bootstrap ButtonGroup as radio buttonsreact-bootstrap ButtonGroup 作为单选按钮
【发布时间】:2015-05-08 17:33:09
【问题描述】:

我正在尝试将一组 react-bootstrap 按钮变成一个单选按钮集。我可以使用带有<input type="radio"> 元素的引导程序轻松完成此操作,但无法弄清楚如何使用 react-bootstrap 执行此操作。以下代码允许用户选择每个按钮,而不仅仅是一个。

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"/>

【问题讨论】:

    标签: react-bootstrap


    【解决方案1】:

    自接受答案以来,框架发生了变化,他们现在复制了 Bootstrap 框架的选项组行为。您现在需要做的就是为组中的每个选项添加一个组名:

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

    【讨论】:

    • 这种情况下如何处理onChange?
    • @Jeremiah,您将在每个Radio 组件上都有一个事件处理程序,并有一个状态变量来跟踪选择。
    • @tatsu Radio 是来自react-bootstrap 包的可导入模块/组件。
    • @MarkoK 这在 2020 年仍然如此吗?我找不到如何导入它...
    • @YossiVainshtein 看起来他们已经更改了 API,请参阅 react-bootstrap.github.io/components/forms/#forms-form-check
    【解决方案2】:

    所以我最终在Button 中嵌套了一个收音机Input,就像您通常在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 计划最终实现RadioGrouphttps://github.com/react-bootstrap/react-bootstrap/issues/342

    【讨论】:

    • 为了清楚起见,您的 组件似乎是自定义组件,在 React-Bootstrap 页面上找不到任何文档
    • @ericgrosse Input 是一个用于所有输入类型的 React-Bootstrap 组件。这个问题已有一年多的历史了,此后 API 发生了重大变化。现在似乎有一个 Radio 组件。我不知道这个问题/答案是否仍然与当前的 API 相关。
    • 我觉得 react-bootstrap 没那么有用的原因之一。
    【解决方案3】:

    此页面上的某些答案无效。也许从那以后情况发生了变化。

    我在 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 是很困难的。最后我使用了另一个控件。

    这是一个名为 react-radio-group 的 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 是我给出样式的地方。

    【讨论】:

      【解决方案4】:

      我刚刚遇到了同样的问题,通过使用组件的状态解决了:

      _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>
          );
      }
      

      【讨论】:

      • 很好的解决方案,已实施。
      【解决方案5】:

      只使用对我有用的标签。确保它们都具有相同的名称="radio-group-value-here"。要在渲染时选择其中一个按钮,请使用checked={bool}。我还使用 disabled={bool} 来显示但不允许某些选择。我决定使用似乎有效的 onClick 。最后,这一切都在一个对话框中,并且需要偏移量来防止单选按钮与左边缘擦肩而过。


      <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>
      

      【讨论】:

        【解决方案6】:

        现在是 2022 年,所以图书馆搬家了。

        这是你如何创建一个是/否收音机:

        <Form>
            <Form.Check 
              type="radio"
              name="group1"
              id={`default-radio`}
              label={`Yes!`}
            />
            <Form.Check 
              type="radio"
              name="group1"
              id={`default-radio`}
              label={`No`}
              />
        </Form>
        

        name="group1" 使按钮切换。如果您不想切换,请给它们不同的名称或不命名。

        希望这对可能像我一样偶然发现这个问题的人有所帮助。

        【讨论】:

          猜你喜欢
          • 2021-09-30
          • 2020-04-22
          • 2020-11-19
          • 2020-11-14
          • 2018-08-31
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 2021-10-08
          相关资源
          最近更新 更多