Switch 开关组件

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

安装方法

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

开发指南

开关组件

何时使用

开/关切换器切换单个设置选项的状态。开关控制器中的选项,以及它所在的状态,应该用伴随的内联标签显示清楚。开关选择器具有和单选按钮一样的视觉属性。使用文本“开”和“关”滑动切换已经过时了。使用这里显示的开关选择器代替。

使用注意

  • 对于checkChildren和unCheckedChildren的自定义要考虑文字大小,因为switch的宽度有限,默认一个汉字大小。如果设置成多个字或者英文要注意宽度控制。

API

Switch

参数说明类型默认值
checkedChildren打开时的内容any-
sizeswitch的尺寸可选值:'medium'(正常大小)'small'(缩小版大小)Enum'medium'
unCheckedChildren关闭时的内容any-
onChange开关状态改变是触发此事件签名:Function(checked: Boolean, e: Event) => void参数:checked: {Boolean} 是否为打开状态e: {Event} DOM事件对象Function() => {}
checked开关当前的值(针对受控组件)Boolean-
defaultChecked开关默认值 (针对非受控组件)Booleanfalse
disabled表示开关被禁用Booleanfalse
onClick鼠标点击事件签名:Function(e: Event) => void参数:e: {Event} DOM事件对象Function-
onKeyDown键盘按键事件签名:Function(e: Event) => void参数:e: {Event} DOM事件对象Function-

键盘支持

  • 支持键盘控制,tab选中后按回车进行状态切换。

ARIA and KeyBoard

按键说明
Enter切换选中状态
SPACE切换选中状态

代码示例

简单

最简单的用法,size可设置大小。

Switch 开关组件 - 图1

查看源码在线预览

  1. import { Switch } from '@alifd/next';
  2. function onChange(checked) {
  3. console.log(`switch to ${checked}`);
  4. }
  5. ReactDOM.render(<div>
  6. <Switch checkedChildren="on" onChange={onChange} unCheckedChildren="off" />
  7. <br />
  8. <Switch defaultChecked={false} onChange={onChange} size="small" />
  9. <br />
  10. <Switch className="large-width" checkedChildren="on" onChange={onChange} unCheckedChildren="off please" />
  11. </div>,
  12. mountNode);
  1. .large-width {
  2. width: 100px;
  3. }

受控开关

受控开关, 是指组件的值由上层组件决定, 如果开关定义了 value 属性, 就表示此开关是受控开关.

对于受控开关, 每一次 React 数据渲染时, 都会使用传入的值来更新开关, 开关本身是不能更新自己的状态的.

Switch 开关组件 - 图2

查看源码在线预览

  1. import { Switch } from '@alifd/next';
  2. class App extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. checked: false
  7. };
  8. this.onChange = this.onChange.bind(this);
  9. }
  10. onChange(checked) {
  11. this.setState({checked});
  12. }
  13. render() {
  14. return (<div>
  15. <div className="line">value of switch: {this.state.checked ? 'true' : 'false'}</div>
  16. <div className="line">
  17. <Switch checked={this.state.checked} onChange={this.onChange} />
  18. <Switch checked={this.state.checked} onChange={this.onChange} disabled />
  19. </div>
  20. </div>);
  21. }
  22. }
  23. ReactDOM.render(
  24. <App />,
  25. mountNode
  26. );
  1. .line {
  2. margin-bottom: 10px;
  3. }
  4. .next-switch {
  5. margin-right: 20px;
  6. }

不可用

Switch 失效状态。

Switch 开关组件 - 图3

查看源码在线预览

  1. import { Button, Icon, Switch } from '@alifd/next';
  2. class Test extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. disabled: true
  7. };
  8. }
  9. toggle() {
  10. this.setState(Object.assign({}, this.state, {
  11. disabled: !this.state.disabled
  12. }));
  13. }
  14. render() {
  15. return (<div>
  16. <Switch checkedChildren={<Icon type="select" size="small" />}
  17. unCheckedChildren={<Icon type="close" size="small" />} disabled={this.state.disabled} />
  18. <Switch checkedChildren="on" unCheckedChildren="off" disabled={this.state.disabled} />
  19. <br />
  20. <br />
  21. <Button type="primary" onClick={this.toggle.bind(this)}>Toggle disabled</Button>
  22. </div>);
  23. }
  24. }
  25. ReactDOM.render(<Test />, mountNode);

无障碍

组件内部已支持无障碍,设置aria-label对组件进行描述。

Switch 开关组件 - 图4

查看源码在线预览

  1. import { Switch } from '@alifd/next';
  2. function onChange(checked) {
  3. console.log(`switch to ${checked}`);
  4. }
  5. ReactDOM.render(<div>
  6. <Switch checkedChildren="on" onChange={onChange} unCheckedChildren="off" aria-label="accessible switch"/>
  7. </div>,
  8. mountNode);
  1. .large-width {
  2. width: 100px;
  3. }

相关区块

Switch 开关组件 - 图5

暂无相关区块