【问题标题】:Using vuejs plugin on the main.js file在 main.js 文件上使用 vuejs 插件
【发布时间】:2018-05-02 22:44:11
【问题描述】:

我正在尝试创建一个插件来管理我的 vuejs 应用程序中的 Oauth2 令牌数据。

我根据互联网上的一些教程创建了插件。

var plugin = {}

plugin.install = function (Vue, options) {
  var authStorage = {
    getToken () {
      let token = localStorage.getItem('access_token')
      let expiration = localStorage.getItem('expiration')
      if (!token || !expiration) {
        return null
      }
      if (Date.now() > parseInt(expiration)) {
        this.destroyToken()
        return null
      }

      return token
    },
    setToken (accessToken, expiration, refreshToken) {
      localStorage.setItem('access_token', accessToken)
      localStorage.setItem('expiration', expiration + Date.now())
      localStorage.setItem('refresh_token', refreshToken)
    },
    destroyToken () {
      localStorage.removeItem('access_token')
      localStorage.removeItem('expiration')
      localStorage.removeItem('refresh_token')
    },
    isAuthenticated () {
      if (this.getToken()) {
        return true
      } else {
        return false
      }
    }
  }

  Vue.prototype.$authStorage = authStorage
}

export default plugin

但是当尝试访问 main.js 文件中的方法时,我收到错误消息,指出对象未定义。

import Vue from 'vue'
import App from './App'
import router from './router'
import AuthStorage from './AuthStorage.js'

Vue.config.productionTip = false
Vue.use(AuthStorage)

router.beforeEach((to, from, next) => {
  if (to.matched.some(record => record.meta.requireAuth)) {
    if (!Vue.$authStorage.getToken()) {
      next({
        path: '/',
        query: { redirect: to.fullPath }
      })
    } else {
      next()
    }
  } else {
    next()
  }
})
axios.defaults.headers.common = {
  'Authorization': `Bearer ${Vue.$authStorage.getToken()}`
}
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

在组件内部,插件按预期工作。问题是当 o 尝试在 main.js 文件中使用时。 我已经尝试过: this.$authStorage this.authStorage Vue.authStorage

没有成功

【问题讨论】:

    标签: javascript plugins vue.js vuejs2


    【解决方案1】:

    您正在将 $authStorage 添加到 Vue 的 prototype

    Vue.prototype.$authStorage = authStorage
    

    这意味着仅在 Vue 对象的实例上可用(即new Vue(...) 的结果。

    如果您希望$authStorage 可以作为 Vue 的属性而不创建实例,则需要将其添加为静态属性。

    Vue.$authStorage = authStorage
    

    但是,如果是我,我可能会采取不同的方法。我可能会像这样构建 AuthStorage 插件:

    const authStorage = {
        getToken() {
          let token = localStorage.getItem('access_token')
          let expiration = localStorage.getItem('expiration')
          if (!token || !expiration) {
            return null
          }
          if (Date.now() > parseInt(expiration)) {
            this.destroyToken()
            return null
          }
    
          return token
        },
        setToken(accessToken, expiration, refreshToken) {
          localStorage.setItem('access_token', accessToken)
          localStorage.setItem('expiration', expiration + Date.now())
          localStorage.setItem('refresh_token', refreshToken)
        },
        destroyToken() {
          localStorage.removeItem('access_token')
          localStorage.removeItem('expiration')
          localStorage.removeItem('refresh_token')
        },
        isAuthenticated() {
          if (this.getToken()) {
            return true
          } else {
            return false
          }
        },
        install(Vue) {
          Vue.prototype.$authStorage = this
        }
    }
    
    export default authStorage
    

    这将允许我像这样在 Vue 之外 使用它,

    import Vue from 'vue'
    import App from './App'
    import router from './router'
    import AuthStorage from './AuthStorage.js'
    
    Vue.config.productionTip = false
    Vue.use(AuthStorage)
    
    router.beforeEach((to, from, next) => {
      if (to.matched.some(record => record.meta.requireAuth)) {
        if (!AuthStorage.getToken()) {
          next({
            path: '/',
            query: { redirect: to.fullPath }
          })
        } else {
          next()
        }
      } else {
        next()
      }
    })
    

    在 Vue 内部像这样引用它:

    created(){
      let token = this.$authStorage.getToken()
    }
    

    这里是an example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 2017-12-18
      相关资源
      最近更新 更多