2016-02-14 5 views
7

これを行う方法はあると確信していますが、私はまだどのように見えていません。Picker.ItemをReactネイティブにリストするバインド・ピッカー

ピッカーコンポーネントを追加するのですが、アイテムのリストをハードコードし、サービスからフェッチして、後で取り込めるものにピッカーをバインドしてください。

これは私が持っているものですが、私のアプリは今実行されません。どんなアイデアですか?

'use strict'; 
var React = require('react-native'); 
var { 
    Picker, 
    Text, 
    View 
} = React; 

var AvailableServices = React.createClass({ 
    getInitialState() { 
     var fetchServicesUri = 'http://some.url/available_services'; 
     fetch(fetchServicesUri) 
      .then((response) => response.json()) 
      .then((responseJson) => { 
       console.log(responseJson); 
       var services = []; 
       for(var service in responseJson.services) { 
        services.push(<Picker.Item label={service.Label} value={service.Value}/>); 
       } 
       this.setState({ 
        services: services 
       }); 
      }) 
      .catch((error) => { 
       console.warn(error); 
      }) 
      .done(); 
     return { 
      services: [], 
      selectedService: null 
     } 
    }, 

    render() { 
     return (
      <View> 
       <Text>Pick a service</Text> 
       <Picker 
        selectedValue={this.state.selectedService} 
        onValueChange={(service) => this.setState({selectedService:service})} 
       > 
        {this.state.services} 
       </Picker> 
      </View> 
     ); 
    } 
}); 

module.exports = AvailableServices; 

答えて

21

初期状態を空の配列として設定し、componentWillMountまたはcomponentDidMountでサービスを呼び出してください。ダミーデータhereで動作するものをセットアップし、以下のコードを貼り付けました。

'use strict'; 
var React = require('react-native'); 
var { 
    Picker, 
    Text, 
    View, 
     AppRegistry 
} = React; 

var PickerItem = Picker.Item; 

var SampleApp = React.createClass({ 
    getInitialState() { 
     return { 
      services: ['a', 'b', 'c', 'd', 'e'], 
      selectedService: 'a' 
     } 
    }, 

    componentDidMount() { 
     setTimeout(() => { 
     this.setState({ 
      services: [ 'one', 'two', 'three', 'four', 'five' ] 
     }) 
     }, 3000) 
    }, 

    render() { 
     let serviceItems = this.state.services.map((s, i) => { 
      return <Picker.Item key={i} value={s} label={s} /> 
     }); 

     return (
      <View> 
       <Text>Pick a service</Text> 
       <Picker 
        selectedValue={this.state.selectedService} 
        onValueChange={ (service) => (this.setState({selectedService:service})) } > 

        {serviceItems} 

       </Picker> 
      </View> 
     ); 
    } 
}); 


AppRegistry.registerComponent('SampleApp',() => SampleApp); 
+0

あなたの答えをありがとう - 私はそれを試してきました。私は今このエラーが発生します: "TypeError:未定義は '(this.state.services.map'を評価する)オブジェクトではありません"。返されたJSONをサービス呼び出しからオブジェクトに解析する際の問題です。あなたの例を試して、いくつかのハードコードされた文字を使用するとうまくいきます。ありがとう! – Michael

+0

@Michaelは配列の.mapを呼び出していましたか? –

+0

PickerItemの用途は何ですか?私はそれがどこでも参照されて表示されません。 (私はRNを使い慣れていて、理解しようとしています) – grantwparks