В Naive UI компоненты активно используют механизм
props для передачи данных и конфигурации. Каждый компонент
имеет набор заранее определённых свойств, которые контролируют его
внешний вид, поведение и функциональность. Пропсы позволяют отделить
логику компонента от его состояния и сделать его переиспользуемым.
Пропсы объявляются с помощью объекта props при
определении компонента через defineComponent. В Naive UI
используется строгая типизация, что особенно важно при работе с
TypeScript, так как это обеспечивает автодополнение и защиту от ошибок
во время компиляции.
import { defineComponent, ref } from 'vue';
import { NButton } from 'naive-ui';
export default defineComponent({
components: { NButton },
setup() {
const count = ref(0);
return { count };
},
props: {
label: {
type: String,
required: true
},
size: {
type: String,
default: 'medium'
}
}
});
Naive UI строго придерживается типизации Vue 3, и каждый пропс может иметь следующие типы:
disabled, loading.Типизация через TypeScript делает использование этих пропсов ещё более надёжным:
import { PropType, defineComponent } from 'vue';
import { NInput } from 'naive-ui';
export default defineComponent({
components: { NInput },
props: {
value: {
type: String as PropType<string>,
required: true
},
onChange: Function as PropType<(val: string) => void>
}
});
Каждый пропс может быть обязательным
(required: true) или необязательным. Для
необязательных пропсов можно задавать значение по
умолчанию через свойство default. Это особенно
важно при создании UI-библиотеки или кастомных компонентов, чтобы
избежать ошибок, когда разработчик забудет передать конкретный
пропс.
props: {
theme: {
type: String,
default: 'light'
},
showIcon: {
type: Boolean,
default: true
}
}
Для более сложных пропсов используется PropType в
сочетании с TypeScript. Это позволяет задавать точные структуры
объектов, массивов или функций.
interface Option {
label: string;
value: number;
}
props: {
options: {
type: Array as PropType<Option[]>,
required: true
},
onSelect: Function as PropType<(option: Option) => void>
}
Такой подход предотвращает передачу некорректных данных и обеспечивает статическую проверку типов ещё на этапе разработки.
Naive UI поддерживает кастомные валидаторы, которые
позволяют проверять значения пропсов перед использованием. Валидатор —
это функция, которая возвращает true для корректного
значения и false для некорректного:
props: {
size: {
type: String,
default: 'medium',
validator: (value) => ['small', 'medium', 'large'].includes(value)
}
}
Это особенно полезно для пропсов с ограниченным набором допустимых значений.
Prop в Naive UI автоматически становится реактивным,
если используется внутри setup. Это значит, что при
изменении значения родительского компонента, дочерний компонент обновит
своё состояние автоматически.
export default defineComponent({
props: {
visible: Boolean
},
setup(props) {
const isVisible = computed(() => props.visible);
return { isVisible };
}
});
Важно помнить, что при деструктуризации props в
setup реактивность теряется. Для сохранения реактивности
следует использовать toRefs:
import { toRefs } from 'vue';
setup(props) {
const { visible, label } = toRefs(props);
return { visible, label };
}
Можно комбинировать default и required,
однако это имеет смысл только для случаев, когда пропс должен быть
передан в определённых сценариях, а для остальных можно использовать
дефолтное значение.
props: {
color: {
type: String,
default: 'blue',
required: false
}
}
PropType используется для сложных объектов, массивов и
функций.props и toRefs.Props в Naive UI — это не просто способ передачи данных, а инструмент строгой типизации и контроля поведения компонентов, что делает интерфейсы гибкими, безопасными и предсказуемыми.