Skip to main content

Slider

Slider.tsx
import React, { useState, useRef, useEffect } from 'react';
import styles from './Slider.module.css';

type SliderProps = {
min: number;
max: number;
step: number;
value: number;
onChange: (value: number) => void;
}

const Slider = ({ min, max, step, value, onChange }: SliderProps) => {
const [sliderValue, setSliderValue] = useState<number>(value);
const sliderRef = useRef<HTMLInputElement>(null);

useEffect(() => {
if (sliderRef.current) {
sliderRef.current.value = sliderValue.toString();
}
}, [sliderValue]);

const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const newValue = Number(event.target.value);
setSliderValue(newValue);
onChange(newValue);
};

return (
<div className={styles.slider}>
<input
type="range"
ref={sliderRef}
min={min}
max={max}
step={step}
value={sliderValue}
onChange={handleInputChange}
/>
<span>{sliderValue}</span>
</div>
);
}

export default Slider;


Usage
import React, { useState } from 'react';
import Slider from './Slider';

const App = () => {
const [sliderValue, setSliderValue] = useState<number>(5);

const handleSliderChange = (newValue: number) => {
setSliderValue(newValue);
};

return (
<div>
<h1>Slider Value: {sliderValue}</h1>
<Slider min={1} max={10} step={1} value={sliderValue} onChange={handleSliderChange} />
</div>
);
}

export default App;


Slider.module.css