如何使用 nuxt 和 @vue/composition-api 提供/注入 Vue 根实例?

Joe*_*chr 1 typescript nuxt.js vue-apollo vuejs3 vue-composition-api

我正在尝试将@vue/apollo-composable与我的 Nuxt-Ts 应用程序一起使用。这是如何将它注入到“普通”Vue 应用程序的根实例中的示例:

import { provide } from '@vue/composition-api'
import { DefaultApolloClient } from '@vue/apollo-composable'

const app = new Vue({
  setup () {
    provide(DefaultApolloClient, apolloClient)
  },

  render: h => h(App),
})
Run Code Online (Sandbox Code Playgroud)

问题:我不知道如何访问Nuxt-TS 中的根实例。

我尝试制作一个插件,但它直接注入到根实例中(这是不对的,因为@vue/apollo-composable使用composition-api::provide()which 创建了它自己的属性_provided

如果我使用 nuxt 插件,则会inject$get 连接起来。如果我_provided直接写一个对象通过ctx.app._provided =它不会粘住。

import { DefaultApolloClient } from "@vue/apollo-composable";
const myPlugin: Plugin = (context, inject) => {
  const defaultClient = ctx.app.apolloProvider.defaultClient;
  inject(DefaultApolloClient.toString(), defaultClient) // results in $$ and also composition-api::inject is checking inside `_provided[DefaultApolloClient]`
}

export default myPlugin
Run Code Online (Sandbox Code Playgroud)

我不能provide()像原始示例中那样调用,因为它只允许在VueComponent::setup函数内部使用。

我也尝试创建一个组件,然后在我需要它的页面上使用它(虽然有点违背了在根实例中安装的目的)

const InstallGraphQl = createComponent({
  name: "InstallGraphQl",
  setup(_props, ctx: any) {
    debugger;
    const apolloClient = ctx.app.apolloProvider.defaultClient;
    ctx.provide(DefaultApolloClient, apolloClient);
  },
});
export default createComponent({
  name: "DefaultLayout",
  components: {
    InstallGraphQl
  },
  setup(_props, _ctx: SetupContext) {
    const { result } = useQuery(SharedLayoutQuery);
    return { result };
  },
});
Run Code Online (Sandbox Code Playgroud)

但是然后setup导出的组件在之前被调用InstallGraphQl::setup......

编辑:有关更多信息,@vue/apollo-composable请参阅此处的讨论:https : //github.com/vuejs/vue-apollo/issues/687

小智 6

只需将 a 设置setup()为根选项:

/* plugins/provide-apollo-client.js */

import {provide} from '@vue/composition-api'
import {DefaultApolloClient} from '@vue/apollo-composable'

export default function ({app}) {
  app.setup = () => {
    provide(DefaultApolloClient, ...)
  }

  // Or, use local mixin
  app.mixins = (app.mixins || []).concat({
    setup () {...},
  })
}
Run Code Online (Sandbox Code Playgroud)
/* nuxt.config.js */

export default {
  plugins: ['~/plugins/provide-apollo-client'],
}
Run Code Online (Sandbox Code Playgroud)

虽然对 nuxt-ts 不太熟悉,但我认为代码应该可以正常工作。