如何在 vue 组件之外访问“$apollo”?

Posted

技术标签:

【中文标题】如何在 vue 组件之外访问“$apollo”?【英文标题】:How to access '$apollo' outside vue component? 【发布时间】:2019-07-18 14:34:05 【问题描述】:

如何让 apollo 在 vue 组件之外访问。

我正在验证用户是否存在,然后允许路由继续进行。


        path: '/:username',
        name: 'userProfilePage',
        component: userProfilePage,
        beforeEnter(routeTo, routeFrom, next) 
            userExist(routeTo.params.username)
            next()
        

username 作为参数传递给userExist 函数。

import gql from "graphql-tag"

export default function userExist(username) 
    this.$apollo
        .query(
            query: gql`
        query($username: String!) 
            login(username: $username) 
                username
                email
            
        
    `,
            variables: 
                username: username
            
        )
        .then(res => 
            console.log(res);
            return res
        )
        .catch(err => 
            console.log(err);
            return err
        );

但它正在输出错误:

Apollo 客户端代码

import Vue from 'vue'
import App from './App.vue'
import VueApollo from 'vue-apollo';
import  ApolloClient  from 'apollo-client'
import  HttpLink  from 'apollo-link-http'
import  InMemoryCache  from 'apollo-cache-inmemory'
import router from './routes.js'

Vue.config.productionTip = false

const httpLink = new HttpLink(
    uri: process.env.VUE_APP_DB_URL,
)

const cache = new InMemoryCache()

const apolloClient = new ApolloClient(
    link: httpLink,
    cache
)

Vue.use(VueApollo)

const apolloProvider = new VueApollo(
    defaultClient: apolloClient,
)

new Vue(
    render: h => h(App),
    router,
    apolloProvider
).$mount('#app')

【问题讨论】:

请向我们展示您的 apollo 客户端的代码。 apollo 客户端的代码是什么?你的意思是我初始化 apollo 客户端的代码。 是的,这正是我所需要的。 我已经更新了帖子,你可以查看一下。 我刚刚回答了。 【参考方案1】:

所以不要在 App.vue 文件中初始化 apollo 客户端,而是在另一个文件中初始化它。 类似clients.js的东西,然后导出那个客户端:

const httpLink = new HttpLink(
    uri: process.env.VUE_APP_DB_URL,
)

const cache = new InMemoryCache()

export const apolloClient = new ApolloClient(
    link: httpLink,
    cache
)

完成后,将其导入 App.vue 文件,如下所示:

import  apolloClient  from './clients.js';

Vue.use(VueApollo)

const apolloProvider = new VueApollo(
    defaultClient: apolloClient,
)

new Vue(
    render: h => h(App),
    router,
    apolloProvider
).$mount('#app')

完成后,将该客户端导入到您想要的任何其他文件中:

import  apolloClient  from './client.js';
import gql from "graphql-tag"

export default function userExist(username) 
apolloClient
    .query(
        query: gql`
    query($username: String!) 
        login(username: $username) 
            username
            email
        
    
`,
        variables: 
            username: username
        
    )
    .then(res => 
        console.log(res);
        return res
    )
    .catch(err => 
        console.log(err);
        return err
    );

【讨论】:

以上是关于如何在 vue 组件之外访问“$apollo”?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo boost 触发器在组件之外重新获取

在查询组件之外显示 Apollo 客户端查询加载的最佳实践?

如何在 Vue 组件事件中触发 Apollo 查询?

在 Vue 组件之外访问 VueRouter

如何在 Vuepress 站点中使用 vue-apollo?

Apollo Server:如何从 REST API 数据源访问 Dataloader 中解析器之外的“上下文”