В Chakra UI компоненты часто поддерживают встроенные пропсы для
управления состояниями взаимодействия пользователя, такими как
loading и disabled. Эти состояния позволяют
легко контролировать визуальные и функциональные эффекты без написания
дополнительной логики вручную.
isLoadingПроп isLoading используется для отображения состояния
загрузки. Он часто применяется на кнопках, индикаторах и других
интерактивных элементах. При установке isLoading={true}
компонент автоматически показывает индикатор загрузки и блокирует
пользовательское взаимодействие с элементом.
import { Button } from '@chakra-ui/react';
import { useState } from 'react';
function LoadingButtonExample() {
const [loading, setLoading] = useState(false);
const handleClick = () => {
setLoading(true);
setTimeout(() => setLoading(false), 2000);
};
return (
<Button colorScheme="blue" isLoading={loading} onCl ick={handleClick}>
Отправить
</Button>
);
}
Ключевые моменты:
isLoading.loadingText:<Button
colorScheme="green"
isLoading={loading}
loadingText="Сохраняем..."
>
Сохранить
</Button>
spinnerPlacement задаёт позицию индикатора загрузки
относительно текста (start или end).isDisabledПроп isDisabled полностью блокирует компонент для
взаимодействия, сохраняя его визуально активным, но делая недоступным
для кликов или ввода.
import { Input, Button, Stack } from '@chakra-ui/react';
function DisabledFormExample() {
return (
<Stack spacing={3}>
<Input placeholder="Имя" isDisabled />
<Input placeholder="Email" isDisabled />
<Button colorScheme="teal" isDisabled>
Отправить
</Button>
</Stack>
);
}
Особенности:
onClick или
onChange.isLoading для более сложной
логики:<Button colorScheme="purple" isLoading={loading} isDisabled={formInvalid}>
Отправить
</Button>
isLoading и isDisabledChakra UI автоматически предотвращает конфликт этих состояний: когда
isLoading={true}, кнопка ведёт себя как
isDisabled, блокируя взаимодействие. Однако
isDisabled можно использовать отдельно для случаев, когда
элемент должен быть недоступен, но не показывать индикатор загрузки.
function FormWithLoading() {
const [loading, setLoading] = useState(false);
const [input, setInput] = useState('');
const handleSubmit = () => {
setLoading(true);
setTimeout(() => setLoading(false), 1500);
};
return (
<Stack spacing={3}>
<Input
placeholder="Введите текст"
value={input}
onCha nge={(e) => setInput(e.target.value)}
/>
<Button
colorScheme="orange"
isLoading={loading}
isDisabled={!input}
onCl ick={handleSubmit}
>
Отправить
</Button>
</Stack>
);
}
В этом примере кнопка становится недоступной
(isDisabled) пока поле пустое, а при отправке показывается
индикатор загрузки (isLoading).
spinner: можно заменить стандартный
индикатор на кастомный компонент Spinner:<Button
isLoading={loading}
spinner={<Spinner size="sm" color="red.500" />}
>
Загружается
</Button>
loadingText и
spinnerPlacement позволяют точно настроить
внешний вид кнопки в состоянии загрузки, делая интерфейс более
информативным для пользователя.Помимо кнопок, многие компоненты Chakra UI поддерживают
isDisabled:
Input, Textarea, Select –
блокируют ввод.Switch, Checkbox, Radio –
блокируют переключение.MenuItem – недоступен для клика.Для isLoading чаще всего применимо к интерактивным
кнопкам и компонентам, где необходимо показать прогресс выполнения
действия.
Состояния loading и disabled удобно
управлять через React state или форму управления состоянием:
function DynamicStates() {
const [loading, setLoading] = useState(false);
const [enabled, setEnabled] = useState(true);
return (
<Stack spacing={3}>
<Button
isLoading={loading}
isDisabled={!enabled}
onCl ick={() => {
setLoading(true);
setTimeout(() => setLoading(false), 2000);
}}
>
Кнопка
</Button>
<Button onCl ick={() => setEnabled((prev) => !prev)}>
{enabled ? 'Выключить кнопку' : 'Включить кнопку'}
</Button>
</Stack>
);
}
Такой подход позволяет точно управлять состояниями компонентов в зависимости от логики приложения и пользовательских действий.
isLoading для отображения операций с
задержкой, таких как отправка формы или загрузка данных.isDisabled для ограничений взаимодействия
до выполнения условий (например, заполнения обязательных полей).isLoading и isDisabled для
создания понятного UX: кнопка блокируется, а пользователь видит процесс
выполнения действия.Эффективное использование этих пропсов позволяет создавать интерфейсы с минимальной дополнительной логикой и обеспечивает предсказуемое поведение компонентов при взаимодействии.