UNPKG

@ray-js/smart-ui

Version:

轻量、可靠的智能小程序 UI 组件库

444 lines (379 loc) 13.4 kB
--- category: 数据录入 assets: LampTouchSlider,LampColorSlider,LampSaturationSlider,LampTempSlider,LampBrightSlider,LampStyleSlider,LampVerticalTouchSlider,LampVerticalPercentSlider,HighPerfText,CircleProgress --- # Slider 滑动条 ### 介绍 滑动条是代表模拟无线电调谐或音量控制表盘的 UI 组件。它允许用户从左到右滑动旋钮、手柄或栏,反之亦然。UI 滑动条非常适合用户快速同时探索许多不同的选项或值。最重要的是,当数量或值不需要精确时,它们对于用户来说是实用的组件。 ### 引入 ```jsx import { Slider } from '@ray-js/smart-ui'; ``` ## 代码演示 ### 普通滑动条 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider maxTrackHeight="4px" minTrackHeight="4px" thumbHeight="28px" thumbWidth="28px" value={value} onAfterChange={value => setValue(value)} /> ); } ``` ### 间隔滑动条 设置 `isShowTicks` 为 `true` ,可以展示出滑动间隔 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider value={value} onAfterChange={value => setValue(value)} maxTrackHeight={8} minTrackHeight={8} tickHeight="4px" tickWidth="4px" thumbHeight="18px" thumbWidth="18px" minTrackTickColor="#fff" maxTrackTickColor="#fff" isShowTicks step={10} min={0} max={100} /> ); } ``` ### 间隔滑动条 - 样式2 设置 `hideThumbButton` 为 `true` ,可以隐藏滑块按钮 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider isShowTicks step={30} min={0} max={90} maxTrackHeight="40px" maxTrackRadius="16px" minTrackWidth="40px" minTrackHeight="40px" minTrackRadius="16px" tickWidth="4px" tickHeight="12px" tickRadius="4px" hideThumbButton value={value} onAfterChange={value => setValue(value)} /> ); } ``` ### 拖动滑动条 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider minTrackRadius="13px" minTrackHeight="22px" maxTrackRadius="13px" maxTrackHeight="26px" value={value} thumbWidth={18} thumbHeight={18} parcel parcelMargin={2} onAfterChange={value => setValue(value)} /> ); } ``` ### 拖动滑动条 - 样式2 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider minTrackRadius="8px" minTrackHeight="45px" maxTrackRadius="8px" maxTrackHeight="45px" value={value} onAfterChange={value => setValue(value)} thumbWidth={15} thumbHeight={50} thumbRadius={2} thumbStyle={{ background: '#BBC5D4', border: '2px solid #FFFFFF', boxShadow: '0px 0px 2px 0px rgba(0, 0, 0, 0.5)', }} /> ); } ``` ### 拖动滑动条 - 样式3 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider parcel parcelMargin={2} minTrackRadius="5px" minTrackHeight="22px" maxTrackRadius="5px" maxTrackHeight="26px" value={value} thumbWidth={3} thumbHeight={16} onAfterChange={value => setValue(value)} /> ); } ``` ### 双滑块滑动条 ```jsx import { View } from '@ray-js/ray'; import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState([10, 30]); return ( <View style={{ padding: 48 }}> <Slider.RangeSlider min={0} max={100} barHeight="4px" value={value} inActiveColor="#D8D9DC" activeColor="#007AFF" onChange={event => setValue(event.detail)} /> </View> ); } ``` ### 竖向 ```jsx import { Slider } from '@ray-js/smart-ui'; import React from 'react'; export default function Demo() { const [value, setValue] = React.useState(30); return ( <Slider isVertical value={value} step={1} min={0} max={100} parcel parcelMargin={2} useParcelPadding={false} thumbWidth={12} thumbHeight={2} thumbRadius={2} maxTrackWidth="48px" maxTrackHeight="203px" maxTrackRadius="8px" minTrackWidth="48px" minTrackHeight="114px" maxTrackColor="rgba(0, 0, 0, 0.08)" minTrackColor="#1989FA" onAfterChange={setValue} thumbStyle={{ borderRadius: '2px', width: '12px', height: '2px', }} /> ); } ``` ## API ### Slider Props |属性名|描述|类型|默认值| |---|---|---|---| |instanceId|--|string|undefined| |className|类名|string|undefined| |style|样式|CSSProperties|undefined| |isVertical|是否垂直展示,垂直展示时,需要设置滑槽宽高|boolean|false| |value|样式|number|undefined| |defaultValue|默认值|number|0| |min|最小值|number|0| |max|最大值|number|100| |step|步距,取值必须大于 `0`,并且可被 `(max - min)` 整除。|number|1| |forceStep|和 step 一致,用于滑块不跟随刻度时设置|number|1| |disabled|是否禁用|boolean|false| |onChange|拖拽滑块时触发,并把当前拖拽的值作为参数传入|(value: number) => void|undefined| |onBeforeChange|滑块拖拽开始时触发,并把当前拖拽的值作为参数传入|(value: number) => void|undefined| |onAfterChange|与 `touchend` 触发时机一致,把当前值作为参数传入|(value: number) => void|undefined| |maxTrackWidth|滑槽宽度|Width<string \| number>|'100%'| |maxTrackHeight|滑槽高度|Width<string \| number>|'4px'| |maxTrackRadius|滑槽圆角|BorderRadius<string \| number>|'4px'| |maxTrackColor|滑槽颜色|Background<0 \| (string & {})>|'#d8d8d8'| |minTrackWidth|滑条最小宽度|Width<string \| number>|'28px'| |minTrackHeight|滑条高度|Width<string \| number>|'4px'| |minTrackRadius|滑条圆角|BorderRadius<string \| number>|'inherit'| |minTrackColor|滑条颜色|Background<0 \| (string & {})>|'#158CFB'| |thumbWidth|滑块宽度|Width<string \| number>|'28px'| |thumbStyle|滑块样式|CSSProperties|null| |thumbWrapStyle|滑块wrap样式|CSSProperties|null| |thumbHeight|滑块高度|string | number|'28px'| |thumbRadius|滑块圆角|string | number|'28px'| |thumbColor|滑块颜色|Background<0 \| (string & {})>|'#ffffff'| |thumbBorderStyle|滑块边框类型|BorderStyle|'none'| |thumbBoxShadowStyle|滑块阴影|BoxShadow|'0px 0.5px 4px rgba(0, 0, 0, 0.12), 0px 6px 13px rgba(0, 0, 0, 0.12)'| |isShowTicks|是否显示刻度|boolean|false| |tickWidth|刻度宽度|string|'4px'| |tickHeight|刻度高度|string|'12px'| |tickRadius|刻度圆角|string|'4px'| |maxTrackTickColor|滑槽刻度颜色|string|'#158CFB'| |minTrackTickColor|滑条刻度颜色|string|'#ffffff'| |trackStyle|轨道样式|CSSProperties|undefined| |barStyle|滑条样式|CSSProperties|undefined| |renderType|渲染方式|"ray" | "sjs"|'sjs'| |hideThumbButton|隐藏滑块|boolean|null| |thumbStyleRenderFormatter|渲染按钮背景色,例如 "rgb(value,100,100)",将value替换为滑动值(仅sjs支持)|Partial<Record<keyof CSSProperties, string>>|null| |thumbStyleRenderValueScale|渲染value时的缩放倍数|number|1| |thumbStyleRenderValueStart|渲染value时的起始值|number|0| |thumbStyleRenderValueReverse|渲染value时反转值|boolean|false| |enableTouch|使用触摸跳跃|boolean|true| |hidden|是否隐藏|boolean|false| |parcel|包裹滑动条|boolean|false| |parcelMargin|包裹滑动条间隔|number|0| ### Slot | 名称 | 说明 | | ----- | -------- | | bar `v2.4.0` | 滑动条插槽 | | thumb `v2.4.0` | 滑块插槽 | ### RangeSlider Props |参数|说明|类型|默认值| |---|---|---|---| |value|当前进度百分比,在双滑块模式下为数组格式|number | number[]|0| |disabled|是否禁用滑块|boolean|false| |max|最大值|number|100| |min|最小值|number|0| |step|步长|number|1| |barHeight|进度条高度,默认单位为 px|string | number|2px| |activeColor|进度条激活态颜色|string|#1989fa| |inactiveColor|进度条默认颜色|string|#e5e5e5| |vertical|是否垂直展示|boolean|false| |onDrag|拖动进度条时触发|event.detail.value: 当前进度| |onChange|进度值改变后触发|event.detail: 当前进度| |onDragStart|开始拖动时触发|-| |onDragEnd|结束拖动时触发|-| ### 样式变量 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](/material/smartui?comId=config-provider)。 | 名称 | 默认值 | 描述 | | ----------------------------- | -------------------------------------- | ---- | | --slider-active-background-color | _#1989fa_ | 设置滑块激活状态下的背景颜色。 | | --slider-inactive-background-color | _#ebedf0_ | 设置滑块未激活状态下的背景颜色。 | | --slider-disabled-opacity | _0.3_ | 设置滑块禁用状态的透明度,数值越小透明度越高。 | | --slider-bar-height | _2px_ | 设置滑块轨道的高度。 | | --slider-button-width | _24px_ | 设置滑块按钮的宽度。 | | --slider-button-height | _24px_ | 设置滑块按钮的高度。 | | --slider-button-border-radius | _50%_ | 设置滑块按钮的圆角半径,通常用来实现圆形按钮。 | | --slider-button-background-color | _#fff_ | 设置滑块按钮的背景颜色。 | | --slider-button-box-shadow | _0 1px 2px rgba(0, 0, 0, 0.5)_ | 设置滑块按钮的阴影效果,可以增强立体感。 | | --slider-thumb-color | _var(--app-B3, #ffffff)_ | 设置滑块按钮的指示色,通常用于显示当前进度的指示器。 | ## 常见问题 ### Slider 拖动时会抖动卡顿 Slider 拖动时会抖动卡顿,需要检查一下是否为非受控组件写法,尽量使用 `onAfterChange` 来更新 `value`,推荐写法如下: ```tsx export default () => { const [value, setValue] = useState(10) // onAfterChange 拖动结束后更新 const [showValue, setShowValue] = useState(10) // 只用作实时展示使用 return ( <> <View>当前值:{showValue}</View> <Slider value={value} onChange={(newValue) => { setShowValue(newValue) }} onAfterChange={setValue} // 松开滑块时触发 /> </> ) } ``` ### Slider 受控模式滑动位置定位异常,该如何处理? 这种情况往往是在在`Popup`弹框内嵌套使用`Slider`,由于 `Slider` 组件使用到 `auto-height` 属性时,在 `Popup` 打开时可能尚未完全渲染,因此我们无法获取其 DOM,从而导致定位出现问题。 解决方案是在 `Popup` 的 `onAfterEnter` 事件回调之后再开始渲染此类组件。这样,我们可以确保此类组件能够在获取 DOM 时被正常渲染。请参考以下示例: ```jsx import React from 'react'; import { Cell, Popup } from '@ray-js/smart-ui'; import { DemoBlock } from '@/components'; import { View, Slider } from '@ray-js/ray'; function Demo() { const [show, setShow] = React.useState(false); const [isReady, setIsReady] = React.useState(false); const showBasic = () => setShow(true); const handleChange = e => setValue(e.detail.value); return ( <DemoBlock title="基础用法"> <Cell title="展示弹出层" isLink onClick={showBasic} /> <Popup show={show} position="bottom" onClose={hideBasic} onAfterEnter={() => setIsReady(true)} > <View style={{ padding: '32px', position: 'relative' }}> {isReady && <Slider value={value} max={100} min={0} onChange={handleChange} />} </View> </Popup> </DemoBlock> ); } ``` 注意,`isReady` 可能存在首次渲染布局抖动,请升级到最新版,使用 `Slider` 的 `deps` 属性进行渲染优化,示例: ```jsx import React from 'react'; import { Cell, Popup } from '@ray-js/smart-ui'; import { DemoBlock } from '@/components'; import { View, Slider } from '@ray-js/ray'; function Demo() { const [show, setShow] = React.useState(false); const [isReady, setIsReady] = React.useState(false); const showBasic = () => setShow(true); const handleChange = e => setValue(e.detail.value); return ( <DemoBlock title="基础用法"> <Cell title="展示弹出层" isLink onClick={showBasic} /> <Popup show={show} position="bottom" onClose={hideBasic} onAfterEnter={() => setIsReady(true)} > <View style={{ padding: '32px', position: 'relative' }}> <Slider deps={[show]} value={value} max={100} min={0} onChange={handleChange} /> </View> </Popup> </DemoBlock> ); } ```