2017-05-17 251 views
0

我想從火力傳遞returend參數的狀態PARAM,但我發現這個錯誤的特性「的setState」:陣營+火力地堡:類型錯誤:無法讀取空

App.js:43 Uncaught TypeError: Cannot read property 'setState' of null 

我想將「快照」數組傳遞到「日曆」,然後檢索日曆值,如「calendars.summary」或「calendars.date」(我知道如何做,但問題是我無法將快照分配給日曆)。

componentDidMount() { 
    //setInterval(() => start(this.state.gapi,true), 30000); 
    var rootRef = firebase.database().ref(); 
    var urlRef = rootRef.child("testCalendar/calendars"); 
urlRef.once("value", function(snapshot) { 
    snapshot.forEach(function(child) { 
    console.log(child.key+": "+child.child("summary").val()); 


    }); 
    this.setState({ 
     calendars: snapshot 
    }); 
}); 
    } 

我該如何解決?由於

UPDATE Mayank Shukla'comment後,我能夠做正確傳遞 「快照」:

componentDidMount() { 
    //setInterval(() => start(this.state.gapi,true), 30000); 
    var rootRef = firebase.database().ref(); 
    var urlRef = rootRef.child("testCalendar/calendars"); 
urlRef.once("value", function(snapshot) { 
    snapshot.forEach(function(child) { 
    console.log(child.key+": "+child.child("summary").val()); 

    }); 
    this.setState({ 
     calendars: snapshot 
    }); 
}.bind(this)); 
    } 

componentDidMount() { 
    //setInterval(() => start(this.state.gapi,true), 30000); 
    var rootRef = firebase.database().ref(); 
    var urlRef = rootRef.child("testCalendar/calendars"); 
urlRef.once("value", (snapshot) => { 
    snapshot.forEach(function(child) { 
    console.log(child.key+": "+child.child("summary").val()); 

    }); 
    this.setState({ 
     calendars: snapshot 
    }); 
}); 
    } 

但現在我有這樣的問題:

​​

關於此功能:

_getCalendarsList(){ 
    var d = new Date(); 

    return this.state.calendars.map((calend) => { 
    return (
     <Calendar 
     {...calend} 
     key={d.getTime()} /> 

    ) 
    }); 
    } 
+1

這是一個綁定問題,使用箭頭函數:'urlRef.once(「value」,(snapshot)=> {'解決問題。 –

+0

可能重複的[不能setState內部回調](http://stackoverflow.com/questions/43275845/cannot-setstate-inside-callback) –

+0

@MayankShukla確定它的工作原理,但現在我有這個問題:「TypeError:this.state .calendars.map不是一個函數「快照可能不是一個迭代? –

回答

0

要在任何變量使用map,該變量需要有一個array,你是取在componentDidMount方法的數據,將最初的渲染之後被調用,所以在狀態確認的初始值calendars應該[],像這樣:

constructor(){ 
    super(); 
    this.state = { 
     calendars: [], 
     .... 
    } 
} 

或將支票使用map之前,如果這不是一個array然後return null,像這樣:

_getCalendarsList(){ 
    if(!Array.isArray(this.state.calendars)) 
     return null; 

    var d = new Date(); 

    return this.state.calendars.map((calend) => { 
     return (
      <Calendar 
        {...calend} 
        key={d.getTime()} 
      /> 

     ) 
    }); 
} 
+0

是的初始值,在構造函數中我已經有「this.state = { 日曆:[], GAPI:空 }」 –

+0

這意味着,您所獲取的數據是不一個數組,做'console.log(快照)'一旦你得到響應和檢查,同時顯示結果我。 –

+0

返回一種樹:V {A:O,V:U,g:rc}。我做了一個截圖:[link](https://ibb.co/h9VhmQ) –