我肯定有办法做到这一点,但我只是不知道怎么做.

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

以下是我的情况,但我的应用程序现在甚至无法运行.有什么 idea 吗?

'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;

推荐答案

您可能应该将初始状态设置为空数组,然后在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);

React-native相关问答推荐

在原生react 中更改图像源URI时闪烁

'无法解析模块.安装react-native-pager-view后的实用程序/平台

原生react :顶部的滑块位置

什么是 expoClientId?

不能总是在 Chrome 中设置 React Native 断点

应用程序主体尚未注册

如何在 react native 中以 redux 形式设置隐藏字段?

在 create-react-native-app 元素中突然看到错误Plugin/Preset files are not allowed to export objects, only functions

使用 .env 变量在 react-native 应用程序上设置 appcenter

文本在 android 中被截断以响应本机

@react-navigation/stack 与 @react-navigation/native-stack 有什么区别?

通过带有对象子对象的数组react native 映射 - 与react网络中的工作方式不同?

Yarn 在哪里存储离线包?

如何在android studio中导入react native元素

React Native:文本 node 的 Auto宽度

如何构建一个 react-native 应用程序,以便它在 ipad 上作为 ipad 应用程序运行?

react-native 开始给出 Invalid 正则表达式无效错误

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

如何定义react-native应用程序的入口点

无法在react-native中分配给# 的只读属性props