将Picker Picker绑定到React Native中的Picker.Item列表

Mic*_*ael 20 javascript react-native

我确定有办法做到这一点,但我还是看不出怎么样.

我想做的是添加一个Picker组件,但不是硬编码项目列表,而是从服务中获取它并让Picker绑定到我以后可以填充的东西.

这是我的,但我的应用程序现在甚至不会运行.有什么想法吗?

'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;
Run Code Online (Sandbox Code Playgroud)

Nad*_*bit 42

您应该将初始状态设置为空数组,然后在componentWillMount或componentDidMount上调用您的服务.我在这里设置了一些与虚拟数据一起使用的东西,并粘贴下面的代码.

'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);
Run Code Online (Sandbox Code Playgroud)

  • 我通过编写自己的循环 `const srvItems = []; 修复了地图错误。for (var i = 0; i &lt; this.state.service.length; i++) { s = this.state.service[i]; srvItems.push(&lt;Picker.Item key={i} value={s} label={s} /&gt;); }` 然后在选择器中写入 `{srvItems}`。然后就像幸福一样工作。 (2认同)

Hil*_*hka 8

重要提示:如果您尝试使用数字数组进行迭代,map请不要忘记应该将 的label属性Picker.Item转换为字符串

const pickerItems = [1,2,3].map(i => (
      <Picker.Item label={i.toString()} value={i} />
));
Run Code Online (Sandbox Code Playgroud)


Abh*_*arg 6

不需要循环,这里我是如何在我的基于本机的项目中做的,类似于上面的答案来动态绑定或添加数据 Picker

import React, {Component} from 'react';
import {Picker,View} from 'react-native';
export default class SampleApp extends Component  {

    constructor(props){
        super(props);
        // HARD CODED DATA , YOU CAN REPLACE THIS DATA  WITH API CALL DATA IN ComponentDidMount() 
       //or in Constructor because countryData is not state.
        this.countryData = ["India","Pakistan","USA"];
        // STATE    
        this.state({
            selectedCountry : null
        });
    }
    // Our country list generator for picker
    countryList = () =>{
        return( this.countryData.map( (x,i) => { 
              return( <Picker.Item label={x} key={i} value={x}  />)} ));
    }
    // RENDER
    render() {
        return (
            <View>
                <Picker
                    selectedValue={this.state.selectedCountry}
                    onValueChange={ (value) => ( this.setState({selectedCountry : value}) )}>
                    { this.countryList() }
                </Picker>
            </View>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

希望你觉得我的例子很容易理解;)