为啥我不能在 firebase 'then' 回调中访问 vuejs 'this'? [复制]

Posted

技术标签:

【中文标题】为啥我不能在 firebase \'then\' 回调中访问 vuejs \'this\'? [复制]【英文标题】:Why can't I access vuejs 'this ' within firebase 'then' callbacks? [duplicate]为什么我不能在 firebase 'then' 回调中访问 vuejs 'this'? [复制] 【发布时间】:2018-06-13 06:57:51 【问题描述】:

我正在尝试使用 firebase 向我的 vuejs 应用程序添加身份验证。 注销用户后,应将用户发送回登录页面。我在 HelloWorld.vue 文件的脚本中实现了以下代码:

import firebase from 'firebase'

  export default 
    name: 'HelloWorld',
    data () 
      return 
        msg: 'Welcome to Your Vue.js App'
      
    ,
    methods: 
      logout () 
        firebase.auth().signOut().then(function () 
          this.$router.push('login')
        )
      
    
  

但我从我的 vuejs 开发工具中收到以下错误:

TypeError: this is undefined
[Learn More]
app.js%20line%201954%20%3E%20eval:40:9
logout/<
HelloWorld.vue:37
Pb/e.a</e.g<
auth.js:23
Yb
auth.js:26
Ub
auth.js:26
h.Qb
auth.js:25
Cb
auth.js:19

在firebase回调中引用this对象

这个.$router.push('login')

我需要帮助来弄清楚为什么我不能在回调中访问它以及如何解决这个问题。提前致谢。

【问题讨论】:

【参考方案1】:

你可以使用arrow function 来解决这个问题,因为this 在另一个函数中的作用域不是 vue 实例。

methods: 
  logout () 
    firebase.auth().signOut().then(() =>  // arrow syntax
      this.$router.push('login')
    )
  

我个人更喜欢这个,因为它节省了另一个变量声明。

另一种方法是使用bind(this):

methods: 
  logout () 
    firebase.auth().signOut().then(function ()  
      this.$router.push('login')
    .bind(this)) // bind added.
  

【讨论】:

这确实是一个更好的解决方案 非常感谢...这也适用于使用 on 方法。例如:firebase.database().ref('custom-url').on('value', (snapshot) =&gt; console.log(snapshot); )【参考方案2】:

在函数中,'this' 绑定到函数本身而不是 vue 实例。解决方法:

methods: 
  logout () 
    const that = this      \\ the ES5 var is also possible
    firebase.auth().signOut().then(function () 
      that.$router.push('login')
    )
  

【讨论】:

非常感谢@Imre_G。虽然我仍然无法弄清楚为什么它会抛出“这是未定义的”,即使它指的是函数本身。

以上是关于为啥我不能在 firebase 'then' 回调中访问 vuejs 'this'? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用node.js将数据设置到firebase数据库后,'then'回调出错

为啥我不能以这种方式将数据添加到 Firebase?

为啥最新的 Firebase 服务不能再加载默认凭据

为啥注册用户未在 Firebase 中进行身份验证?为啥用户不能将产品添加到数据库 Firebase?

为啥我的回调不能与 axios 库一起使用?

为啥推送通知不能在 iOS 中使用 Firebase 从设备到设备?