Appearance
Slider 滑块
用于在连续区间内选择数值,适合音量、比例、进度等场景。
基础用法
vue
<template>
<x-slider v-model="value" :min="0" :max="100" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(30);
</script>禁用状态
vue
<template>
<x-slider v-model="value" disabled show-ticks :step="10" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(50);
</script>步长和刻度
0%
50%
100%
vue
<template>
<x-slider v-model="value" :step="10" show-ticks :marks="marks" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(20);
const marks = {
0: '0%',
50: '50%',
100: '100%',
};
</script>尺寸
尺寸会影响轨道厚度、滑块直径与刻度文字字号。
vue
<template>
<x-slider v-model="value" size="mini" />
<x-slider v-model="value" size="small" />
<x-slider v-model="value" size="medium" />
<x-slider v-model="value" size="large" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(40);
</script>范围选择
vue
<template>
<x-slider v-model="range" range :min="0" :max="100" aria-label="价格范围" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const range = ref<[number, number]>([20, 80]);
</script>独立使用时可给手柄设置 aria-label。id 和 ARIA 属性会传到真实滑块,范围第二端使用 ID-end;放入 Form 后会自动关联字段标签和帮助说明。禁用手柄退出 Tab 序列。
显示输入框
vue
<template>
<x-slider v-model="value" show-input />
<x-slider v-model="range" range show-input />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(36);
const range = ref<[number, number]>([15, 65]);
</script>垂直方向
0
50
100
vue
<template>
<x-slider
v-model="value"
direction="vertical"
:marks="{ 0: '0', 50: '50', 100: '100' }"
/>
<x-slider v-model="range" direction="vertical" range show-input />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(45);
const range = ref<[number, number]>([20, 70]);
</script>Tooltip
vue
<template>
<x-slider v-model="value" :format-tooltip="formatTooltip" tooltip-position="top" />
<x-slider v-model="value" :show-tooltip="false" />
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(25);
const formatTooltip = (val?: string | number) => `${val}%`;
</script>事件
vue
<template>
<x-slider
v-model="value"
@change="(val) => log = `change: ${JSON.stringify(val)}`"
@change-end="(val) => log = `change-end: ${JSON.stringify(val)}`"
/>
<p>{{ log }}</p>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const value = ref(40);
const log = ref('等待操作');
</script>在 Form 中校验
组件放进 x-form-item 后会自动继承 Form 的尺寸与禁用状态,并按 FormItem 的校验规则展示错误。默认 validateTrigger 为 change,即值变化时触发校验。
vue
<template>
<x-form ref="formRef" :model="formState" :rules="formRules">
<x-form-item field="threshold" label="阈值">
<x-slider v-model="formState.threshold" :min="0" :max="100" show-input />
</x-form-item>
<x-form-item>
<x-space>
<x-button type="primary" @click="handleValidate">校验</x-button>
<x-button @click="handleReset">重置</x-button>
</x-space>
</x-form-item>
</x-form>
<p role="status">{{ validateResult }}</p>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import type { FormInstance, FieldRule } from 'x-next';
const formState = reactive({ threshold: 0 });
const formRules: Record<string, FieldRule[]> = {
threshold: [{ required: true, type: 'number', min: 1, message: '请设置阈值' }],
};
const formRef = ref<FormInstance>();
const validateResult = ref('');
const handleValidate = async () => {
const errors = await formRef.value!.validate();
validateResult.value = errors
? `校验失败:${Object.values(errors).map((error) => error.message).join(';')}`
: '校验通过';
};
const handleReset = () => {
formRef.value!.resetFields();
validateResult.value = '已重置';
};
</script>按需导入
ts
import { Slider } from 'x-next';样式按需引入(base.css 为共享基础层,多个组件只需引入一次):
ts
import 'x-next/style/base.css';
import 'x-next/style/form-slider.css';Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
modelValue | 绑定值 | number | [number, number] | number[] | undefined |
defaultValue | 默认值,非受控模式 | number | [number, number] | 0 |
step | 步长 | number | 1 |
min | 最小值 | number | 0 |
max | 最大值 | number | 100 |
marks | 刻度标签 | Record<number, string> | - |
direction | 滑动方向 | 'horizontal' | 'vertical' | 'horizontal' |
disabled | 是否禁用 | boolean | false |
showTicks | 是否显示刻度线 | boolean | false |
showInput | 是否显示输入框 | boolean | false |
range | 是否开启范围选择 | boolean | false |
formatTooltip | 格式化 tooltip 内容 | (value?: string | number) => string | - |
showTooltip | 是否显示 tooltip | boolean | true |
tooltipPosition | tooltip 展示位置 | 'top' | 'tl' | 'tr' | 'bottom' | 'bl' | 'br' | 'left' | 'lt' | 'lb' | 'right' | 'rt' | 'rb' | 横向 'top',垂直 'right' |
size | 组件尺寸 | 'mini' | 'small' | 'medium' | 'large' | 跟随全局配置 |
Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
update:modelValue | 值更新时触发 | value |
change | 值变化时触发,拖动过程中会连续触发 | value |
change-end | 点击、输入、键盘调整或拖拽结束后触发 | value |