Вы можете иметь функцию, которая возвращает maxItems
, и использовать ее везде, поэтому:
const getMaxItems = () => Math.round(slider.current.innerSlider.list.parentElement.clientWidth / 136)
Вы можете использовать ее возвращаемый результат в пределах recalculateItemsShown
для обновления настроек.
const recalculateItemsShown = () => {
updateSettings({...props.settings, slidesToShow: getMaxItems()});
};
И вы также используете его возвращаемое значение для первоначальной установки состояния.
const [settings, updateSettings] = useState({
...props.settings,
slidesToShow: getMaxItems()
});
Если элемент изначально не существует, вы можете использовать useEffect
с пустым массивом в качестве второго аргумента.Это говорит useEffect
наблюдать за изменениями в этом массиве и вызывать его каждый раз, когда он изменяется, но, поскольку это пустой массив, который никогда не изменяется, он будет запускаться только один раз - при начальном рендеринге.
useEffect(() => {
updateSettings({...props.settings, slidesToShow: getMaxItems()});
}, []);
Вы можете прочитатьПодробнее о том, как пропустить заявку здесь: https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects