質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

Q&A

解決済

1回答

4778閲覧

axiosで取得してきたデータをsetStateできない

dialbird

総合スコア379

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

0グッド

0クリップ

投稿2017/11/25 02:25

編集2017/11/25 04:52

axiosでDBからデータの取得自体はできているのに、いざそれをsetStateしようとしても、どういうわけかデータが入ってくれません

追記:ListViewのDataSourceを実行する位置が原因で、エラーが発生していたことはわかりました。
ですが今度は、肝心のListViewがなぜかレンダリングされないのです。

ListViewの要素である、ListItemには情報は渡ってきているのですが、どういうわけかまっさらなままレンダーされないのです

js

1// Screen.js 2import React from 'react'; 3import { 4 Text, 5 View 6} from 'react-native'; 7import { List } from '../common'; 8 9class Screen extends React.Component { 10 render() { 11 return ( 12 <View> 13 <List /> 14 </View> 15 ); 16 } 17} 18 19export default Screen;

js

1// List.js 2import React from 'react'; 3import { ListView } from 'react-native'; 4import axios from 'axios'; 5import ListItem from './ListItem'; 6 7class List extends React.Component { 8 constructor() { 9 super(); 10 this.state = { datas: [] }; 11 12 // こっちにdataSourceを置く 13 this.dataSource = new ListView.DataSource({rowHasChanged: (r1, r2) => r1!==r2}); 14 } 15 16 componentWillMount() { 17 // 以前はstateに直接ds.cloneWithRowsしたデータを入れていたが、それでは失敗することがわかったので移動 18 19  // const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); 20 //axios.get('http://path/to/api/v1/users') 21 // .then((res)=>{ 22 // this.setState({ datas: ds.cloneWithRows(res.data) }); 23 // // 帰ってきたユーザーデータが表示される 24 // console.log(JSON.stringify(res.data)); 25 // // stateが変わってない 26 // console.log(this.state); 27 // }) 28 // .catch((e)=>console.log(`axios get error: ${e.message}`)); 29 30  // 修正したコード 31 axios.get('http://lala.work/api/v1/users') 32 .then((res)=>this.setState({ datas: res.data })) 33 .catch((e)=>console.log(`axios get error: ${e.message}`)); 34 } 35 36 renderRow(user) { 37  return <ListItem user={user}/>; 38 } 39 40 render() { 41 return ( 42 <ListView 43     enableEmptySections 44 dataSource={this.dataSource.cloneWithRows(this.state.datas)} 45 renderRow={this.renderRow} 46 /> 47 ); 48 } 49} 50 51export default List;

js

1// ListItem.js 2 3import React from 'react'; 4import { 5 Text 6} from 'react-native'; 7 8class ListItem extends React.Component { 9 render() { 10 // データは入っている 11 console.log(this.props.user.name); 12 13 return ( 14 <Text>{this.props.user.name}</Text> 15 ); 16 } 17} 18 19export default ListItem;

どなたかListViewが出ない理由をご存知の方お願いできないでしょうか?
よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、ds.cloneWithRows(res.data)の値がちゃんと取れているかも確認し、仮に値が確認出来るのであれば、componentWillUpdate(nextProps, nextState)で、nextState.dataSourceの値を確認してみてはいかがでしょう?おそらく、nextState.dataSourceではAPIからのレスポンスデータをもとにセットした値が確認出来ると思いますので、あとは、render内でthis.state.dataSourceのlengthチェックをするなりして、出力する値を分岐させてあげれば良いのではないでしょうか?(って、lengthを参照するとエラーが出るのでしたっけ。)

とりあえず、componentWillMountが実行された後に走るrenderメソッド内では、まだ、PromiseがResolvedされていないため、this.state.dataSourceの値はAPIからのレスポンスデータにはなっていません。(非同期処理なのでタイムラグが生まれます)

投稿2017/11/25 04:27

HayatoKamono

総合スコア2415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dialbird

2017/11/25 04:42 編集

HayatoKamonoさん ややこしい質問にも関わらず、ご返答ありがとうございます! これを書いている最中に、ふとシミュレーターの、リストが出ていてほしい箇所をスワイプしてみたら、リストが出てきました! どうやらスワイプがなんかのきっかけになっているようですが、やはり依然として初期状態は何も表示されません。 これはおっしゃられているcomponentWillUpdateとかを駆使しなければならないのでしょうか?
HayatoKamono

2017/11/25 04:49

this.state.datasってなんですか?タイプミスでしょうか?
dialbird

2017/11/25 04:53

失礼しました! 新しくthis.dataSourceを作成したので、stateの中身をそれと被らないdatasに変えたのでした
dialbird

2017/11/25 05:16

探し求めていた結果、こちらのページで最後の解決策を見つけました! https://github.com/react-community/react-navigation/issues/1238 出ないのはScrollViewのバグ?らしいので、removeClippedSubviewsをfalseにすることでとりあえず解決しました! HayatoKamonoさん ご協力をありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問