ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ant-design Slider 分段刻度滑块(marks)实战:included 区间语义与 step=null 精确取值

ant-design Slider 分段刻度滑块(marks)实战:included 区间语义与 step=null 精确取值 ant-design Slider 分段刻度滑块marks实战included 区间语义与 stepnull 精确取值【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design本文基于 ant-design 仓库中 Graduated slider分段滑块示例 及其配套源码展开系统讲解通过marks属性构建带刻度标注的滑块、included的区间包含语义、range双滑块场景以及当stepnull时滑块只允许停留在marks、min、max等离散有效点上的底层机制。读完你既能直接照抄示例代码也能理解这些行为在 Slider 入口源码 与 单测用例 中是如何被定义与验证的。一、这个示例解决什么问题普通 Slider 是一个连续区间选择器滑块可以在min与max之间按step步进滑动。而分段刻度滑块Graduated slider在轨道上额外绘制一组带文案的刻度点用刻度来标注数值含义。典型场景包括温度档位选择0°C / 26°C / 37°C / 100°C不同刻度点还允许单独设置颜色与加粗样式评分、难度、音量等枚举型取值让用户既看到当前值又明白每个档位的含义医学、测量类表单中需要精确吸附到合法检测点的取值如心率档位只能落在仪器支持的值上。该演示页面被收录于 Slider 组件文档 的 Examples 列表标题为 Graduated slider对应的说明文件即components/slider/demo/mark.md配套可运行代码为 mark.tsx。它一共展示了四组配置includedtrue含 range 双滑块、includedfalse、marks step、stepnull覆盖了 marks 属性最核心的几种用法。二、marks 的数据结构与合法取值约束根据 Slider API 文档marks的完整类型定义为参数说明类型默认值marks滑块的刻度标记。键的类型必须是number且必须位于闭区间[min, max]内。每个刻度可以声明自己的样式{ number: ReactNode } \| { number: { style: CSSProperties, label: ReactNode } }-included仅在marks不为空时生效。true表示区间为包含关系默认false表示不同标记之间是并列关系booleantruestep滑块步进的粒度必须大于 0且能被(max - min)整除。当step为null且存在marks时有效点将只有marks、min与maxnumber \| null1两个关键约束值得展开键必须是数字且落在[min, max]内marks 的对象键即刻度对应的滑块数值非数字键或越界值不会被当作有效刻度渲染每个刻度可声明独立样式标签既可以是简单的ReactNode如字符串0°C也可以是{ style, label }对象——style作用于刻度文案 DOMlabel可以是任意 React 节点示例里甚至用了strong。在类型层面示例通过SliderSingleProps[marks]显式标注了 marks 的类型该类型在 Slider 入口 中被定义为SliderMarks RcSliderProps[marks]即最终透传给底层rc-component/slider的类型同时在 SliderBaseProps 中step?: null | number、marks?: SliderMarks、included?: boolean均为可选说明不带 marks 的连续滑块与带 marks 的分段滑块共享同一组件与同一套渲染管线。三、完整示例代码与四组配置拆解下面代码取自 mark.tsx为便于阅读理解我按官方示例原样整理并添加分组说明import React from react; import { Slider } from antd; import type { SliderSingleProps } from antd; const style: React.CSSProperties { marginBottom: 16, }; const sliderStyle: React.CSSProperties { marginBottom: 48, }; // 1) marks键为数值值可为 ReactNode也可为 { style, label } 对象 const marks: SliderSingleProps[marks] { 0: 0°C, 26: 26°C, 37: 37°C, 100: { style: { color: #f50 }, label: strong100°C/strong, }, }; const App: React.FC () ( {/* 2) includedtrue选中区间被连续填充默认行为 */} h4 style{style}includedtrue/h4 Slider style{sliderStyle} marks{marks} defaultValue{37} / Slider style{sliderStyle} range marks{marks} defaultValue{[26, 37]} / {/* 3) includedfalse不同标记之间为并列关系轨道不再填充区间 */} h4 style{style}includedfalse/h4 Slider style{sliderStyle} marks{marks} included{false} defaultValue{37} / {/* 4) marks step数值型 step 与 marks 同时生效 */} h4 style{style}marks step/h4 Slider style{sliderStyle} marks{marks} step{10} defaultValue{37} / {/* 5) stepnull可选值仅为 marks、min、max */} h4 style{style}stepnull/h4 Slider style{sliderStyle} marks{marks} step{null} defaultValue{37} / / ); export default App;代码中值得注意的点defaultValue/value指定滑块位置文档mark.md明确指出使用value/defaultValue指定滑块位置。这里defaultValue{37}让滑块初始落在37°C刻度上range模式下则传入数组[26, 37]让左右两个手柄分别落在两个刻度刻度个性样式100°C使用对象形式将其标签渲染为红色#f50加粗的strong说明 marks 天然支持重要档位高亮这类信息层级设计同一套 marks 被四组滑块复用marks 只是静态标注数据真正的交互行为由included、step、range等属性决定。四、includedtrue / false区间包含语义included是理解分段滑块视觉反馈的关键。Slider 的值本身既可以是某一点也可以是一个区间range 双手柄之间的范围。includedtrue默认表示包含关系。当滑块值为某一点时从min或左/下手柄到当前值之间的轨道会被填充为主题色直观表达已选择的范围。示例第一行滑块defaultValue{37}即从轨道起点填充到 37 刻度includedfalse表示并列/协调关系文档原文coordinative不同刻度之间相互独立、不存在被包含的连续区间因此轨道不会被连续填充选中态以刻度点本身呈现。这类语义适合从多个并列档位里选一个、而不是选一段连续区间的场景。从渲染结果看只要传入 marks 且marks非空根节点即会携带ant-slider-with-marks样式类这在 快照测试 中可以观察到快照中 marks 示例分组marks step下的 DOM 根类名同时包含ant-slider-horizontal与ant-slider-with-marks。五、range 模式双滑块同时吸附刻度当滑块处于rangerange 属性为true时value/defaultValue从number变为[number, number]数组双手柄之间形成选中区间Slider range marks{marks} defaultValue{[26, 37]} /在手柄可拖拽移动的过程中每个手柄都遵循 marks 相关规则。类型层面可以在 SliderRangeProps 看到range: true | SliderRangevalue/defaultValue为数组类型onChange/onChangeComplete回调携带的也是数组而单值模式的 SliderSingleProps 则限定range?: false取值与回调均为单一number。这意味着 marks 与 range 的组合即在分段刻度滑块上做区间选择示例第二行在 API 设计上是开箱即用的不需要额外开关。六、stepnull 时的离散取值语义重点marks与step的协同关系是本文最值得深入的部分官方文档mark.md给出的结论是当stepnull时Slider 的可选值仅有marks、min和max。这句话的实操含义是用户拖拽手柄时手柄会像打点一样只能停留在marks中的每个键、以及轨道的两端min与max上任何两刻度之间的中间值都不可达若某个marks键恰好等于min或max示例中0°C就是min100°C就是max有效点集合即与刻度集合重合语义上它等价于一个固定档位选择器但外观仍是滑块轨道 刻度文案。这一行为有明确的自动化测试背书。Slider 单测 中专门有一条用例验证it(when step is null, thumb can only be slid to the specific mark, () { const intentionallyWrongValue 40; // 故意给一个不落在 marks 上的默认值 const marks { 0: 0, 48: 48, 100: 100, }; const { container } render( Slider marks{marks} defaultValue{intentionallyWrongValue} step{null} tooltip{{ open: true }} /, ); expect(container.querySelector(.ant-slider-handle)!.getAttribute(aria-valuenow)).toBe(48); });该用例断言即使开发者传入的defaultValue{40}并不在任何刻度上在stepnull下渲染后的手柄aria-valuenow也只会是48离 40 最近的合法刻度从无障碍属性层面印证了有效点仅限 marks/min/max、非法中间值会被吸附到最近合法刻度的实现事实。与之对照的是同文件中另外两条用例index.test.tsxstep{1}时defaultValue{49}保持49可按整数步进自由取值step为undefined不传即默认值 1时同样保持49。三组用例对比可以清晰地得出规则只要step是数值含默认值 1滑块就以步进为单位自由取值只有当显式传入step{null}且存在 marks 时才退化为仅刻度可停靠的离散模式。顺带一提 API 文档index.en-US.md对step还有一个数值约束必须大于 0并且能被(max - min)整除。示例中max - min 100、step{10}二者整除因此数值刻度与 marks 可以同时正常工作即第四组marks step滑块按 10 步进但刻度文案仍按 marks 绘制。七、使用建议与易错点小结结合文档、示例与源码实际使用分段滑块时建议注意以下几点区分step与marks的作用边界marks只负责标注 定义离散可停靠点配合stepnullstep负责连续区间内的步进粒度。二者可以同时使用但只有当step为null时 marks 才是唯一的取值约束includedfalse别忘了如果设计上要求并列档位单选而非连续区间包含务必显式设置included{false}否则默认填充的连续轨道会带来错误的区间选择暗示刻度键务必在[min, max]闭区间内且为数字否则不会成为有效刻度期望最大刻度与max一致时直接让键等于max示例中的100即可受控时用value非受控时用defaultValue数值类型与range保持一致单值为number、range 为二元数组回调优先使用onChangeonChangeComplete旧的onAfterChange在类型中已标记为 deprecated见 index.tsx验证离散取值时以aria-valuenow为准这也是仓库单测采用的断言手段对无障碍与自动化测试都有实际意义。如需继续深入可继续阅读 Slider 完整 API 文档 中的tooltip、reverse、vertical等属性或参考本示例同目录下的 垂直滑块示例 与 反向示例理解 marks 在垂直 / RTL 布局下的刻度渲染行为。【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/GitHub_Trending/an/ant-design创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表