Javascript 通过Vue计算调用Vue方法时出现问题
我相信这个问题通常与JS有关,而不是VueJS。但是我有下面的Vue方法,它返回Firebase调用并返回请求的对象。这是有效的:Javascript 通过Vue计算调用Vue方法时出现问题,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,我相信这个问题通常与JS有关,而不是VueJS。但是我有下面的Vue方法,它返回Firebase调用并返回请求的对象。这是有效的: methods: { getSponsor (key) { db.ref('businesses').child(key).on('value', snap => { console.log(snap.val()) return snap.val() }) } } [对象] 现在,当我从计算属性调用此方法时,它
methods: {
getSponsor (key) {
db.ref('businesses').child(key).on('value', snap => {
console.log(snap.val())
return snap.val()
})
}
}
[对象]
现在,当我从计算属性调用此方法时,它会导致未定义
:
computed: {
sponsor () {
console.log(this.getSponsor(key))
return(this.getSponsor(key))
}
}
未定义
为什么会这样?这是因为我如何返回我的方法吗?当您调用异步操作时,您将从函数上下文中退出,这意味着您无法从回调函数返回将在主函数中返回的值 问题的解决方案是从回调函数中设置
数据中的一个属性(首先声明它),然后在计算属性中获取该属性的值
computed: {
sponsor () {
return(this.sponsor)
}
}
methods: {
getSponsor (key) {
let self = this;
db.ref('businesses').child(key).on('value', snap => {
console.log(snap.val())
self.sponsor = snap.val()
})
}
}
如果在计算属性中调用getSonsor
,它将运行两次,一次在初始化过程中,一次在发起人
属性更改时运行
因为我猜您只需要运行一次,或者在事件中运行一次,所以您可以在beforCreate
/mounted
等上运行它。。根据您的需要get赞助商
不返回任何内容。它只是执行一些异步代码。啊,有道理。所以为了修复它,我需要将getspor
中的代码转换成一个函数并返回该函数?抱歉,我对JS的理解有点不够。太棒了,我将其移动到挂载
,并在Vue实例上声明了数据
,它可以工作。非常感谢。次要nit:此时的计算属性是多余的。否则,我喜欢它@BertEvans您是对的,但可能他想对值进行转换,发起人
计算的值实际上会导致“超出最大调用堆栈大小”错误,因为它正在返回自身。