В Naive UI события компонентов играют ключевую роль в управлении
интерактивностью и реактивностью пользовательского интерфейса. В отличие
от стандартного DOM-события, Naive UI предоставляет собственный
механизм эмиссии событий через свойства on и через
функции emit, что позволяет более гибко и типизировано
управлять поведением компонентов.
emitКаждый компонент Naive UI, созданный с помощью
defineComponent или доступный из библиотеки, может
вызывать события с помощью функции emit.
Функция emit обычно передается в setup-функцию:
import { defineComponent } from 'vue';
import { NButton } from 'naive-ui';
export default defineComponent({
components: { NButton },
setup(props, { emit }) {
const handleClick = () => {
emit('custom-click', { timestamp: Date.now() });
};
return { handleClick };
},
template: `
<n-button @click="handleClick">Нажми меня</n-button>
`
});
Ключевые моменты:
custom-click) может быть любым, но
рекомендуется использовать камеру с дефисом для
ясности.emit — это данные, которые
будут переданы родительскому компоненту.v-model.Для отслеживания событий компонента используется директива
v-on (@) в шаблоне:
<n-button @custom-click="onButtonClick">Нажми меня</n-button>
methods: {
onButtonClick(event) {
console.log('Произошло событие:', event.timestamp);
}
}
Особенности в Naive UI:
update:value, change, focus,
blur.v-model Naive UI часто использует кастомные события
вида update:modelValue..stop и
.prevent.Naive UI компоненты предоставляют специальные события для управления состоянием, которые упрощают реактивное связывание данных.
<template>
<n-input v-model:value="text" @focus="onFocus" @blur="onBlur" />
</template>
<script>
export default {
data() {
return { text: '' };
},
methods: {
onFocus() {
console.log('Поле ввода в фокусе');
},
onBlur() {
console.log('Поле ввода потеряло фокус');
}
}
}
</script>
Ключевые моменты:
v-model:value автоматически связывает значение с
событием update:value.focus и blur позволяют отслеживать
пользовательское взаимодействие.NCheckbox,
NRadio, NSwitch существуют события
update:value, change, которые помогают
синхронизировать данные формы.Иногда требуется подписываться на события программно. В setup-функции
можно использовать onMounted и ref для доступа
к компоненту:
import { ref, onMounted } from 'vue';
import { NInput } from 'naive-ui';
export default {
setup() {
const inputRef = ref(null);
onMounted(() => {
inputRef.value?.$on('update:value', (val) => {
console.log('Значение изменилось на:', val);
});
});
return { inputRef };
},
template: `<n-input ref="inputRef" />`
};
Особенности:
v-for.В Naive UI часто используется реактивное управление состоянием через события:
<template>
<n-switch v-model:value="isEnabled" @update:value="onToggle" />
</template>
<script>
import { ref } from 'vue';
export default {
setup() {
const isEnabled = ref(false);
const onTog gle = (val) => {
console.log('Переключатель изменен:', val);
};
return { isEnabled, onToggle };
}
}
</script>
Выводы:
v-model и событие update:value работают
синхронно.Для более сложных компонентов рекомендуется определять
события через defineEmits:
import { defineComponent, defineEmits } from 'vue';
export default defineComponent({
setup() {
const emit = defineEmits(['submit', 'cancel']);
const handleSubmit = () => {
emit('submit', { success: true });
};
const handleCancel = () => {
emit('cancel');
};
return { handleSubmit, handleCancel };
}
});
Преимущества:
Компоненты Naive UI, такие как NDataTable и NForm, имеют специфические события для работы с данными:
sort, filter,
page-changevalidate, submit,
resetПример использования NForm:
<n-form ref="formRef" @submit="onSubmit">
<n-form-item label="Имя">
<n-input v-model:value="name" />
</n-form-item>
</n-form>
<script>
import { ref } from 'vue';
export default {
setup() {
const formRef = ref(null);
const name = ref('');
const onSub mit = (values) => {
console.log('Форма отправлена с данными:', values);
};
return { formRef, name, onSubmit };
}
}
</script>
submit передает все значения формы, что
упрощает обработку и интеграцию с внешними API.v-model для двусторонней
привязки, когда это возможно.camelCase внутри setup, kebab-case в
шаблоне).defineEmits для улучшенной типизации.ref) и подписки на события.Система событий Naive UI обеспечивает гибкий, чистый и реактивный подход к управлению взаимодействиями внутри интерфейса, позволяя создавать как простые, так и сложные компоненты с прозрачной архитектурой.