Radio 单选框
如果项目中使用的是 0.x 版本的基础组件(@icedesign/base, @ali/ice, @alife/next),请在左侧导航顶部切换组件版本。
安装方法
- 在命令行中执行以下命令
npm install @alifd/next@latest -S
开发指南
单选框
何时使用
单选框允许用户从一个数据集中选择单个选项。如果你觉得用户需要并排看到所有的可选项,使用单选框进行排他操作。此外,考虑使用下拉列表,相对于显示所有的选项占用更少的空间。
API
Radio
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
id | 组件input的id | String | - |
checked | 设置radio是否选中 | Boolean | - |
defaultChecked | 设置radio是否默认选中 | Boolean | - |
label | 通过属性配置label | ReactNode | - |
onChange | 状态变化时触发的事件签名:Function(checked: Boolean, e: Event) => void参数:checked: {Boolean} 是否选中e: {Event} Dom 事件对象 | Function | func.noop |
onMouseEnter | 鼠标进入enter事件签名:Function(e: Event) => void参数:e: {Event} Dom 事件对象 | Function | func.noop |
onMouseLeave | 鼠标离开事件签名:Function(e: Event) => void参数:e: {Event} Dom 事件对象 | Function | func.noop |
disabled | radio是否被禁用 | Boolean | - |
value | radio 的value | String/Number/Boolean | - |
name | name | String | - |
Radio.Group
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
name | name | String | - |
size | 与 shape 属性配套使用,shape设为button时有效可选值:'large'(大)'medium'(中)'small'(小) | Enum | 'medium' |
shape | 可以设置成 button 展示形状可选值:'button'(按钮状) | Enum | - |
value | radio group的选中项的值 | String/Number/Boolean | - |
defaultValue | radio 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 | 通过子元素方式设置内部radio | Array<ReactElement>/ReactElement | - |
itemDirection | 子项目的排列方式- hoz: 水平排列 (default)- ver: 垂直排列可选值:'hoz', 'ver' | Enum | 'hoz' |
ARIA and KeyBoard
按键 | 说明 |
---|---|
Tab | 获取焦点,如果没有任何选中就是第一个,之后可以空格选中。如果有选中的就聚焦到选中项,然后通过左右键直接选中。 |
代码示例
使用 Radio
渲染的基本组件。
查看源码在线预览
import { Radio } from '@alifd/next';
ReactDOM.render((
<div>
<h4>Without Label</h4>
<Radio defaultChecked />
<Radio checked />
<Radio disabled />
<Radio checked disabled />
<Radio />
<br />
<h4>With Label</h4>
<Radio id="apple">Apple</Radio>
<Radio id="banana" /><label htmlFor="banana" className="next-radio-label">Banana</label>
<Radio id="apple2" label="Apple" className="testClassname" />
</div>
), mountNode);
使用 RadioGroup
渲染的组,通过设置 value
属性可以让组件变成受限组件。
查看源码在线预览
import { Radio } from '@alifd/next';
const RadioGroup = Radio.Group;
const list = [
{
value: 'appale',
label: 'Appale'
}, {
value: 'pear',
label: 'Pear'
}, {
value: 'orange',
label: 'Orange'
}
];
class ControlApp extends React.Component {
constructor(props) {
super(props);
this.state = {
value: 'orange'
};
this.onChange = this.onChange.bind(this);
}
onChange(value) {
this.setState({
value: value
});
console.log('onChange', value);
}
onClick(e) {
console.log('onClick', e);
}
render() {
return (
<div>
normal: <RadioGroup dataSource={list} value={this.state.value} onChange={this.onChange} />
<br />
<br />
<br />
disabled: <RadioGroup disabled dataSource={list} value={this.state.value} onChange={this.onChange} />
</div>
);
}
}
ReactDOM.render(<ControlApp />, mountNode);
使用 <Radio.Group>
渲染 <Radio>
分组。
查看源码在线预览
import { Radio } from '@alifd/next';
const Shape = {
NORMAL: 'normal',
BUTTON: 'button'
};
const ItemDirection = {
HORIZON: 'hoz',
VERTICAL: 'ver'
};
class RadioGroup extends React.Component {
state = {
shape: Shape.NORMAL,
itemDirection: ItemDirection.HORIZON
}
onShapeChange = (shape) => {
this.setState({ shape });
}
onItemDirectionChange = (itemDirection) => {
this.setState({ itemDirection });
}
render() {
return (
<div>
<h5>Choose a shape</h5>
<p>
<Radio.Group
shape="button"
value={this.state.shape}
onChange={this.onShapeChange}
>
<Radio value={Shape.NORMAL}>Normal</Radio>
<Radio value={Shape.BUTTON}>Button</Radio>
</Radio.Group>
</p>
<h5>Choose an align-type of the item</h5>
<p>
<Radio.Group
shape="button"
value={this.state.itemDirection}
onChange={this.onItemDirectionChange}
>
<Radio value={ItemDirection.HORIZON}>Horizon</Radio>
<Radio
value={ItemDirection.VERTICAL}
disabled={this.state.shape === Shape.BUTTON}
>Vertical</Radio>
</Radio.Group>
</p>
<div className="rendered-container">
<h3>Rendered Result</h3>
<Radio.Group
shape={this.state.shape}
itemDirection={this.state.itemDirection}
>
<Radio value="react">React</Radio>
<Radio value="vue">Vue</Radio>
<Radio value="angular">Angular</Radio>
</Radio.Group>
</div>
</div>
);
}
}
ReactDOM.render(<RadioGroup />, mountNode);
.rendered-container {
margin: 32px 0 0;
padding: 0 24px 24px;
border: 3px dashed #aaa;
border-radius: 11px;
}
使用 RadioGroup
渲染的组,通过设置 defaultValue
属性可以让组件变成非受限组件。
查看源码在线预览
import { Radio } from '@alifd/next';
const RadioGroup = Radio.Group;
const list = [
{
value: 'apple',
label: 'Apple',
disabled: false
}, {
value: 'pear',
label: 'Pear',
disabled: true
}, {
value: 'orange',
label: 'Orange'
}
];
const UnControlApp = () => {
return (
<div>
<RadioGroup dataSource={list} defaultValue={'apple'} />
</div>
);
};
ReactDOM.render(<UnControlApp />, mountNode);
使用 RadioGroup
,通过直接嵌套 Radio
组件来渲染的组。
查看源码在线预览
import { Radio } from '@alifd/next';
const RadioGroup = Radio.Group;
class NestApp extends React.Component {
constructor(props) {
super(props);
this.state = {
value: 'orange'
};
this.onChange = this.onChange.bind(this);
}
onChange(value) {
this.setState({
value: value
});
}
render() {
return (
<div>
<label id="groupId">Choose fruit</label><br/>
<RadioGroup value={this.state.value} onChange={this.onChange} aria-labelledby="groupId">
<Radio id="apple" value="apple">Apple</Radio>
<Radio id="watermelon" value="watermelon">Watermelon</Radio>
<Radio id="orange" value="orange">Orange</Radio>
</RadioGroup>
</div>
);
}
}
ReactDOM.render(<NestApp />, mountNode);
使用 RadioGroup
渲染的组,通过设置 shape="button"
可以让组件以按钮形式展示,同时可以通过 size
来控制组件大小。
查看源码在线预览
import { Radio } from '@alifd/next';
const RadioGroup = Radio.Group;
const list = [
{
value: 'apple',
label: 'Apple',
disabled: false
}, {
value: 'pear',
label: 'Pear'
}, {
value: 'orange',
label: 'Orange',
disabled: true
}
];
class ControlApp extends React.Component {
constructor(props) {
super(props);
this.state = {
value1: 'apple',
value2: 'apple',
value3: ''
};
this.onNestChange = this.onNestChange.bind(this);
this.onSmallChange = this.onSmallChange.bind(this);
this.onMediumChange = this.onMediumChange.bind(this);
}
onSmallChange(value) {
this.setState({
value1: value
});
}
onMediumChange(value) {
this.setState({
value2: value
});
}
onNestChange(value) {
this.setState({
value3: value
});
}
render() {
return (
<div>
<h4>Small size</h4>
<RadioGroup dataSource={list} shape="button" size="small" value={this.state.value1} onChange={this.onSmallChange} />
<br/>
<br/>
<h4>Medium size (default)</h4>
<RadioGroup dataSource={list} shape="button" size="medium" value={this.state.value2} onChange={this.onMediumChange} />
<br/>
<br/>
<h4>Large size</h4>
<RadioGroup shape="button" size="large" value={this.state.value3} onChange={this.onNestChange}>
<Radio id="banana" value="banana">Banana</Radio>
<Radio id="watermelon" value="watermelon">Watermelon</Radio>
<Radio id="peach" value="peach">Peach</Radio>
</RadioGroup>
<br/>
<br/>
<h4>Disabled and Selected-Disabled status</h4>
<RadioGroup shape="button" value="banana" onChange={this.onNestChange}>
<Radio id="peach" disabled value="peach">Peach</Radio>
<Radio id="banana" disabled value="banana">Banana</Radio>
</RadioGroup>
</div>
);
}
}
ReactDOM.render(<ControlApp />, mountNode);
使用 Grid
布局 RadioGroup
中的选项。
查看源码在线预览
import { Radio, Grid } from '@alifd/next';
const { Row, Col } = Grid;
const RadioGroup = Radio.Group;
class ControlApp extends React.Component {
constructor(props) {
super(props);
this.state = {
value: 'orange',
other: 0
};
this.onChange = this.onChange.bind(this);
}
onChange(value) {
this.setState({
value: value
});
console.log('onChange', value);
}
onClick(e) {
console.log('onClick', e);
}
render() {
return (
<div >
<h4>Grid Layout</h4>
<RadioGroup onChange={this.onChange} style={{ width: '1000px'}} >
<Row>
<Col span="8">
<Radio value="apple1" onClick={this.onClick} >Apple</Radio>
</Col>
<Col span="8">
<Radio value="pear1" onClick={this.onClick} >Pear</Radio>
</Col>
<Col span="8">
<Radio value="banana1" onClick={this.onClick} >Banana</Radio>
</Col>
</Row>
<Row>
<Col span="8">
<Radio value="peach" onClick={this.onClick} >Peach</Radio>
</Col>
<Col span="8">
<Radio value="watermelon" onClick={this.onClick} >Watermelon</Radio>
</Col>
<Col span="8">
<Radio value="strawberry" onClick={this.onClick} >Strawberry</Radio>
</Col>
</Row>
<Row>Just simple context</Row>
</RadioGroup>
</div>
);
}
}
ReactDOM.render(<ControlApp />, mountNode);
请参考ARIA and KeyBoard
。
查看源码在线预览
import { Radio } from '@alifd/next';
const RadioGroup = Radio.Group;
ReactDOM.render(
<div>
<span id="radio-a11y">Programming language :</span>
<RadioGroup aria-labelledby="radio-a11y">
<Radio id="python" value="python">python</Radio>
<Radio id="java" value="java">java</Radio>
<Radio id="c" value="c">c</Radio>
</RadioGroup>
</div>
, mountNode);