В библиотеке Naive UI компоненты предоставляют
удобные свойства для управления интерактивностью и визуальными
индикаторами действий пользователя. Два ключевых состояния, с которыми
чаще всего приходится работать, — это loading и
disabled. Их правильное применение позволяет создавать
интерфейсы, которые интуитивно понятны и отзывчивы.
loadingСостояние loading используется для отображения процесса
выполнения действия, например, отправки формы, загрузки данных или
выполнения асинхронной операции. В Naive UI большинство интерактивных
компонентов, таких как кнопки (n-button) и селекты
(n-select), поддерживают этот проп напрямую.
Пример использования кнопки с
loading:
<template>
<n-button :loading="isLoading" @click="handleClick">
Отправить
</n-button>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const isLoading = ref(false)
const handleClick = async () => {
isLoading.value = true
try {
await sendDataToServer() // асинхронная операция
} finally {
isLoading.value = false
}
}
return { isLoading, handleClick }
}
}
</script>
Особенности поведения:
loading, предотвращая повторные клики.icon.loading можно связать с реактивной переменной,
что позволяет динамически менять состояние компонента.disabledСостояние disabled делает компонент недоступным для
взаимодействия, блокируя все события клика или ввода. В отличие от
loading, оно не обязательно сопровождается визуальной
анимацией.
Пример использования:
<n-button :disabled="isDisabled">
Невозможное действие
</n-button>
Ключевые моменты:
disabled полностью блокирует событие
click.n-input, n-select)
блокирует возможность изменения значения.loading и disabledХотя оба состояния ограничивают действия пользователя, между ними есть различия:
| Свойство | Поведение | Визуальный индикатор |
|---|---|---|
loading |
Компонент активен в плане состояния, но временно блокирует клики | Анимация загрузки (спиннер) |
disabled |
Полностью блокирует взаимодействие | Потускневший или недоступный стиль |
Взаимодействие:
loading часто подразумевает автоматическое включение
блокировки (disabled), но можно управлять этим
отдельно.loading и
disabled, чтобы подчеркнуть, что действие выполняется и
пользователь не может его прервать.<n-button :loading="isLoading" :disabled="isLoading">
Обработка
</n-button>
В реальных приложениях состояния loading и
disabled часто зависят от нескольких условий: асинхронных
запросов, состояния формы или пользовательских действий.
Пример с формой:
<template>
<n-form :model="formData" ref="formRef">
<n-form-item label="Email">
<n-input v-model="formData.email" :disabled="isSubmitting" />
</n-form-item>
<n-button
type="primary"
:loading="isSubmitting"
:disabled="!isFormValid || isSubmitting"
@click="submitForm"
>
Отправить
</n-button>
</n-form>
</template>
<script>
import { ref, computed } from 'vue'
export default {
setup() {
const formData = ref({ email: '' })
const isSubmitting = ref(false)
const isFormValid = computed(() => formData.value.email.includes('@'))
const submitForm = async () => {
isSubmitting.value = true
try {
await sendEmail(formData.value)
} finally {
isSubmitting.value = false
}
}
return { formData, isSubmitting, submitForm, isFormValid }
}
}
</script>
В этом примере:
loading.disabled).loadingNaive UI позволяет полностью кастомизировать спиннер, используя слоты
и проп loading. Например, можно заменить стандартный
индикатор на иконку:
<n-button :loading="isLoading">
<template #loading>
<n-icon><LoadingOutlined /></n-icon>
</template>
Загрузка
</n-button>
Таким образом интерфейс остается гибким и соответствует дизайну приложения.
loading с асинхронными действиями,
чтобы пользователь видел процесс выполнения.disabled использовать для предотвращения действий в
недопустимых состояниях.loading и disabled, чтобы их можно было
использовать наравне со стандартными элементами Naive UI.Эти подходы делают интерфейсы предсказуемыми и удобными, обеспечивая плавный пользовательский опыт.