Range 区间选择 3.0.0
用户可通过滑动选定一个区间,组件返回这个区间值;支持单、双滑块模式,有step和无step模式等。
引用方式
import { Range } from '$yo-component';
// 如果你的项目中未使用最新的 ykit-config-yo 插件,可能无法使用上面这个语法糖
// 你仍然可以通过下面这种方式来引用
import Range from 'yo3/component/range';
双滑块用法
由于组件是受控驱动的,所以你必须自己来控制更新,组件会将应该更新到的状态通过回调参数 value 传递出来,你需要通过传递 state 数据给 value 属性(如 value={this.state.value}),并在 onChange 函数中对 state(如 state.value)进行更新,即调用 this.setState({ value: value })。
import Range from 'component';
class Demo extends Component {
constructor(props) {
super(props);
this.state = {
value: [200, 300]
};
}
render() {
return (
<Range
max={500}
min={100}
step={100}
value={this.state.value}
onChange={value => this.setState({ value })}
/>
)
}
}
单滑块用法
// this.state = { value: 200 };
<Range
max={500}
min={100}
step={100}
isSingle={true}
value={this.state.value}
onChange={value => this.setState({ value })}
/>
扩展用法
自定义标签,支持 JSX:
scaleFormat(value, index) {
const text = ['¥0', '¥150', '¥300', '¥500', '¥800', '不限'];
return (
<div key={`tick${index}`}>
<span>
{text[index]}
</span>
<i className="yo-ico">{'\uf083'}</i>
</div>
);
}
<Range
ref="range"
max={750}
min={0}
step={150}
value={this.state.value}
scaleFormat={this.scaleFormat}
onChange={value => { this.setState({ value }); }}
/>
扩展用法
借助 onSliderTouchMove 回调参数,可实时获取 value 值和滑块的 translateX。
在 touchMove 滑动过程中,鉴于通过 state 数据来控制滑块移动的性能极差(事件触发太过频繁),故而选择直接改变 Dom 属性,如果你想利用 touchMove 中的回调参数做一些事情,也极力推荐直接操作 Dom,下面有示范。
<span
ref="tip"
style={{ transform: `translateX(${this.state.translateX}px)` }}
>
<Range
onSliderTouchMove={(val, translateX, evt, sliderIndex) => {
const $tip = this.refs.tip,
$tip.innerText = val[sliderIndex];
$tip.style.transform = `translateX(${translateX[sliderIndex]}px)`;
}}
onChange={value => { this.setState({ value }); }}
{...otherProps}
/>
刷新滑块位置
与 Popup 组件复合时,从 display: none 到展示时,可通过 ref 调用 resize() 来将滑块位置重置到正确的位置上,必须得在 Range 组件渲染的 Dom 有实际宽度后调用才能生效。
<Popup
onShow={() => {
this.refs.range.resize();
}}
{...otherProps}
>
<Range
ref="range"
{...otherProps}
/>
</Popup>
disable { Bool } #
受控属性:禁止滑块滑动,阻止touch事件。
默认值: false
max { Number } #
受控属性:滑块滑到最右边应该表示的值。
注意:有传入step属性时,必须保证 (max - min) 能被 step 整除。
默认值: 100
min { Number } #
受控属性:滑块滑到最左边应该表示的值。
step { Number } #
受控属性:滑块单方向滑动一次后的最小步长。
注意:不设置该属性,表示移动时不设步长,step 必须为一正数。
注意:step自带的小数位点影响最后返回的数字的最大小数位数。
value { Array
/Number } #
受控属性:滑块初始化时默认选中的区间范围;
注意:类型提示:类型为Array,对应两个滑块的值,类型为Number,对应于1个滑块的值;
round { Number } #
受控属性:滑块在当前滑动的方向上,累积滑动多大一段距离后,才判定应该到达该方向的下一个停驻点。默认为1/4的间距,也就是如果累积滑动了1/4间距后,即到达该方向上的一下个停驻点。
默认值: 1/4
directionSensitivity { Number } #
受控属性:反向移动多少"像素"算作方向改变,防止手指微动时导致方向改变,近而导致由于微动而很难移动到目标位置。
默认值: 6
isSingle { Bool } #
受控属性:是否启用单滑块模式,默认为 false 不展示,设置为 true 即启用。
默认值: false
showScale { Bool } #
受控属性:是否展示标签,默认为 true 展示,设置为 false 即不展示且不生成标签
默认值: true
scaleFormat { Function } #
受控属性:滑块滑到某一刻度时所展示的刻度文本信息。
注意:如果 step 相对 max - min 足够小,则默认会产生很多个标签,导致显示时会全挤在一块而变成纯色的 bug 样式,这时可设置 showScale 为 false ,可禁用且不渲染标签。
默认值: value => value
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
scale | Number | 单个标签对应的 value 值 | |
index | Number | 当前标签对应的下标 |
返回值: String 单个标签所展示的字符串,支持返回jsx。
scalePosition { Enum {'top','bottom'} } #
受控属性:滑块在轨道线的上边显示,还是下边
默认值: 'top'
onSliderTouchStart { Function } #
触发touchStart事件后,在事件结束前进行调用的函数,该函数有4个参数,onSliderTouchStart(value, translateX, event, sliderIndex)。
默认值: null
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
value | Number/Array | 当前选中区间,单滑块为Number,双滑块为Array; | |
translateX | Number/Array | 当前滑块的translateX,单滑块为Number,双滑块为Array; | |
event | Object | 事件对象; | |
sliderIndex | Number | 当前鼠标拖动的滑块序号,0或1,0表示左滑块,1表示右滑块。 |
onSliderTouchMove { Function } #
触发touchMove事件后,在事件结束前进行调用的函数,该函数有3个参数,onTouchMove(value, translateX, event, sliderIndex)。
默认值: null
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
value | Number/Array | 当前选中区间,单滑块为Number,双滑块为Array; | |
translateX | Number/Array | 当前滑块的translateX,单滑块为Number,双滑块为Array; | |
event | Object | 事件对象; | |
sliderIndex | Number | 当前鼠标拖动的滑块序号,0或1,0表示左滑块,1表示右滑块。 |
onSliderTouchEnd { Function } #
触发touchEnd事件后,在事件结束前进行调用的函数,该函数有4个参数,onSliderTouchEnd(value, translateX, event, sliderIndex),event即事件对象。
默认值: null
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
value | Number/Array | 当前选中区间,单滑块为Number,双滑块为Array; | |
translateX | Number/Array | 当前滑块的translateX,单滑块为Number,双滑块为Array; | |
event | Object | 事件对象; | |
sliderIndex | Number | 当前鼠标拖动的滑块序号,0或1,0表示左滑块,1表示右滑块。 |
onChange { Function } #
当滑动滑块后,滑块在停下时会通过调用上级的 onChange 回调函数,以来在上一层组件中调用 setState 来更新当前组件的状态。
默认值: value => console.log(value)
方法参数:
参数名 | 类型 | 描述 | 支持版本 |
---|---|---|---|
value | Number/Array | 待更新的当前选中区间的对应值 |
extraClass { String } #
受控属性:扩展range组件样式所需添加的额外的类
resize #
当容器宽度改变时,可手动调用 resize 将滑块重置到正确的位置上,可通过ref得到的组件实例来调用(在组件上加个ref属性)。 使用场景1:使用 popup 或者 modal 推出来,由于之前被 display: none 掉,无容器宽度,此时在组件展示的动画之前,在此组件的ref引用上调用此resize方法刷新位置即可。
this.refs.range.resize();