如何在 firebase 中使用 SetState 或函数
How to use SetState or function with firebase
这是我使用 firebase 的 React 项目的代码,我从早上就被困在这个问题中请帮助我 plzzz
constructor (){
super()
this.state = {Message : false}
this.Navigate = this.Navigate.bind(this)
CompLoad = true
var i = firebase.auth().currentUser.uid
firebase.database().ref('users/' + i + '/inbox').limitToLast(1)
.on('value' , function (x){
if (CompLoad === false){
var data = x.val()
alert(JSON.stringify(data))
R = 'Inbox'
this.Navigate()
}
if (CompLoad === true){
CompLoad = false
}
})
}
它给我错误:-
TypeError: Cannot read property 'Navigate' of null
导航功能
Navigate = () => {
this.context.router.history.push('/' + R)
}
如果我用 setState 替换 Navigate
this.setState({
Message : true
})
反应说:
TypeError: Cannot read property 'setState' of null
这是不可访问的单元,除非你绑定它或使用箭头功能。
改成箭头函数
firebase.database().ref('users/' + i + '/inbox').limitToLast(1)
.on('value' , (x) => {
if (CompLoad === false){
var data = x.val()
alert(JSON.stringify(data))
R = 'Inbox'
this.Navigate()
}
if (CompLoad === true){
CompLoad = false
}
})
}
或绑定
firebase.database().ref('users/' + i + '/inbox').limitToLast(1)
.on('value' , function (x){
if (CompLoad === false){
var data = x.val()
alert(JSON.stringify(data))
R = 'Inbox'
this.Navigate()
}
if (CompLoad === true){
CompLoad = false
}
}.bind(this));
}
您的回调函数正在更改 this
的上下文,它不再是 class
。
使用 arrow function 获取词法上下文:
.on('value' , (x) => {
....
或者暂时把this
的值保持在回调上面使用:
// outside the callback in the constructor
const that = this;
// inside the callback
.on('value' , function (x){
that.Navigate()
您应该更改此回调以使用词法作用域
.on('value' , function (x){
...
到
.on('value' , (x) => {
...
上查看更多内容
首先,您应该在构造函数中分配 属性 not 变量:
示例:
CompLoad = true // incorrect
this.CompLoad = true // correct
其次,你不应该在构造函数中使用setState
。
第三,要在您的函数中访问父上下文 this
,您可以使用 bind or use arrow function.
最后,如果您想执行 api 操作并设置状态,那么您应该使用 componentDidMount
lifecycle method 并从那里调用 api 和根据需要更新状态。
这是我使用 firebase 的 React 项目的代码,我从早上就被困在这个问题中请帮助我 plzzz
constructor (){
super()
this.state = {Message : false}
this.Navigate = this.Navigate.bind(this)
CompLoad = true
var i = firebase.auth().currentUser.uid
firebase.database().ref('users/' + i + '/inbox').limitToLast(1)
.on('value' , function (x){
if (CompLoad === false){
var data = x.val()
alert(JSON.stringify(data))
R = 'Inbox'
this.Navigate()
}
if (CompLoad === true){
CompLoad = false
}
})
}
它给我错误:-
TypeError: Cannot read property 'Navigate' of null
导航功能
Navigate = () => {
this.context.router.history.push('/' + R)
}
如果我用 setState 替换 Navigate
this.setState({
Message : true
})
反应说:
TypeError: Cannot read property 'setState' of null
这是不可访问的单元,除非你绑定它或使用箭头功能。
改成箭头函数
firebase.database().ref('users/' + i + '/inbox').limitToLast(1)
.on('value' , (x) => {
if (CompLoad === false){
var data = x.val()
alert(JSON.stringify(data))
R = 'Inbox'
this.Navigate()
}
if (CompLoad === true){
CompLoad = false
}
})
}
或绑定
firebase.database().ref('users/' + i + '/inbox').limitToLast(1)
.on('value' , function (x){
if (CompLoad === false){
var data = x.val()
alert(JSON.stringify(data))
R = 'Inbox'
this.Navigate()
}
if (CompLoad === true){
CompLoad = false
}
}.bind(this));
}
您的回调函数正在更改 this
的上下文,它不再是 class
。
使用 arrow function 获取词法上下文:
.on('value' , (x) => {
....
或者暂时把this
的值保持在回调上面使用:
// outside the callback in the constructor
const that = this;
// inside the callback
.on('value' , function (x){
that.Navigate()
您应该更改此回调以使用词法作用域
.on('value' , function (x){
...
到
.on('value' , (x) => {
...
上查看更多内容
首先,您应该在构造函数中分配 属性 not 变量:
示例:
CompLoad = true // incorrect
this.CompLoad = true // correct
其次,你不应该在构造函数中使用setState
。
第三,要在您的函数中访问父上下文 this
,您可以使用 bind or use arrow function.
最后,如果您想执行 api 操作并设置状态,那么您应该使用 componentDidMount
lifecycle method 并从那里调用 api 和根据需要更新状态。