Range 区段选择器

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

安装方法

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

开发指南

区间选择

何时使用

滑块控件(Sliders,简称滑块)可以让我们通过在连续或间断的区间内滑动锚点来选择一个合适的数值。区间最小值放在左边,对应的,最大值放在右边。滑块(Sliders)可以在滑动条的左右两端设定图标来反映数值的强度。这种交互特性使得它在设置诸如音量、亮度、色彩饱和度等需要反映强度等级的选项时成为一种极好的选择。

使用注意

  • onChange是和value进行配置做受控处理的。onChange在滑动过程中不会触发,滑动停止后会触发。

  • onProcess不建议内部做setState 进行受控,因为会频繁触发,整个滑动过程中会一直触发。

API

区段选择器

参数说明类型默认值
prefix样式类名的品牌前缀String'next-'
className自定义类名String-
style自定义内敛样式Object-
slider滑块个数可选值:'single'(单个)'double'(两个)Enum'single'
min最小值Number0
max最大值Number100
step步长,取值必须大于 0,并且可被 (max - min) 整除。Number1
value设置当前取值。当 slidersingle 时,使用 Number,否则用 [Number, Number]Number/Array<Number>-
defaultValue设置初始取值。当 slidersingle 时,使用 Number,否则用 [Number, Number]Number/Array<Number>-
marks刻度数值显示逻辑(false 代表不显示,array 枚举显示的值,number 代表按 number 平分,object 表示按 key 划分,value 值显示)Boolean/Number/Array<Number>/Objectfalse
disabled值为 true 时,滑块为禁用状态Booleanfalse
onChange当 Range 的值发生改变后,会触发 onChange 事件,并把改变后的值作为参数传入, 如果设置了value, 要配合此函数做受控使用签名:Function(value: String/number) => void参数:value: {String/number} nullFunction() => { }
onProcess滑块拖动的时候触发的事件,不建议在这里setState, 一般情况下不需要用, 滑动时有特殊需求时使用签名:Function(value: String/number) => void参数:value: {String/number} nullFunction() => { }
hasTip是否显示tipBooleantrue
tipFormattertip文件自定义处理签名:Function() => voidFunction(value) => { return value; }
reverse选中态反转Booleanfalse

代码示例

基本

基本滑块,当 sliderdouble 时,渲染为双滑块。当 disabledtrue 时,滑块处于不可用状态。

Range 区段选择器 - 图1

查看源码在线预览

  1. import { Range } from "@icedesign/base";
  2. const style = {
  3. marginBottom: "15px"
  4. };
  5. ReactDOM.render(
  6. <div style={{ width: "400px", margin: "50px" }}>
  7. <h4>单滑块-左向右</h4>
  8. <Range defaultValue={30} style={style} hasTip={false} />
  9. <h4>单滑块-右向左</h4>
  10. <Range defaultValue={30} style={style} reverse hasTip={false} />
  11. <h4>双滑块-从外到里</h4>
  12. <Range slider={"double"} defaultValue={[20, 40]} style={style} />
  13. <h4>双滑块-从里到外</h4>
  14. <Range slider={"double"} defaultValue={[20, 40]} style={style} reverse />
  15. <h4>Disabled</h4>
  16. <Range defaultValue={30} disabled style={style} />
  17. <h4>Disabled</h4>
  18. <Range slider={"double"} defaultValue={[20, 40]} disabled style={style} />
  19. </div>,
  20. mountNode
  21. );

事件

onChange,onProcess事件

Range 区段选择器 - 图2

查看源码在线预览

  1. import { Range } from "@icedesign/base";
  2. class App extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. value: 128,
  7. doubleValue: [10, 30]
  8. };
  9. }
  10. //受控使用, onChange,移动结束时,如果startValue和endValue不等,会触发这个事件
  11. onChange(value) {
  12. console.log("onChange value:", value);
  13. this.setState({ value });
  14. }
  15. //mouseDown以及onMove的时候,如果startValue和endValue不等,会触发这个事件,不建议在这里做setState.
  16. onProcess(value) {
  17. this.setState({ value });
  18. console.log("onProcess: ", value);
  19. }
  20. onChangeDouble(value) {
  21. this.setState({
  22. doubleValue: value
  23. });
  24. }
  25. render() {
  26. return (
  27. <div style={{ width: "400px", margin: "50px" }}>
  28. <p>范围 0 ~ 1024</p>
  29. <div style={{ width: "400px", marginTop: "50px" }}>
  30. <Range
  31. value={this.state.value}
  32. onChange={this.onChange.bind(this)}
  33. onProcess={this.onProcess.bind(this)}
  34. min={0}
  35. max={1024}
  36. marks={[0, 1024]}
  37. />
  38. </div>
  39. <p>设了value受控后的,不设置onChange的状态</p>
  40. <div style={{ width: "400px", marginTop: "50px" }}>
  41. <Range
  42. defaultValue={256}
  43. value={300}
  44. onProcess={this.onProcess.bind(this)}
  45. min={0}
  46. max={1024}
  47. marks={[0, 1024]}
  48. />
  49. </div>
  50. <p>double slider controlled</p>
  51. <div style={{ width: "400px", marginTop: "50px" }}>
  52. <Range
  53. slider="double"
  54. value={this.state.doubleValue}
  55. onChange={this.onChangeDouble.bind(this)}
  56. onProcess={this.onProcess.bind(this)}
  57. min={0}
  58. max={1024}
  59. marks={[0, 1024]}
  60. />
  61. </div>
  62. </div>
  63. );
  64. }
  65. }
  66. ReactDOM.render(<App />, mountNode);

范围与 step

与number-picker结合,外部控制,与Icon结合设置边界Icon

Range 区段选择器 - 图3

查看源码在线预览

  1. import { Range, NumberPicker, Grid, Icon } from "@icedesign/base";
  2. const { Row, Col } = Grid;
  3. class Demo extends React.Component {
  4. constructor(props, context) {
  5. super(props, context);
  6. this.state = {
  7. valueInt: 3,
  8. valueDec: 0.05,
  9. valueIcon: 1,
  10. preIconClass: "",
  11. afterIconClass: ""
  12. };
  13. }
  14. onChangeInt(value) {
  15. console.log(value);
  16. this.setState(
  17. Object.assign({}, this.state, {
  18. valueInt: value
  19. })
  20. );
  21. }
  22. onChangeDec(value) {
  23. this.setState(
  24. Object.assign({}, this.state, {
  25. valueDec: value
  26. })
  27. );
  28. }
  29. onIconRangeProcess(value) {
  30. let mid = 50;
  31. this.setState(
  32. Object.assign({}, this.state, {
  33. valueIcon: value,
  34. preIconClass: value < mid ? "myicon-highlight" : "",
  35. afterIconClass: value >= mid ? "myicon-highlight" : ""
  36. })
  37. );
  38. }
  39. render() {
  40. return (
  41. <div style={{ width: "400px", margin: "50px" }}>
  42. <h2>numberPicker联动</h2>
  43. <Row>
  44. <Col span="12" style={{ marginTop: "10px" }}>
  45. <Range
  46. value={this.state.valueInt}
  47. min={0}
  48. max={20}
  49. step={1}
  50. onChange={this.onChangeInt.bind(this)}
  51. />
  52. </Col>
  53. <Col span="12">
  54. <NumberPicker
  55. value={this.state.valueInt}
  56. min={0}
  57. max={1024}
  58. step={1}
  59. onChange={this.onChangeInt.bind(this)}
  60. />
  61. </Col>
  62. </Row>
  63. <br />
  64. <Row>
  65. <Col span="12" style={{ marginTop: "10px" }}>
  66. <Range
  67. value={this.state.valueDec}
  68. min={0}
  69. max={1}
  70. step={0.01}
  71. onChange={this.onChangeDec.bind(this)}
  72. />
  73. </Col>
  74. <Col span="12">
  75. <NumberPicker
  76. value={this.state.valueDec}
  77. min={0}
  78. max={1}
  79. step={0.01}
  80. onChange={this.onChangeDec.bind(this)}
  81. />
  82. </Col>
  83. </Row>
  84. <h2>Icon结合使用</h2>
  85. <div className="iconWrapper">
  86. <Icon className={"myicon " + this.state.preIconClass} type="cry" />
  87. <Range
  88. min={1}
  89. max={100}
  90. onChange={this.onIconRangeProcess.bind(this)}
  91. value={this.state.valueIcon}
  92. />
  93. <Icon
  94. className={"myicon " + this.state.afterIconClass}
  95. type="smile"
  96. />
  97. </div>
  98. </div>
  99. );
  100. }
  101. }
  102. ReactDOM.render(<Demo />, mountNode);
  1. .iconWrapper {
  2. position: relative;
  3. padding: 0px 40px;
  4. }
  5. .iconWrapper .myicon {
  6. position: absolute;
  7. top: -3px;
  8. width: 16px;
  9. height: 16px;
  10. line-height: 1;
  11. font-size: 16px;
  12. color: #ccc;
  13. }
  14. .iconWrapper .myicon:first-child {
  15. left: 0;
  16. }
  17. .iconWrapper .myicon:last-child {
  18. right: 0;
  19. }
  20. .myicon.myicon-highlight {
  21. color: #666;
  22. }

刻度及标识

通过 scalesmarks 属性设置刻度及标识。

Range 区段选择器 - 图4

查看源码在线预览

  1. import { Range } from "@icedesign/base";
  2. const style = {
  3. marginBottom: "40px",
  4. marginTop: "40px"
  5. };
  6. ReactDOM.render(
  7. <div style={{ width: "400px", margin: "50px" }}>
  8. <p>设置首尾</p>
  9. <Range defaultValue={0} marks={[0, 100]} style={style} />
  10. <Range
  11. slider={"double"}
  12. defaultValue={[20, 40]}
  13. scales={[0, 100]}
  14. marks={[0, 100]}
  15. style={style}
  16. />
  17. <Range defaultValue={30} style={style} />
  18. <p>平分</p>
  19. <Range defaultValue={30} marks={5} style={style} />
  20. <Range
  21. slider={"double"}
  22. defaultValue={[20, 40]}
  23. scales={10}
  24. marks={10}
  25. style={style}
  26. />
  27. <Range
  28. disabled
  29. slider={"double"}
  30. defaultValue={[20, 40]}
  31. scales={10}
  32. marks={10}
  33. style={style}
  34. />
  35. <p>自由刻度</p>
  36. <Range defaultValue={30} marks={[0, 26, 37, 100]} style={style} />
  37. <Range
  38. slider={"double"}
  39. defaultValue={[20, 40]}
  40. marks={[0, 26, 37, 100]}
  41. style={style}
  42. hasTip={false}
  43. />
  44. <Range
  45. defaultValue={30}
  46. marks={{ 0: "0°C", 26: "26°C", 37: "37°C", 100: "100°C" }}
  47. style={style}
  48. />
  49. </div>,
  50. mountNode
  51. );

min,max,step

可以通过 minmax 设置范围边界。通过 step(被 max - min 整除) 设置移动的最小步频。min默认为0,max默认为100.

Range 区段选择器 - 图5

查看源码在线预览

  1. import { Range } from "@icedesign/base";
  2. const style = {
  3. marginBottom: "40px",
  4. marginTop: "40px"
  5. };
  6. ReactDOM.render(
  7. <div style={{ width: "400px", margin: "50px" }}>
  8. <p>范围 0 ~ 1024</p>
  9. <Range
  10. defaultValue={128}
  11. min={0}
  12. max={1024}
  13. marks={[0, 1024]}
  14. style={style}
  15. />
  16. <p>范围 0 ~ 1024,一次移动 128</p>
  17. <Range
  18. defaultValue={512}
  19. min={0}
  20. max={1024}
  21. step={128}
  22. marks={[0, 1024]}
  23. style={style}
  24. />
  25. </div>,
  26. mountNode
  27. );

选择态反转

设置reverse为true, 选中态会反转。

Range 区段选择器 - 图6

查看源码在线预览

  1. import { Range } from "@icedesign/base";
  2. const style = {
  3. marginBottom: "15px"
  4. };
  5. ReactDOM.render(
  6. <div style={{ width: "400px", margin: "50px" }}>
  7. <Range defaultValue={30} style={style} hasTip={false} />
  8. <Range defaultValue={30} style={style} reverse hasTip={false} />
  9. <Range slider={"double"} defaultValue={[20, 40]} style={style} />
  10. <Range slider={"double"} defaultValue={[20, 40]} style={style} reverse />
  11. <Range defaultValue={30} disabled style={style} />
  12. <Range defaultValue={30} disabled style={style} reverse />
  13. <Range slider={"double"} defaultValue={[20, 40]} disabled style={style} />
  14. <Range
  15. slider={"double"}
  16. defaultValue={[20, 40]}
  17. disabled
  18. style={style}
  19. reverse
  20. />
  21. </div>,
  22. mountNode
  23. );

tipFormmater

tipFormatter 示例

Range 区段选择器 - 图7

查看源码在线预览

  1. import { Range } from "@icedesign/base";
  2. class App extends React.Component {
  3. constructor(props) {
  4. super(props);
  5. this.state = {
  6. value: 128
  7. };
  8. }
  9. //onChange,移动结束时,如果startValue和endValue不等,会触发这个事件
  10. onChange(value) {
  11. console.log("onChange value:", value);
  12. }
  13. //mouseDown以及onMove的时候,如果startValue和endValue不等,会触发这个事件.如果是受控组件,改变state要写在这个事件里
  14. onProcess(value) {
  15. console.log("onProcess");
  16. this.setState({ value });
  17. }
  18. formatter(value) {
  19. return "$" + value;
  20. }
  21. render() {
  22. return (
  23. <div style={{ width: "400px", margin: "50px" }}>
  24. <p>范围 0 ~ 1024</p>
  25. <div style={{ width: "400px", marginTop: "50px" }}>
  26. <Range
  27. defaultValue={256}
  28. tipFormatter={this.formatter.bind(this)}
  29. value={this.state.value}
  30. onChange={this.onChange.bind(this)}
  31. onProcess={this.onProcess.bind(this)}
  32. min={0}
  33. max={1024}
  34. marks={[0, 1024]}
  35. />
  36. </div>
  37. </div>
  38. );
  39. }
  40. }
  41. ReactDOM.render(<App />, mountNode);

相关区块

Range 区段选择器 - 图8

暂无相关区块