Я работаю над созданием компонента для внешней библиотеки, которую я хочу использовать в своем проекте ( noUiSlider ).
В настоящее время это мой Slider
компонент:
function Slider(props) {
const { defaultMin, defaultMax, step } = props;
const sliderElement = useRef();
useEffect(() => {
if (!sliderElement.current) {
return;
}
noUiSlider.create(sliderElement.current, {
connect: true,
start: [defaultMin, defaultMax],
step,
range: {
min: [defaultMin],
max: [defaultMax],
},
});
if (props.onUpdate) {
sliderElement.current.noUiSlider.on('update', props.onUpdate);
}
if (props.onEnd) {
sliderElement.current.noUiSlider.on('end', props.onEnd);
}
}, []);
return <div ref={sliderElement} />;
}
здесь я жду, пока будет доступен элемент DOM, а затем создаю экземпляр noUiSlider для этого элемента DOM (div
я возвращаю). Я также прикрепляю некоторые обработчики событий внутри эффекта (onUpdate и onEnd).
Использование компонента Slider
выглядит следующим образом ...
// custom hook that just sets state
const [min, max, setMinMax] = useSlider(10, 300);
const handleEnd = () => {
// these are outdated :(
console.log(min, max);
}
<Slider
defaultMin={10}
defaultMax={300}
step={10}
onEnd={handleEnd}
onUpdate={setMinMax}
/>
Проблема, с которой я сталкиваюсь, заключается в том, что внутри handleEnd
, когда я хочу сослаться на min
и max
, они являются начальными значениями, а не значениями, которые я ожидал обновить.
Как получить обновленные значения из одной и той же области видимости из функции, которую я вызываю внутри useEffect
?
Я создал codesandbox пример, чтобы показать это в действии.