В Vue.js доступ к родительскому экземпляру компонента можно получить несколькими способами, но важно понимать последствия каждого из них для архитектуры приложения.
$parent
Самый прямой способ - использовать свойство экземпляра $parent
:
<script>
export default {
mounted() {
// Доступ к методам родителя
this.$parent.someMethod()
// Доступ к данным родителя
console.log(this.$parent.someData)
}
}
</script>
Особенности:
Более предпочтительный способ для глубоко вложенных компонентов:
<!-- Родительский компонент -->
<script>
export default {
provide() {
return {
parentInstance: this
}
}
}
</script>
<!-- Дочерний компонент -->
<script>
export default {
inject: ['parentInstance'],
mounted() {
this.parentInstance.someMethod()
}
}
</script>
Преимущества:
$emit
/$on
)Идеальный способ для коммуникации "снизу-вверх":
<!-- Дочерний компонент -->
<script>
export default {
methods: {
handleClick() {
this.$emit('child-event', data)
}
}
}
</script>
<!-- Родительский компонент -->
<template>
<child-component @child-event="handleChildEvent" />
</template>
Для сложных приложений лучше использовать хранилище:
<script>
import { useStore } from 'vuex'
export default {
setup() {
const store = useStore()
// Доступ к общему состоянию через хранилище
}
}
</script>
хотя Vue и предоставляет способы прямого доступа к родительскому экземпляру, в production-коде лучше использовать более декларативные подходы (события, хранилища) для поддержания чистоты архитектуры.