2016-08-28 21 views
5

Làm cách nào tôi có thể đặt trạng thái bên trong thành phần phản ứng?setState với Firebase Promise trong React

`ve có thông báo lỗi:

Uncaught TypeError: Cannot read property 'setState' of null

đây là danh sách mã thành phần:

class MessageList extends React.Component { 
constructor(props){ 
super(props); 
this.state = { 
    messages: [] 
}; 

var firebaseRef = firebase.database().ref(); 
firebaseRef.once('value') 
    .then(function(dataSnapshot) { 
     this.setState({ 
     messages: messages 
     }); 
    }); 
} 

render() { ... } 

} 
+0

Excuse me, @ benjamin-gruenbaum, nhưng tôi có nghĩa là lý do tại sao tôi couldnt lấy dữ liệu từ các căn cứ hỏa lực, và không phải về "này" từ khóa –

+0

Lỗi của bạn là do từ khóa 'this' này. Tôi có thể đóng này là không đầy đủ hoặc như là một bản sao - vì lợi ích của bạn và vì lợi ích của khách truy cập trong tương lai tôi nghĩ rằng nó tốt hơn để đóng này như là một bản sao. –

Trả lời

11

này được đề cập đến lời hứa phạm vi. Hoặc sử dụng chức năng mũi tên chất béo (es6)

var firebaseRef = firebase.database().ref(); 
firebaseRef.once('value') 
    .then((dataSnapshot) => { 
     this.setState({ 
     messages: messages 
     }); 
    }); 

Hoặc tạo một bản sao của điều này trước khi sự hứa hẹn

constructor(props){ 
super(props); 
this.state = { 
    messages: [] 
}; 
var that = this; 
var firebaseRef = firebase.database().ref(); 
firebaseRef.once('value') 
    .then(function(dataSnapshot) { 
     that.setState({ 
     messages: messages 
     }); 
}); 

Một lựa chọn cuối cùng, bạn có thể liên kết này với lời hứa:

firebaseRef.once('value') 
.then(function(dataSnapshot) { 
    this.setState({ 
     messages: messages 
    }); 
}).bind(this) 
+0

Điều này hoạt động rất tốt. Cảm ơn bạn. – Neela

2

Lúc đầu, tôi muốn đề nghị bạn tìm nạp dữ liệu firebase ban đầu trong vòng đời componentDidMount thành phần và sửa chữa setState của bạn vấn đề mà bạn có thể làm theo mã dưới đây vào nơi mà tôi đã thay đổi chỉ dòng self = this;,

class MessageList extends React.Component { 
constructor(props){ 
super(props); 
this.state = { 
    messages: [] 
}; 

componentDidMount() { 
var self = this; 
var firebaseRef = firebase.database().ref(); 
    firebaseRef.once('value') 
    .then(function(dataSnapshot) { 
    self.setState({ 
     messages: messages 
    }); 
    }); 
} 
} 

render() { ... } 

} 
Các vấn đề liên quan