Props (properties) — механизм передачи данных от родительского компонента к дочернему. Архитектура Vue.js строится на принципе однонаправленного потока данных: родитель владеет состоянием, дочерний компонент получает это состояние в виде входных параметров и не изменяет его напрямую.
Такой подход упрощает сопровождение кода, делает поведение компонентов предсказуемым и предотвращает скрытые побочные эффекты.
Передача данных осуществляется через атрибуты компонента в шаблоне родителя.
<ChildComponent title="Заголовок" />
В дочернем компоненте props объявляются явно:
export default {
props: ['title']
}
После объявления значение становится доступным в шаблоне и логике компонента:
<h1>{{ title }}</h1>
Для передачи переменных используется директива v-bind
или её сокращённая форма :.
<ChildComponent :count="items.length" />
export default {
props: ['count']
}
Без v-bind значение всегда интерпретируется как
строка.
Во Vue применяются разные стили именования:
camelCasekebab-caseprops: ['userName']
<ChildComponent user-name="Ivan" />
Vue автоматически сопоставляет эти форматы.
Для повышения надёжности props могут объявляться в виде объекта с указанием типа.
export default {
props: {
title: String,
count: Number,
isActive: Boolean
}
}
Поддерживаемые типы:
StringNumberBooleanArrayObjectFunctionDateSymbolProps можно пометить как обязательные и задать значения по умолчанию.
props: {
title: {
type: String,
required: true
},
count: {
type: Number,
default: 0
}
}
Для объектов и массивов default должен быть
функцией:
props: {
options: {
type: Object,
default() {
return {}
}
}
}
Это предотвращает совместное использование одного и того же объекта между экземплярами компонентов.
Vue позволяет задавать пользовательские правила проверки.
props: {
status: {
type: String,
validator(value) {
return ['success', 'error', 'loading'].includes(value)
}
}
}
При нарушении правил Vue выводит предупреждение в консоль в режиме разработки.
Props являются реактивными: при изменении значения в родительском компоненте дочерний автоматически обновляется.
<ChildComponent :count="counter" />
Изменение counter в родителе приводит к перерисовке
дочернего компонента.
Прямое изменение props считается архитектурной ошибкой.
this.count++ // антипаттерн
Причины:
Vue выводит предупреждение при попытке изменить prop напрямую.
Если требуется изменяемое значение, создаётся локальное состояние:
props: {
count: Number
},
data() {
return {
localCount: this.count
}
}
Для трансформации входных данных:
props: ['price'],
computed: {
priceWithTax() {
return this.price * 1.2
}
}
Boolean props имеют особое поведение.
<ChildComponent disabled />
props: {
disabled: Boolean
}
Наличие атрибута автоматически интерпретируется как
true.
Props могут содержать функции, что позволяет передавать поведение:
<ChildComponent :onS ave="saveData" />
props: {
onSave: Function
}
На практике чаще используется механизм событий (emit),
так как он лучше отражает архитектуру Vue.
Props:
События (emit):
Типовой шаблон взаимодействия:
<ChildComponent :value="text" @update="text = $event" />
.sync и его особенности.sync — синтаксический сахар для связки props и
событий.
<ChildComponent :value.sync="text" />
Эквивалентно:
<ChildComponent
:value="text"
@update:value="text = $event"
/>
Использование .sync ограничено и не рекомендуется для
сложной логики, так как может скрывать поток данных.
Объекты и массивы передаются по ссылке:
<ChildComponent :user="user" />
Изменение вложенных свойств влияет на родителя, что требует осторожности. Для защиты данных применяется:
В Composition API props передаются в функцию setup.
export default {
props: {
title: String
},
setup(props) {
console.log(props.title)
}
}
Деструктуризация лишает реактивности:
const { title } = props // не реактивно
Корректный вариант:
import { toRefs } from 'vue'
const { title } = toRefs(props)
Props не предназначены для:
В таких случаях применяются:
provide / injectЧёткое понимание механизма props является основой масштабируемой и поддерживаемой архитектуры Vue-приложений.