我是Vue的新手,我正在努力思考如何实现一个全局变量或单例的好例子.

背景是我正在使用Azure AD B2C与MSAL库进行身份验证.MSAL需要声明Msal.UserAgentApplication的一个实例,然后通过应用程序共享.

我正在努力解决的是,如何在中央的某个地方声明该实例,然后从每个组件(包括路由)访问它.

现在我有一个类似于这个例子的类:https://github.com/sunilbandla/vue-msal-sample/blob/master/src/services/auth.service.js,当我想使用我正在做的方法时:

var authService = new AuthService();
authService.Login();

不幸的是,每次实例化该类时,都会创建一个新的MSAL实例,这反过来会导致我的用户陷入身份验证循环.

任何帮助都将不胜感激.

非常感谢.


根据下面泰迪的回答,我将我的main.js分修改如下:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './registerServiceWorker'
import AuthService from './services/AuthService';

Vue.config.productionTip = false

Vue.prototype.$authService = new AuthService();

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app');

还有我的登记簿.vue组件如下所示:

<template>
  <div class="about">
    <h1>This is the register page, it should redirect off to B2C</h1>
  </div>
</template>

<script>
  import router from '@/router.js'

  export default {

    created(){

      this.$authService.isAuthenticated().then(
      function(result){
        if(result){
          router.push('/');  
        }
        else{
          authService.register();  
        }
      });
    }  
  } 
</script>

组件说this.$authService是未定义的,所以它显然没有读取原型.

这让我觉得我错过了Vue中真正基本的东西.

推荐答案

您只需将其添加为Vue实例属性即可.它将出现在所有Vue组件上.

把它放在主楼.就像这样:

Vue.prototype.$authService = new AuthService();

以后可以在任何Vue组件中访问它.例如:

this.$authService.Login();

参考:

编辑:

<script>
  //No import as router is available in 'this'
  export default {

    created(){
      var self=this; //For use inside the callback
      this.$authService.isAuthenticated().then(
      function(result){
        if(result){
          self.$router.push('/');  
        }
        else{
          self.$authService.register();  
        }
      });
    }  
  } 
</script>

编辑2:

也许可以在名为AuthServiceInst的文件中创建实例(singleton).js.然后,您可以在两个主目录中导入它.js和路由.js.

新文件AuthServiceInst.js:

import AuthService from './AuthService.js'

export const authService = new AuthService();

主要的js:

import {authService} from './AuthServiceInst.js'

Vue.prototype.$authService = authService;

路由.js:

import {authService} from './AuthServiceInst.js'

//Now you can use authService

Vue.js相关问答推荐

Vue路由路径匹配行为

Vuetify 2中自定义标头的排序和筛选

仅在构建时为 Vue3 和 TailwindCSS 添加前缀

如何在 Nuxt3 中使用 nuxtjs/auth-next 模块?

vue js导航到带有问号的url

在 Vuex 的状态下动态创建一个响应式数组

使用 Vue.js 和 Jest 进行 URL 重定向测试

避免在运行时向 Vue 实例或其根 $data 添加响应式属性

是否可以在没有 Vue 的情况下使用 Vuex?

apache上的Vue-router,子目录下的SPA,只能通过重定向访问页面

Nuxt 打开链接到模态

数据更新后触发 Vue.js 事件

当 v-for 与对象的属性一起使用时,将 v-model 与复选框一起使用

Vue 动态组件事件绑定

这是 v-on:change 的正确用法吗?

如何在 vuetify 中将工具提示添加到数据表标题?

Vue JS 在渲染前等待数据

如何在 NuxtJS 中设置全局 $axios 标头

更改事件上的 Select2 在 Vuejs 中不起作用

在子元素 vueJS.2 之间切换active类