初めて質問させていただきます。
最近,React.jsを勉強し始めたのですが、setStateメソッドの部分で'setState' of nullというエラーが出てしまい、全く先に進めなくなってしまいました。
Reactについて詳しい方にご教授いただければと思います。
開発環境: React.js + Firebase
databaseには、firebaseを使っており、ここからデータを読み込んで、Stateのtweetsに値を格納したいと思っております。格納できれば解決するのですが、どうしてもわかりません。
コードは以下です。
このコードで、componentDidMount()のthis.setStateの部分でエラーが起きてしまいます。
エラー文は以下です。
error
1Uncaught TypeError: Cannot read property 'setState' of null
React.js
1<!DOCTYPE html> 2<html> 3<head> 4 <meta charset="UTF-8"> 5 <meta lang="ja"> 6 <link rel="stylesheet" type="text/css" href="css/style.css"> 7 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script> 8 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script> 9 <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.34/browser.min.js"></script> 10 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script> 11 <script src="https://www.gstatic.com/firebasejs/4.6.2/firebase.js"></script> 12</head> 13 14<body> 15 <div id="tweet"></div> 16 17 <script type="text/babel"> 18 // Initialize Firebase 19 var config = { 20 ********非表示にしています****** 21 }; 22 firebase.initializeApp(config); 23 24 var firebaseRef = firebase.database().ref(); 25 var tweetsRef = firebaseRef.child("tweets"); 26 27 // メインツイート画面 28 class TweetContainer extends React.Component{ 29 30 constructor(props) { 31 super(props); 32 this.state = {tweets: [ 33 { id: 1, user: 'Tom', text: 'Good morning' }, 34 { id: 2, user: 'John', text: 'Good afternoon' }, 35 { id: 3, user: 'Emily', text: 'Good evening' } 36 ]}; 37 console.log("initialized"); 38 39 this.componentDidMount = this.componentDidMount.bind(this); 40 } 41 42 componentDidMount(){ 43 tweetsRef.on("value", function(snapshot){ 44 this.setState({ //エラー部分 45 tweets: snapshot.val() 46 }); 47 }); 48 } 49 50 render(){ 51 var tweetItems = this.state.tweets.map(function(tweet){ 52 return ( 53 <TweetItem tweet={tweet} /> 54 ); 55 }); 56 57 return( 58 <div className="tweetContainer"> 59 {tweetItems} 60 <TweetForm /> 61 </div> 62 ); 63 } 64 } 65 66 //ツイートアイテム 67 class TweetItem extends React.Component{ 68 constructor(props) { 69 super(props); 70 } 71 72 render(){ 73 return( 74 <div className="tweetItem"> 75 <div className="tweet">{this.props.tweet.text}</div> 76 </div> 77 ); 78 } 79 } 80 81 //送信フォーム 82 class TweetForm extends React.Component{ 83 constructor(props) { 84 super(props); 85 this._onClick = this._onClick.bind(this); 86 } 87 88 _onClick(e){ 89 tweetsRef.push({ 90 text: ReactDOM.findDOMNode(this.refs.inputValue).value 91 }); 92 } 93 94 render(){ 95 return( 96 <div className="tweetForm"> 97 <input ref="inputValue" type="text" placeholder="message..." /> 98 <input type="button" value="送信" onClick={this._onClick.bind(this)}/> 99 </div> 100 ); 101 } 102 } 103 104 //レンダリング 105 ReactDOM.render( 106 <TweetContainer />, 107 document.getElementById("tweet") 108 ); 109 </script> 110 111</body> 112</html> 113
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/26 12:56
2017/11/26 13:03
2017/11/26 18:47