0

我一直在尝试设置一个简单的应用程序来测试一些 Vue.js 功能,并且我一直在这里和那里找到一些关于基本 CRUD 实现的有趣教程。

几天以来,我一直坚持做一些不同的事情,这里简单描述一下我试图实现的目标:

  • 设置一个显示名字和姓氏的主页。
  • 在firebase中将名字和姓氏存储为字符串
  • 只需在屏幕上显示两个字符串
  • 稍后允许登录用户编辑字符串(这不是我的问题的一部分,但与解释为什么我需要将这两个字段存储在 Firebase 中有关)

我已经研究过一个带有登录管理的小型架构,用于登录/退出状态的不同菜单,诸如此类。

所以我已经在 Firebase 中进行了设置: Firebase 配置

然后这里是我的核心文件:

main.js

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import firebase from 'firebase'
import VueFire from 'vuefire'
import { store } from './store/store'

let app
let config = {
  apiKey: '######',
  authDomain: '######',
  databaseURL: '######',
  projectId: '######',
  storageBucket: '######',
  messaginSenderId: '######'
}

firebase.initializeApp(config)
firebase.auth().onAuthStateChanged(function (user) {
  if (!app) {
    /* eslint-disable no-new */
    app = new Vue({
      el: '#app',
      store: store,
      router,
      template: '<App/>',
      components: { App }
    })
  }
})

export const db = firebase.database()
export const homeContent = db.ref('homeContent')

Vue.config.productionTip = false

索引.js

import Vue from 'vue'
import Router from 'vue-router'

import HelloWorld from '@/components/HelloWorld'
import Test from '@/components/Test'
import Login from '@/components/Login'
import SignUp from '@/components/SignUp'
import firebase from 'firebase'
import VueFire from 'vuefire'

Vue.use(Router)
Vue.use(VueFire)

let router = new Router({
  routes: [
    {
      path: '*',
      redirect: '/login'
    },
    {
      path: '/',
      redirect: '/login'
    },
    {
      path: '/login',
      name: 'Login',
      component: Login
    },
    {
      path: '/test',
      name: 'Test',
      component: Test,
      meta: {
        requiresAuth: true
      }
    },
    {
      path: '/sign-up',
      name: 'SignUp',
      component: SignUp
    },
    {
      path: '/hello-world',
      name: 'HelloWorld',
      component: HelloWorld,
      meta: {
        requiresAuth: true
      }
    }
  ]
})

router.beforeEach((to, from, next) => {
  let currentUser = firebase.auth().currentUser
  let requiresAuth = to.matched.some(record => record.meta.requiresAuth)

  if (requiresAuth && !currentUser) next('/login')
  else if (!requiresAuth && currentUser) next()
  else next()
})

export default router

应用程序.vue

<template>
  <div id="app">
    <div v-if="user">Logged in</div>
    <div v-else>NOT logged in</div>
    <Navigation></Navigation>
    <button id="btLogout" v-if="user" v-on:click="logout">Déconnexion</button>
    <img class="logo" src="./assets/logo.png">
    <router-view/>
  </div>
</template>

<script>

// Register Navbar component
import Navigation from './components/Nav.vue'
import firebase from 'firebase'

export default {
  computed: {
    user () {
      return this.$store.getters.getUser
    }
  },
  components: {
    'Navigation': Navigation
  },
  methods: {
    logout: function () {
      firebase.auth().signOut().then(() => {
        this.$store.dispatch('clearUser')
        this.$router.replace('login')
      })
    },
    setUser: function () {
      this.$store.dispatch('setUser')
    }
  },
  created () {
    // when the app is created run the set user method
    // this uses Vuex to check if a user is signed in
    // check out mutations in the store.js file
    this.setUser()
  }
}

</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}

.logo {
  width: 50px;
  height: auto;
  clear: both;
  display: block;
  margin: 30px auto 0;
}

#btLogout {
  clear: both;
  display: inline-block;
}
</style>

测试.vue

<template>
  <div class="homeScreen">
    <p v-bind:key="homeContent['.key']" v-for="firstName of homeContent">{{ homeContent.firstName }}</p>
    <p v-bind:key="homeContent['.key']" v-for="lastName of homeContent">{{ homeContent.lastName }}</p>
    <img src="../assets/annonce_motw.jpg">
  </div>
</template>

<!-- Javascript -->
<script>
import firebase from 'firebase'
import db from "../main"

export default {
  data () {
    return {
      db: ''
    }
  },
  firebase: {
    homeContent: {
      source: db.ref('homeContent'),
      asObject: true
    }
  },
  methods: {
    setHomeName (key) {
      // homeName.child(key).update({ edit: true })
    }
  },
  created () {

  }
}
</script>

<!-- SASS styling -->
<style scoped>
</style>

所以我在这里。我被卡住的部分是,每次我尝试在 Test.vue 中添加db.ref ( 'homeContent') 行时,控制台都会返回 db 未定义。

我也想不出在解决控制台问题后如何简单地输出存储的字符串。

那么我做错了什么?:D

感谢并提前为您带来的每一个帮助!干杯!

4

1 回答 1

0

线

export const db = firebase.database()

在完成执行之前firebase.initializeApp(config)执行,因此它将是未定义的。

解决这个问题的一种方法是将初始化的 Firebase 对象放在 Vue 原型上:

Vue.prototype.$firebase = Firebase.initializeApp(config)

然后,在您的任何组件中,例如 Test.vue,您可以像这样引用 Firebase 对象:

firebase: {
  homeContent: {
    source: this.$firebase.database().ref('homeContent'),
    asObject: true
  }
},

一个警告:这仅在您知道 Firebase 完成初始化后创建 Vue 应用程序时才有效。您通过将new Vue()语句放入firebase.auth().onAuthStateChanged()main.js 中正确地做到了这一点,因此您将保证在您this.$firebase的任何组件中都有一个初始化的 Firebase 对象可供您使用。

于 2018-03-12T11:57:51.297 回答