在React Native

时间:2016-09-19 11:19:02

标签: android react-native

我是React Native的新人。

我使用两个按钮在视图中添加TextInput组件。 当我按Add按钮时,它会将一个TextInput组件推入视图中,当我按下Add Again按钮时,它会将另一个TextInput组件推送到前一个组件下方。

但是当我再次按下Add按钮时,它会将TextInput组件推到第一个组件下方。但是我想把它推到最后一个之下。

赞:Add |Add | Add again.

但我需要Add | Add Again | Add等等。

可以做些什么来实现这个目标? 我跟着this

'use strict';

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

let index = 0 

class Test extends Component{
constructor(){
super();
this.state = {
  arr: []
};
}
insertSomeThing(){
this.state.arr.push(index++)
this.setState({ arr: this.state.arr })
}

render() {
let arr = this.state.arr.map((r, i) => {
    return (
      <View key={ i } style={styles.insertStyle}>
        <TextInput placeholder = 'abc' />
      </View>
      );
})
let arrAnother = this.state.arr.map((r, i) => {
    return (
      <View key={ i } style={styles.insertStyle}>
        <TextInput placeholder = 'def' />
      </View>
      );
})

return (
  <View style={styles.container}>
  <View>
    <TouchableHighlight 
      onPress={ this.insertSomeThing.bind(this) } 
      style={styles.button}>
        <Text>Add</Text>
    </TouchableHighlight>
  </View>
  <View>
    <TouchableHighlight 
      onPress={ this.insertSomeThing.bind(this) } 
      style={styles.button}>
        <Text>Add Again</Text>
    </TouchableHighlight>
  </View>
  { arr }
  {arrAnother}
  </View>
);
}
}

var styles = StyleSheet.create({
  container: {
flex: 1,
marginTop: 60,
  }, 
  insertStyle: {
height:40,
alignItems: 'center',
justifyContent: 'center',
borderBottomColor: '#ededed',
borderBottomWidth: 1
  },
  button: {
alignItems: 'center',
justifyContent: 'center',
height:55,
backgroundColor: '#ededed',
marginBottom:10
  }
});

AppRegistry.registerComponent('Test', () => Test);

1 个答案:

答案 0 :(得分:1)

问题是您正在调用insertSomeThing函数,此函数会在变量<Text>中推送新的arr,然后按以下顺序呈现:

</View>
    { arr }
    {arrAnother}
</View>

如果要在列表末尾插入不同的TextView,则必须删除{arrAnother}并修改地图功能。您的代码将如下所示:

insertSomeThing( placeholder ){
  this.state.arr.push({index:index++, placeholder:placeholder});
  this.setState({ arr: this.state.arr });
}

render() {
  let arr = this.state.arr.map((r, i) => {
    return (
      <View key={ i } style={styles.insertStyle}>
        <TextInput placeholder = {r.placeholder} />
      </View>
    );
  });

  return (
    <View style={styles.container}>
      <View>
        <TouchableHighlight 
          onPress={ () => this.insertSomeThing('add') } 
          style={styles.button}>

          <Text>Add</Text>
        </TouchableHighlight>
      </View>
      <View>
        <TouchableHighlight 
          onPress={ () => this.insertSomeThing('addAgain') } 
          style={styles.button}>
             <Text>Add Again</Text>
        </TouchableHighlight>
      </View>
      { arr }
    </View>
  );
}

修改

要处理onChangeText,您的TextInput将如下所示:

let arr = this.state.arr.map((r, i) => {

    var ref = 'textinput'+i;

    return (
      <View key={ i } style={styles.insertStyle}>
        <TextInput ref={ref} onChangeText={(text) => this._onChangeText(text,ref)} />
      </View>
    );
  });

您必须在组件中定义_onChangeText来处理事件。您将收到文本并参考输入。您稍后可以使用this.refs[ref]引用输入。