Radio 单选框

如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @alifd/next@latest -S

开发指南

单选框

何时使用

单选框允许用户从一个数据集中选择单个选项。如果你觉得用户需要并排看到所有的可选项,使用单选框进行排他操作。此外,考虑使用下拉列表,相对于显示所有的选项占用更少的空间。

API

Radio

参数说明类型默认值
id组件input的idString-
checked设置radio是否选中Boolean-
defaultChecked设置radio是否默认选中Boolean-
label通过属性配置labelReactNode-
onChange状态变化时触发的事件签名:Function(checked: Boolean, e: Event) => void参数:checked: {Boolean} 是否选中e: {Event} Dom 事件对象Functionfunc.noop
onMouseEnter鼠标进入enter事件签名:Function(e: Event) => void参数:e: {Event} Dom 事件对象Functionfunc.noop
onMouseLeave鼠标离开事件签名:Function(e: Event) => void参数:e: {Event} Dom 事件对象Functionfunc.noop
disabledradio是否被禁用Boolean-
valueradio 的valueString/Number/Boolean-
namenameString-

Radio.Group

参数说明类型默认值
namenameString-
sizeshape 属性配套使用,shape设为button时有效可选值:'large'(大)'medium'(中)'small'(小)Enum'medium'
shape可以设置成 button 展示形状可选值:'button'(按钮状)Enum-
valueradio group的选中项的值String/Number/Boolean-
defaultValueradio group的默认值String/Number/Boolean-
component设置标签类型String/Function'div'
onChange选中值改变时的事件签名:Function(value: String/Number, e: Event) => void参数:value: {String/Number} 选中项的值e: {Event} Dom 事件对象Function() => {}
disabled表示radio被禁用Boolean-
dataSource可选项列表, 数据项可为 String 或者 Object, 如 ['apple', 'pear', 'orange']Array<any>[]
children通过子元素方式设置内部radioArray<ReactElement>/ReactElement-
itemDirection子项目的排列方式- hoz: 水平排列 (default)- ver: 垂直排列可选值:'hoz', 'ver'Enum'hoz'

ARIA and KeyBoard

按键说明
Tab获取焦点,如果没有任何选中就是第一个,之后可以空格选中。如果有选中的就聚焦到选中项,然后通过左右键直接选中。

代码示例

基本

使用 Radio 渲染的基本组件。

Radio 单选框 - 图1

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. ReactDOM.render((
  3. <div>
  4. <h4>Without Label</h4>
  5. <Radio defaultChecked />&nbsp;
  6. <Radio checked />&nbsp;
  7. <Radio disabled />&nbsp;
  8. <Radio checked disabled />&nbsp;
  9. <Radio />
  10. <br />
  11. <h4>With Label</h4>
  12. <Radio id="apple">Apple</Radio>&nbsp;
  13. <Radio id="banana" /><label htmlFor="banana" className="next-radio-label">Banana</label>&nbsp;
  14. <Radio id="apple2" label="Apple" className="testClassname" />
  15. </div>
  16. ), mountNode);

受限组件

使用 RadioGroup 渲染的组,通过设置 value 属性可以让组件变成受限组件

Radio 单选框 - 图2

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. const RadioGroup = Radio.Group;
  3. const list = [
  4. {
  5. value: 'appale',
  6. label: 'Appale'
  7. }, {
  8. value: 'pear',
  9. label: 'Pear'
  10. }, {
  11. value: 'orange',
  12. label: 'Orange'
  13. }
  14. ];
  15. class ControlApp extends React.Component {
  16. constructor(props) {
  17. super(props);
  18. this.state = {
  19. value: 'orange'
  20. };
  21. this.onChange = this.onChange.bind(this);
  22. }
  23. onChange(value) {
  24. this.setState({
  25. value: value
  26. });
  27. console.log('onChange', value);
  28. }
  29. onClick(e) {
  30. console.log('onClick', e);
  31. }
  32. render() {
  33. return (
  34. <div>
  35. normal: <RadioGroup dataSource={list} value={this.state.value} onChange={this.onChange} />
  36. <br />
  37. <br />
  38. <br />
  39. disabled: <RadioGroup disabled dataSource={list} value={this.state.value} onChange={this.onChange} />
  40. </div>
  41. );
  42. }
  43. }
  44. ReactDOM.render(<ControlApp />, mountNode);

分组

使用 <Radio.Group> 渲染 <Radio> 分组。

Radio 单选框 - 图3

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. const Shape = {
  3. NORMAL: 'normal',
  4. BUTTON: 'button'
  5. };
  6. const ItemDirection = {
  7. HORIZON: 'hoz',
  8. VERTICAL: 'ver'
  9. };
  10. class RadioGroup extends React.Component {
  11. state = {
  12. shape: Shape.NORMAL,
  13. itemDirection: ItemDirection.HORIZON
  14. }
  15. onShapeChange = (shape) => {
  16. this.setState({ shape });
  17. }
  18. onItemDirectionChange = (itemDirection) => {
  19. this.setState({ itemDirection });
  20. }
  21. render() {
  22. return (
  23. <div>
  24. <h5>Choose a shape</h5>
  25. <p>
  26. <Radio.Group
  27. shape="button"
  28. value={this.state.shape}
  29. onChange={this.onShapeChange}
  30. >
  31. <Radio value={Shape.NORMAL}>Normal</Radio>
  32. <Radio value={Shape.BUTTON}>Button</Radio>
  33. </Radio.Group>
  34. </p>
  35. <h5>Choose an align-type of the item</h5>
  36. <p>
  37. <Radio.Group
  38. shape="button"
  39. value={this.state.itemDirection}
  40. onChange={this.onItemDirectionChange}
  41. >
  42. <Radio value={ItemDirection.HORIZON}>Horizon</Radio>
  43. <Radio
  44. value={ItemDirection.VERTICAL}
  45. disabled={this.state.shape === Shape.BUTTON}
  46. >Vertical</Radio>
  47. </Radio.Group>
  48. </p>
  49. <div className="rendered-container">
  50. <h3>Rendered Result</h3>
  51. <Radio.Group
  52. shape={this.state.shape}
  53. itemDirection={this.state.itemDirection}
  54. >
  55. <Radio value="react">React</Radio>
  56. <Radio value="vue">Vue</Radio>
  57. <Radio value="angular">Angular</Radio>
  58. </Radio.Group>
  59. </div>
  60. </div>
  61. );
  62. }
  63. }
  64. ReactDOM.render(<RadioGroup />, mountNode);
  1. .rendered-container {
  2. margin: 32px 0 0;
  3. padding: 0 24px 24px;
  4. border: 3px dashed #aaa;
  5. border-radius: 11px;
  6. }

非受限组件

使用 RadioGroup 渲染的组,通过设置 defaultValue 属性可以让组件变成非受限组件

Radio 单选框 - 图4

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. const RadioGroup = Radio.Group;
  3. const list = [
  4. {
  5. value: 'apple',
  6. label: 'Apple',
  7. disabled: false
  8. }, {
  9. value: 'pear',
  10. label: 'Pear',
  11. disabled: true
  12. }, {
  13. value: 'orange',
  14. label: 'Orange'
  15. }
  16. ];
  17. const UnControlApp = () => {
  18. return (
  19. <div>
  20. <RadioGroup dataSource={list} defaultValue={'apple'} />
  21. </div>
  22. );
  23. };
  24. ReactDOM.render(<UnControlApp />, mountNode);

嵌套组件

使用 RadioGroup,通过直接嵌套 Radio 组件来渲染的组。

Radio 单选框 - 图5

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. const RadioGroup = Radio.Group;
  3. class NestApp extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. value: 'orange'
  8. };
  9. this.onChange = this.onChange.bind(this);
  10. }
  11. onChange(value) {
  12. this.setState({
  13. value: value
  14. });
  15. }
  16. render() {
  17. return (
  18. <div>
  19. <label id="groupId">Choose fruit</label><br/>
  20. <RadioGroup value={this.state.value} onChange={this.onChange} aria-labelledby="groupId">
  21. <Radio id="apple" value="apple">Apple</Radio>
  22. <Radio id="watermelon" value="watermelon">Watermelon</Radio>
  23. <Radio id="orange" value="orange">Orange</Radio>
  24. </RadioGroup>
  25. </div>
  26. );
  27. }
  28. }
  29. ReactDOM.render(<NestApp />, mountNode);

按钮样式组件

使用 RadioGroup 渲染的组,通过设置 shape="button" 可以让组件以按钮形式展示,同时可以通过 size 来控制组件大小。

Radio 单选框 - 图6

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. const RadioGroup = Radio.Group;
  3. const list = [
  4. {
  5. value: 'apple',
  6. label: 'Apple',
  7. disabled: false
  8. }, {
  9. value: 'pear',
  10. label: 'Pear'
  11. }, {
  12. value: 'orange',
  13. label: 'Orange',
  14. disabled: true
  15. }
  16. ];
  17. class ControlApp extends React.Component {
  18. constructor(props) {
  19. super(props);
  20. this.state = {
  21. value1: 'apple',
  22. value2: 'apple',
  23. value3: ''
  24. };
  25. this.onNestChange = this.onNestChange.bind(this);
  26. this.onSmallChange = this.onSmallChange.bind(this);
  27. this.onMediumChange = this.onMediumChange.bind(this);
  28. }
  29. onSmallChange(value) {
  30. this.setState({
  31. value1: value
  32. });
  33. }
  34. onMediumChange(value) {
  35. this.setState({
  36. value2: value
  37. });
  38. }
  39. onNestChange(value) {
  40. this.setState({
  41. value3: value
  42. });
  43. }
  44. render() {
  45. return (
  46. <div>
  47. <h4>Small size</h4>
  48. <RadioGroup dataSource={list} shape="button" size="small" value={this.state.value1} onChange={this.onSmallChange} />
  49. <br/>
  50. <br/>
  51. <h4>Medium size (default)</h4>
  52. <RadioGroup dataSource={list} shape="button" size="medium" value={this.state.value2} onChange={this.onMediumChange} />
  53. <br/>
  54. <br/>
  55. <h4>Large size</h4>
  56. <RadioGroup shape="button" size="large" value={this.state.value3} onChange={this.onNestChange}>
  57. <Radio id="banana" value="banana">Banana</Radio>
  58. <Radio id="watermelon" value="watermelon">Watermelon</Radio>
  59. <Radio id="peach" value="peach">Peach</Radio>
  60. </RadioGroup>
  61. <br/>
  62. <br/>
  63. <h4>Disabled and Selected-Disabled status</h4>
  64. <RadioGroup shape="button" value="banana" onChange={this.onNestChange}>
  65. <Radio id="peach" disabled value="peach">Peach</Radio>
  66. <Radio id="banana" disabled value="banana">Banana</Radio>
  67. </RadioGroup>
  68. </div>
  69. );
  70. }
  71. }
  72. ReactDOM.render(<ControlApp />, mountNode);

使用Grid 布局

使用 Grid 布局 RadioGroup 中的选项。

Radio 单选框 - 图7

查看源码在线预览

  1. import { Radio, Grid } from '@alifd/next';
  2. const { Row, Col } = Grid;
  3. const RadioGroup = Radio.Group;
  4. class ControlApp extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.state = {
  8. value: 'orange',
  9. other: 0
  10. };
  11. this.onChange = this.onChange.bind(this);
  12. }
  13. onChange(value) {
  14. this.setState({
  15. value: value
  16. });
  17. console.log('onChange', value);
  18. }
  19. onClick(e) {
  20. console.log('onClick', e);
  21. }
  22. render() {
  23. return (
  24. <div >
  25. <h4>Grid Layout</h4>
  26. <RadioGroup onChange={this.onChange} style={{ width: '1000px'}} >
  27. <Row>
  28. <Col span="8">
  29. <Radio value="apple1" onClick={this.onClick} >Apple</Radio>
  30. </Col>
  31. <Col span="8">
  32. <Radio value="pear1" onClick={this.onClick} >Pear</Radio>
  33. </Col>
  34. <Col span="8">
  35. <Radio value="banana1" onClick={this.onClick} >Banana</Radio>
  36. </Col>
  37. </Row>
  38. <Row>
  39. <Col span="8">
  40. <Radio value="peach" onClick={this.onClick} >Peach</Radio>
  41. </Col>
  42. <Col span="8">
  43. <Radio value="watermelon" onClick={this.onClick} >Watermelon</Radio>
  44. </Col>
  45. <Col span="8">
  46. <Radio value="strawberry" onClick={this.onClick} >Strawberry</Radio>
  47. </Col>
  48. </Row>
  49. <Row>Just simple context</Row>
  50. </RadioGroup>
  51. </div>
  52. );
  53. }
  54. }
  55. ReactDOM.render(<ControlApp />, mountNode);

无障碍

请参考ARIA and KeyBoard

Radio 单选框 - 图8

查看源码在线预览

  1. import { Radio } from '@alifd/next';
  2. const RadioGroup = Radio.Group;
  3. ReactDOM.render(
  4. <div>
  5. <span id="radio-a11y">Programming language :</span>
  6. <RadioGroup aria-labelledby="radio-a11y">
  7. <Radio id="python" value="python">python</Radio>
  8. <Radio id="java" value="java">java</Radio>
  9. <Radio id="c" value="c">c</Radio>
  10. </RadioGroup>
  11. </div>
  12. , mountNode);

相关区块

Radio 单选框 - 图9

暂无相关区块