2017-06-01 106 views
1

我想基於JSON數據動態創建UI元素,例如:https://facebook.github.io/react-native/docs/picker.html知道調用函數的組件

<Picker 
    selectedValue={this.state.language} 
    onValueChange={(lang) => this.setState({language: lang})}> 
    <Picker.Item label="Java" value="java" /> 
    <Picker.Item label="JavaScript" value="js" /> 
</Picker> 

使用這個樣板我看到兩個問題:

第一:我不能調用該方法的選取器組件區分。有沒有在JavaScript的方式來知道哪個組件稱爲某個功能? (我是JS noob,找不到任何有用的信息)

第二種:selectedValue屬性綁定到狀態。在我創建Picker元素的情況下,我將如何去做這件事。我不想明確地調用每個組件並更新這個屬性,但它現在的工作方式並不是很好。刪除此屬性不會顯示最後選擇的項目,而是顯示列表中最上面的項目。

回答

1

您需要爲每個<Picker>組件的每個值保留狀態。有多種方式可以做到這一點。一種方法是:

<Picker 
    selectedValue={this.state.picker1} 
    onValueChange={(lang) => { 
    let state = this.state; 
    state['picker1'] = val; 
    this.setState(state); 
    }}> 
    <Picker.Item label="Java" value="java" /> 
    <Picker.Item label="JavaScript" value="js" /> 
</Picker> 

示例代碼

import React, { Component } from 'react'; 
import { 
    AppRegistry, 
    StyleSheet, 
    Text, 
    View, 
    TextInput 
} from 'react-native'; 

export default class DemoProject extends Component { 
    constructor(props) { 
    super(props); 
    this.state = {}; 
    } 

    _renderInputs() { 
    const inputCount = 4; 
    const inputs = []; 
    for (let i = 0; i < inputCount; i++) { 
     const stateValueIdentifier = 'text' + i; 
     inputs.push(
     <TextInput 
      style={styles.inputStyle} 
      key={'text-input-' + i} 
      onChangeText={(text) => { 
      let state = this.state; 
      state[stateValueIdentifier] = text; 
      this.setState(state) 
      }} 
      value={this.state[stateValueIdentifier]} 
     /> 
    ) 
    } 
    return inputs; 
    } 

    render() { 
    return (
     <View style={styles.container}> 
     <Text>test</Text> 
     {this._renderInputs()} 
     </View> 
    ); 
    } 
} 

const styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    flexDirection: 'column' 
    }, 
    inputStyle: { 
    height: 40, 
    borderColor: 'gray', 
    borderWidth: 1, 
    flex: 1 
    } 
}); 

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

我動態創建這些組件。我不知道會有多少人。此解決方案與樣板代碼類似,並不能解決我的問題。 – Alex

+0

當你創建它們時,你需要定義一個你可以使用的狀態變量。狀態變量可以動態創建,所以我不明白爲什麼你不能使用這種方法。 – Ismailp

+0

我使用條件呈現基於JSON文件創建它們。創建狀態變量我無法在渲染循環中執行。所以我相信我必須先解析JSON,爲您的解決方案創建狀態變量? – Alex

相關問題