如何解决vue 3中的错误“ this is undefined”

时间:2018-09-28 09:47:27

标签: javascript vue-component vue-router

我已经创建了一个类似于velle的vue组件:

<template>
    <div class="login">
        <h3>Sign in</h3>
        <input type="text" placeholder="Email" v-model="email"/><br>
        <input type="password" placeholder="Password" v-model="password"/><br>
        <button v-on:click="login()">Login</button>
    </div>
</template>

<script>
    import firebase from 'firebase'

    export default {
        name: "Login",
        data: function () {
            return {
                email: '',
                password: ''
            }
        },
        methods: {
            login: function () {
                firebase.auth().signInWithEmailAndPassword(this.email, this.password).then(function (user) {
                    this.$router.replace('home')
                })
            }
        }
    }
</script>

在我输入用户名和密码并单击“登录”,firebase身份验证成功和控制台显示错误(这是未定义的)之前,仍然可以。 我该如何解决这个错误?我不能使用路由器。

4 个答案:

答案 0 :(得分:1)

尝试使用箭头功能:

firebase.auth().signInWithEmailAndPassword(this.email, this.password).then((user) => {
    this.$router.replace('home')
})

答案 1 :(得分:0)

login: function () {
   let vm=this
   firebase.auth().signInWithEmailAndPassword(this.email,  this.password).then(function (user) {
                    vm.$router.replace('home')
                })
            }

答案 2 :(得分:0)

带有then的回调函数没有可用的login函数的上下文。如果您可以使用ES6,请改用箭头功能:

 login: function () {
            firebase.auth().signInWithEmailAndPassword(this.email, this.password).then((user) => {
                this.$router.replace('home')
            })
        }

但是,如果由于某种原因您无法使用ES6,请尝试存储对this的引用,并在函数内部使用它:

 login: function () {
           var self = this;
            firebase.auth().signInWithEmailAndPassword(this.email, this.password).then(function (user) {
                self.$router.replace('home')
            })
        }

答案 3 :(得分:0)

使用箭头函数或bind()方法 示例:

foo().then(() => {
     // access this
})
// or
foo().then(function() {
     // access this
}.bind(this))