javascript - Vue 中路由后未定义 auth0 变量

标签 javascript vue.js vuejs2 vue-router auth0

我正在尝试在同事度假时将 Auth0 添加到他的 Vue 应用程序中,但我正在努力创建可重用的导航栏。

我按照教程完成了大部分设置:https://www.storyblok.com/tp/how-to-auth0-vuejs-authentication

我的main.js

import Vue from 'vue'
import App from './App.vue'
import BootstrapVue from 'bootstrap-vue'
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'
import router from './router'
import Vuex from 'vuex'
import store from './Store'
import 'vue-awesome/icons'
import icon from 'vue-awesome/components/Icon'
import auth from './auth/auth'
import meta from 'vue-meta'

Vue.config.devtools = true;
Vue.config.productionTip = false;
Vue.config.errorHandler = function(err, vm, info) {
    console.log("error: " + err);
    console.log("error info: " + info);
};
Vue.use(BootstrapVue);
Vue.use(Vuex);
Vue.use(auth);
Vue.use(meta)

Vue.component('icon', icon);

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

我的App.vue:

<template>
    <b-container>
        <div id="app">
            <navbar/>
            <router-view/>
        </div>
    </b-container>
</template>

<script>
import WidgetBuilder from './components/WidgetBuilder/WidgetBuilder'
import Navbar from './components/NavBar.vue'

export default {
    name: 'app',
    components: {
        Navbar: Navbar,
        WidgetBuilder: WidgetBuilder
    }
}
</script>

我的导航栏:

<template>
  <nav class="navbar navbar-dark bg-dark">
    <a class="navbar-brand" href="/home">
      <img src="https://a.storyblok.com/f/39898/1024x1024/dea4e1b62d/vue-js_logo-svg.png" width="40" height="40">
    </a>
    <div>
      <img :src="$auth.user.picture" width="30" height="30">
      <span class="text-muted font-weight-light px-2">{{$auth.name}}</span>
      <button type="button" class="btn btn-outline-secondary btn-sm" @click="$auth.logout()">Logout</button>
    </div>
  </nav>
</template>

<script>
  export default {
      name: "navbar",
      mounted() {
          console.log(this.$router.params.auth)
      },
  }
</script>

我的回调:

<template>
  <div class="callback"></div>
</template>

<script>
    export default {
        name: 'callback',
        metaInfo: {
            title: 'Callback',
        },
        mounted() {
            // eslint-disable-next-line
            this.$auth.handleAuthentication().then((data) => {
                this.$router.push({ name: 'index' })
            })
        }
    }
</script>

问题是,登录和重定向后我的导航栏无法访问 $auth 对象。

控制台:

error: TypeError: Cannot read property 'picture' of null

main.js?1c90:18 error info: render

main.js?1c90:17 error: TypeError: Cannot read property 'name' of null

main.js?1c90:18 error info: render

如果我直接访问/home,它就可以正常工作。

我并不是一个真正的 JS 开发者,ES6 的东西也可能是阿拉伯语的,你们中的任何 vue 专家都给我指出了正确的方向吗?

我尝试像这样从组件传递变量:

<template>
    <b-container>
        <div id="app">
            <navbar :auth="$auth"/>
            <router-view/>
        </div>
    </b-container>
</template>

我尝试将服务导入到我的导航栏组件中(尽管这让我很恼火)

我尝试了不同的重定向、重新身份验证、使用 Mounted() 和 data() 在导航栏组件中重新安装它。

我确信这很简单,但我很抓狂,因为正如我所说,此刻它对我来说完全陌生。

最佳答案

我也遵循了教程并遇到了同样的问题。

由于导航栏组件位于我的 App.vue 中,而不是在我的 home 组件中,我发现工具栏是在 auth0 的响应设置为 localStorage 之前渲染的(因此第二次加载刷新有效)。将导航栏组件移动到主页组件内解决了问题,但这对我来说并不理想。

我按照类似的堆栈溢出问题的建议使用了事件总线方法 -

Re-render navigation bar after login on vuejs

auth.js

   user: {
  get: function() {
    return JSON.parse(localStorage.getItem('user'))
  },
  set: function(user) {
    localStorage.setItem('user', JSON.stringify(user))
    this.$bus.$emit('logged', 'User logged')
  }
}

导航栏.vue

data() {
  user: this.getUser() 
}
created () { 
    this.$bus.$on('logged', () => { 
        this.user = this.getUser() 
    }) 
}, 
methods: {   
getUser: function () { 
  var user = JSON.parse(localStorage.getItem('user')); 
  if (user === null) { 
    return '' 
  } else { 
    return user 
  } 
} 

},

不是最干净的解决方案,但它对我有用。

关于javascript - Vue 中路由后未定义 auth0 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708024/

相关文章:

javascript - JWplayer 6 和图像叠加视频的奇怪问题

javascript - 如何从 PHP 文件中获取 JSON 数据以在 html 文件中打印

javascript - 计算数组中有多少数据并递增javascript

twitter-bootstrap - BootstrapVue 垂直对齐内容的最佳方式?

javascript - 选择 radio 时,更改 vue.js version2 上的图像 src

javascript - 如何选择具有(任何)类的所有元素

typescript - 如何使用 TypeScript 在 Vue.js 中使用 Provide/Inject

javascript - Vue.js 在替换列表上的转换

javascript - 如何使用不和谐机器人返回变量

javascript - 带有 webpack 的简单 Vue.js