Хотя ответ Дэна правильный, я хотел бы предоставить альтернативу, упомянутую в комментариях, к принятому ответу. У каждого есть свои плюсы и минусы, поэтому вам нужно выбирать в зависимости от ваших потребностей.
Чтобы понять, почему работает приведенный ниже код, важно помнить, что предоставляемые свойства являются транзитивными в дереве компонентов. Т.е. inject('foo')
будет искать 'foo' в каждом родителе, идущем вверх по иерархии вплоть до app
; нет необходимости декларировать что-либо в середине обертки.
Итак, мы можем написать что-то вроде этого:
main. js
import { createApp } from 'vue'
import App from './App.vue'
const globalDateFormatter = (date) => {
return '[' + date.toLocaleString() + ']'
}
const app = createApp(App)
app.provide('globalDateFormatter', globalDateFormatter) // <-- define here
app.mount('#app')
А затем, в некоторых DeepDownComponent . vue:
<template>
<p> {{ fmt(new Date()) }} </p>
</template>
<script>
import { inject } from 'vue'
export default {
setup(){
const fmt = inject('globalDateFormatter', x => x.toString())
// ^-- use here, optional 2nd parameter is the default
return {fmt}
}
}
</script>
Очевидно, что вы можете использовать
provide<T>(key: InjectionKey<T> | string, value: T): void
и
inject<T>(key: InjectionKey<T> | string, defaultValue: T): T
в любом месте вашего кода, не имеет быть app.provide()
Вы также можете указать значения, даже глобальное хранилище, например, просто не забывайте использовать ref()
или reactive()
по мере необходимости.
Короче говоря, когда вы предпочитаете внедрение зависимостей, предоставьте / введите ваши друзья.