私は一日のソリューションを探していましたが、私は多くを学んだが、何が間違っているのか分からなかった。ここで私がすること:ネイティブで反応しますthis.setState()はフェッチ関数の状態を変更しません
- Appコンストラクタの呼び出し。場合コンポーネントマウント
- 状態ローディング、データソースとデータを初期化、プログラムはのgetData関数は非同期に、データをJSON
- に変換される機能
- フェッチ要求されたURL
- とのgetData関数を呼び出しJSONがクローニングされてwebviewのデータブラブになりました
- 次に、読み込みとデータを変更してsetState関数が呼び出されます。
これは、setStateが起動しない場所です。レンダリングさえできません(それはすべきです)。すべてのチュートリアルでは、すべてのフォーラムで、この方法(およびそれも論理的)であることが示されています。ここで
はコードです:
import Exponent from 'exponent';
import React from 'react';
import {
StyleSheet,
Text,
View,
ListView,
ActivityIndicator
} from 'react-native';
import { Button, Card } from 'react-native-material-design';
import {UnitMenuCard} from './unitmenucard.js';
class App extends React.Component {
constructor(props) {
super(props);
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
loading: true,
dataSource: ds,
data: null
}
}
componentDidMount() {
//console.log('componentDidMount');
this.getData('https://dl.dropboxusercontent.com/u/76599014/testDATA.json');
}
getData(url) {
console.log('loading data');
return fetch(url).then(
(rawData) => {
console.log('parsing data');
//console.table(rawData);
return rawData.json();
}
).then(
(jsonData) =>
{
console.log('parsing to datablobs');
let datablobs = this.state.dataSource.cloneWithRows(jsonData);
console.log('datablobs: ' + datablobs);
return datablobs;
}
).then(
(datablobs) => {
console.log('setting state');
this.setState = ({
loading: false,
data: datablobs
});
console.log('the loading is ' + this.state.loading);
console.log('the data is ' + this.state.data);
}
).catch((errormsg) =>
{console.error('Loading error: ' + errormsg);}
);
}
render() {
console.log('loading is ' + this.state.loading);
var dataToDisplay = '';
if(this.state.loading) {
dataToDisplay = <ActivityIndicator animated={true} size='large' />
} else {
//let jdt = this.state.dataSource.cloneWithRows(this.state.data);
dataToDisplay = <ListView
dataSource={this.state.ds}
renderRow={(unit) => <UnitMenuCard name={unit.name} image={unit.picture} menu={unit.menu}/>}
/>
}
return (
<View style={styles.container}>
{dataToDisplay}
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
},
});
Exponent.registerRootComponent(App);
は、私が何かを逃しましたか?あなたの答えは強力なスタックオーバーフローありがとうございます。
ありがとうございます。出来た。 –