【问题标题】:Vuejs share library with multiple componentsVuejs 与多个组件共享库
【发布时间】:2017-10-29 18:06:10
【问题描述】:

我将 Vue 与 Firebase 一起使用。我正在使用以下代码进行初始化

索引.vue

import Firebase from 'firebase';
import User from './User';


export default {
    components: {
        User
    },
    data() {
        return {
            users: []
        }
    },
    mounted() {
        let firebase = Firebase.initializeApp({
            apiKey: "blablabla",
        });

        firebase.database().ref('users').on('child_added', (snapshot) => {
            this.users.unshift(user);
        });
    }
}

这一切都很好。现在在另一个组件中,当我想将新实体保存到 Firebase 时,我运行几乎相同的代码来初始化库。

创建.vue

import Firebase from 'firebase';

export default {
    data() {
        return {
            name: '',
            tagid: ''
        }
    },
    methods: {
        createUser() {

            let firebase = Firebase.initializeApp({
                apiKey: "blablabla",
            });

            firebase.database().child('users').push({
                name: this.name,
                tagid: this.tagid
            });
        }
    }
}

现在显然我遇到了一个错误,这也是重复的工作。但我想知道。

如何与所有需要它的组件共享 Firebase 插件的初始化?

谢谢!

【问题讨论】:

    标签: javascript firebase vue.js


    【解决方案1】:

    只是不要在组件中初始化它,而是在 Vue 实例中并将其作为 prop 传递给组件。或者把它放在 Vuex 中。

    <div id="app">
      <component :fb="instance"></component>
    </div>
    
    <template id="component">
      ...
    </component>
    
    <script>
      Vue.component('comp-one', {
        template: '#comp-one',
        props: ['fb'],
        methods: {
          createUser () {
            this.fb.database().child('users').push({
              name: this.name,
              tagid: this.tagid
            })
          }
        }
      })
    
      new Vue({
        el: '#app',
        data: {
          instance: null
        },
        created () {
          this.instance = Firebase.initializeApp({
            apiKey: "blablabla"
          })
        }
      })
    </script>
    

    所以,在 main.js 中编辑这个:

    new Vue({
      template: '<App/>'
    })
    

    到这里:

    new Vue({
      template: '<App/>',
      data: {
        instance: null
      },
      created () {
        this.instance = Firebase.initializeApp({
          apiKey: "blablabla"
        })
      }
    })
    

    别忘了给html添加prop:

    <my-component :fb="instance">
    

    在组件定义中:

    import Firebase from 'firebase';
    
    export default {
      props: ['fb'],
      data () {
        return {
          name: '',
          tagid: ''
        }
      },
      methods: {
        createUser() {
          this.fb.database().child('users').push({
            name: this.name,
            tagid: this.tagid
          })
        }
      }
    }
    

    然后对所有使用 firebase 的组件重复此操作。

    【讨论】:

    • 在我的 main.js 中,我使用的是新的 Vue({template: ''})。我是否需要传递其他内容,因为我的 app.vue 中找不到 fb。谢谢!
    • @Notflip 你在用 Vuex 吗?
    • 不。我没有,有必要吗?
    • @Notflip 不需要,但更好。等等,我编辑答案。
    • Vue js 插件是这里的一个选项。 firebase 已经有一个:github.com/vuejs/vuefire。 vuejs 文档包含一个基于此插件的示例:vuejs.org/v2/examples/firebase.html
    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多