Слайдеры в библиотеке MUI предоставляют удобный способ выбора числового значения из заданного диапазона. Основные виды слайдеров — discrete (дискретные) и continuous (непрерывные). Они различаются тем, как пользователь взаимодействует с ползунком и как обрабатываются значения.
Continuous Slider позволяет выбирать любое значение в пределах заданного диапазона. Ползунок движется плавно, а значение меняется непрерывно.
Ключевые свойства:
value — текущее значение слайдера. Может быть числом
или массивом чисел для диапазона.onChange — функция-обработчик, вызываемая при каждом
изменении значения. Получает два аргумента: событие и новое
значение.min и max — границы диапазона
значений.step — шаг изменения значения. Для continuous-слайдера
этот параметр часто равен 1 или 0.1, но может
быть опущен для максимально плавного движения.Пример:
import Slider from '@mui/material/Slider';
import { useState } from 'react';
function ContinuousSliderExample() {
const [value, setValue] = useState(30);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<Slider
value={value}
onCha nge={handleChange}
min={0}
max={100}
step={1}
/>
);
}
Особенность continuous-слайдера в том, что изменение значения происходит в реальном времени, что делает его удобным для визуальных эффектов, таких как регулировка громкости, прозрачности или масштабирования элементов интерфейса.
Discrete Slider ограничивает значения конкретными шагами. Пользователь может выбрать только заранее определённые числа или позиции.
Ключевые свойства:
marks — массив объектов { value, label },
задающий метки и шаги на шкале.step — шаг между значениями. Для дискретного слайдера
обязательное значение, чтобы пользователь не мог выбрать произвольное
число.valueLabelDisplay — отображение текущего значения.
Возможные варианты: auto, on,
off.Пример с метками:
import Slider from '@mui/material/Slider';
const marks = [
{ value: 0, label: '0°C' },
{ value: 20, label: '20°C' },
{ value: 37, label: '37°C' },
{ value: 100, label: '100°C' },
];
function DiscreteSliderExample() {
return (
<Slider
defaultValue={20}
step={10}
marks={marks}
valueLabelDisplay="on"
min={0}
max={100}
/>
);
}
Дискретный слайдер удобен там, где допустимы только конкретные значения: уровни громкости, количество предметов, оценочные шкалы.
Оба типа слайдеров поддерживают выбор диапазона значений с помощью
массива [minValue, maxValue]. Для этого используется
свойство value и соответствующая настройка функции
onChange.
Пример диапазона:
const [range, setRange] = useState([20, 50]);
<Slider
value={range}
onCha nge={(e, newRange) => setRange(newRange)}
valueLabelDisplay="auto"
min={0}
max={100}
step={5}
/>
color — цвет слайдера (primary,
secondary, или кастомный через sx).size — размер слайдера (small или
medium).orientation — вертикальная или горизонтальная
ориентация (horizontal по умолчанию).marks и valueLabelDisplay позволяют
улучшить визуальное восприятие дискретных значений.<Slider
defaultValue={30}
step={10}
marks
valueLabelDisplay="auto"
color="secondary"
orientation="vertical"
/>
| Свойство | Continuous | Discrete |
|---|---|---|
| Выбор значения | Любое число | Только шаги/метки |
| Использование | Регулировка параметров | Конкретные уровни |
Метки (marks) |
Опционально | Обязательно для наглядности |
| Отображение значения | Необязательно | Часто используется |
Шаг (step) |
Может отсутствовать | Обязателен |
MUI-слайдеры поддерживают два типа событий:
onChange — срабатывает в процессе перемещения
ползунка, возвращая текущее значение.onChangeCommitted — срабатывает после окончания
перемещения, что удобно для отправки значений на сервер или
изменения состояния приложения без лишних рендеров.<Slider
value={value}
onCha nge={(e, val) => setValue(val)}
onChangeCommit ted={(e, val) => console.log("Committed:", val)}
/>
Это позволяет оптимизировать производительность при сложных вычислениях или анимациях.
Слайдеры можно интегрировать с формами через
react-hook-form или formik. Для этого MUI
предоставляет возможность контролировать значение через пропсы
value и onChange.
Пример с react-hook-form:
import { useForm, Controller } from 'react-hook-form';
import Slider from '@mui/material/Slider';
function FormWithSlider() {
const { control, handleSubmit } = useForm({
defaultValues: { volume: 50 }
});
const onSub mit = data => console.log(data);
return (
<form onSub mit={handleSubmit(onSubmit)}>
<Controller
name="volume"
control={control}
render={({ field }) => (
<Slider {...field} min={0} max={100} step={5} valueLabelDisplay="auto" />
)}
/>
<button type="submit">Submit</button>
</form>
);
}
marks для наглядности на
дискретных слайдерах.onChangeCommitted для
оптимизации вычислений и сетевых запросов.sx для соответствия стилю
интерфейса.Слайдеры MUI обеспечивают гибкость и удобство как для простых форм, так и для сложных пользовательских интерфейсов, позволяя легко сочетать визуальные эффекты и точный контроль значений.