Получение доступа к корневому экземпляру Vue может потребоваться для глобальных настроек, управления состоянием или интеграции с другими библиотеками. Рассмотрим различные способы в зависимости от контекста и версии Vue.
this.$root
В любом дочернем компоненте можно обратиться к корневому экземпляру через this.$root
:
export default {
methods: {
accessRoot() {
// Доступ к данным корневого экземпляра
console.log(this.$root.someRootData);
// Вызов методов корневого экземпляра
this.$root.someRootMethod();
}
}
}
<button @click="$root.someRootMethod()">Call Root Method</button>
getCurrentInstance
import { getCurrentInstance } from 'vue';
export default {
setup() {
const instance = getCurrentInstance();
const root = instance?.root;
// Доступ к корневому экземпляру
console.log(root.proxy.someRootData);
return {};
}
}
// main.js
const app = createApp(App);
// Сохраняем ссылку на корневой экземпляр
window.vueApp = app;
app.mount('#app');
В корневом компоненте:
export default {
provide() {
return {
rootInstance: this
}
}
}
В дочернем компоненте:
export default {
inject: ['rootInstance'],
methods: {
useRoot() {
this.rootInstance.someMethod();
}
}
}
Настройка в основном файле:
const app = createApp(App);
app.config.globalProperties.$appName = 'My App';
Использование в компонентах:
export default {
mounted() {
console.log(this.$appName); // 'My App'
}
}
$root
- это может привести к плохо поддерживаемому коду// Вместо доступа к корневому экземпляру
import { useStore } from 'pinia';
const store = useStore();
// Создание
import mitt from 'mitt';
app.config.globalProperties.$eventBus = mitt();
// Использование
this.$eventBus.emit('event-name', data);
Доступ к корневому экземпляру Vue можно получить через this.$root
, getCurrentInstance().root
или сохранив ссылку при создании приложения. Однако в большинстве случаев лучше использовать специализированные инструменты вроде хранилищ состояний или глобальной шины событий для более чистого и поддерживаемого кода.