Slider滑动输入条
滑动型输入器,展示当前值和可选范围。
何时使用#
当用户需要在数值区间/自定义区间内进行选择时,可为连续或离散值。
代码演示
Disabled:
import { Slider, Switch } from 'antd';
class Demo extends React.Component {
state = {
disabled: false,
};
handleDisabledChange = (disabled) => {
this.setState({ disabled });
}
render() {
const { disabled } = this.state;
return (
<div>
<Slider defaultValue={30} disabled={disabled} />
<Slider range defaultValue={[20, 50]} disabled={disabled} />
Disabled: <Switch size="small" checked={disabled} onChange={this.handleDisabledChange} />
</div>
);
}
}
ReactDOM.render(<Demo />, mountNode);
import { Slider, Icon } from 'antd';
class IconSlider extends React.Component {
constructor(props) {
super(props);
const { max, min } = props;
const mid = ((max - min) / 2).toFixed(5);
this.state = {
preIconClass: this.props.value >= mid ? '' : 'anticon-highlight',
nextIconClass: this.props.value >= mid ? 'anticon-highlight' : '',
mid,
sliderValue: this.props.value,
};
}
handleChange = (v) => {
this.setState({
preIconClass: v >= this.state.mid ? '' : 'anticon-highlight',
nextIconClass: v >= this.state.mid ? 'anticon-highlight' : '',
sliderValue: v,
});
}
render() {
return (
<div className="icon-wrapper">
<Icon className={this.state.preIconClass} type={this.props.icon[0]} />
<Slider {...this.props} onChange={this.handleChange} value={this.state.sliderValue} />
<Icon className={this.state.nextIconClass} type={this.props.icon[1]} />
</div>
);
}
}
ReactDOM.render(<IconSlider min={0} max={20} value={0} icon={['frown-o', 'smile-o']} />, mountNode);
.icon-wrapper {
position: relative;
padding: 0px 30px;
}
.icon-wrapper .anticon {
position: absolute;
top: -3px;
width: 16px;
height: 16px;
line-height: 1;
font-size: 16px;
color: @disabled-color;
}
.icon-wrapper .anticon:first-child {
left: 0;
}
.icon-wrapper .anticon:last-child {
right: 0;
}
.anticon.anticon-highlight {
color: #666;
}
import { Slider } from 'antd';
function onChange(value) {
console.log('onChange: ', value);
}
function onAfterChange(value) {
console.log('onAfterChange: ', value);
}
ReactDOM.render(
<div>
<Slider defaultValue={30} onChange={onChange} onAfterChange={onAfterChange} />
<Slider range step={10} defaultValue={[20, 50]} onChange={onChange} onAfterChange={onAfterChange} />
</div>,
mountNode
);
import { Slider } from 'antd';
const style = {
float: 'left',
height: 300,
marginLeft: 70,
};
const marks = {
0: '0°C',
26: '26°C',
37: '37°C',
100: {
style: {
color: '#f50',
},
label: <strong>100°C</strong>,
},
};
ReactDOM.render(
<div style={{ height: 300 }}>
<div style={style}>
<Slider vertical defaultValue={30} />
</div>
<div style={style}>
<Slider vertical range step={10} defaultValue={[20, 50]} />
</div>
<div style={style}>
<Slider vertical range marks={marks} defaultValue={[26, 37]} />
</div>
</div>,
mountNode
);
import { Slider, InputNumber, Row, Col } from 'antd';
class IntegerStep extends React.Component {
state = {
inputValue: 1,
}
onChange = (value) => {
this.setState({
inputValue: value,
});
}
render() {
return (
<Row>
<Col span={12}>
<Slider min={1} max={20} onChange={this.onChange} value={this.state.inputValue} />
</Col>
<Col span={4}>
<InputNumber
min={1}
max={20}
style={{ marginLeft: 16 }}
value={this.state.inputValue}
onChange={this.onChange}
/>
</Col>
</Row>
);
}
}
class DecimalStep extends React.Component {
state = {
inputValue: 0,
}
onChange = (value) => {
this.setState({
inputValue: value,
});
}
render() {
return (
<Row>
<Col span={12}>
<Slider min={0} max={1} onChange={this.onChange} value={this.state.inputValue} step={0.01} />
</Col>
<Col span={4}>
<InputNumber
min={0}
max={1}
style={{ marginLeft: 16 }}
step={0.01}
value={this.state.inputValue}
onChange={this.onChange}
/>
</Col>
</Row>
);
}
}
ReactDOM.render(
<div>
<IntegerStep />
<DecimalStep />
</div>
, mountNode);
import { Slider } from 'antd';
function formatter(value) {
return `${value}%`;
}
ReactDOM.render(
<div>
<Slider tipFormatter={formatter} />
<Slider tipFormatter={null} />
</div>,
mountNode
);
included=true
included=false
marks & step
step=null
import { Slider } from 'antd';
const marks = {
0: '0°C',
26: '26°C',
37: '37°C',
100: {
style: {
color: '#f50',
},
label: <strong>100°C</strong>,
},
};
ReactDOM.render(
<div>
<h4>included=true</h4>
<Slider marks={marks} defaultValue={37} />
<Slider range marks={marks} defaultValue={[26, 37]} />
<h4>included=false</h4>
<Slider marks={marks} included={false} defaultValue={37} />
<h4>marks & step</h4>
<Slider marks={marks} step={10} defaultValue={37} />
<h4>step=null</h4>
<Slider marks={marks} step={null} defaultValue={37} />
</div>
, mountNode);
API#
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
range | 双滑块模式 | boolean | false |
min | 最小值 | number | 0 |
max | 最大值 | number | 100 |
step | 步长,取值必须大于 0,并且可被 (max - min) 整除。当 marks 不为空对象时,可以设置 step 为 null ,此时 Slider 的可选值仅有 marks 标出来的部分。 | number|null | 1 |
marks | 刻度标记,key 的类型必须为 number 且取值在闭区间 min, max 内,每个标签可以单独设置样式 | object | { number: string|ReactNode } or { number: { style: object, label: string|ReactNode } } |
dots | 是否只能拖拽到刻度上 | boolean | false |
value | 设置当前取值。当 range 为 false 时,使用 number ,否则用 [number, number] | number|number[] | |
defaultValue | 设置初始取值。当 range 为 false 时,使用 number ,否则用 [number, number] | number|number[] | 0 or 0, 0 |
included | marks 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列 | boolean | true |
disabled | 值为 true 时,滑块为禁用状态 | boolean | false |
vertical | 值为 true 时,Slider 为垂直方向 | Boolean | false |
onChange | 当 Slider 的值发生改变时,会触发 onChange 事件,并把改变后的值作为参数传入。 | Function(value) | NOOP |
onAfterChange | 与 onmouseup 触发时机一致,把当前值作为参数传入。 | Function(value) | NOOP |
tipFormatter | Slider 会把当前值传给 tipFormatter ,并在 Tooltip 中显示 tipFormatter 的返回值,若为 null,则隐藏 Tooltip。 | Function|null | IDENTITY |