如何进行反应原生输入,为用户提供验证状态反馈.[有效,印刷,错误,编辑]

Nik*_*kos 5 android ios react-native

我希望有一个输入在用户输入时不断更新,然后失去焦点.反馈将是输入的边界.

1 Green: when valid
2 Amber: when typing and is in error state (Green when valid)
3 Red: when in error state and unfocused
4 Nothing: when input is pristine (not touched and empty)
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?

理想情况下,这适用于iOS和Android.

Nad*_*bit 7

TextInput有两个函数可用于实现此目的:

onBlur onChangeText

要在TextInput上动态设置样式,可以为bordercolor附加变量,如下所示:

<TextInput
  onBlur={ () => this.onBlur() }
  onChangeText={ (text) => this.onChange(text) }
  style={{ borderColor: this.state.inputBorder, height: 70, backgroundColor: "#ededed", borderWidth: 1 }} />
Run Code Online (Sandbox Code Playgroud)

然后,通过正则表达式或模式匹配器传递onChangeText函数的结果,以实现您尝试实现的任何结果.

我在这里设置了一个工作项目,检查是否有空格,并抛出你想要的错误.您可以将其编辑并进行编辑,以更加具体地满足您的需求,但基本前提应该相同.我还将下面的代码放在实现该功能的工作项目中:

'use strict';

var React = require('react-native');
var {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  TextInput
} = React;

var SampleApp = React.createClass({

  getInitialState: function() {
    return {
        inputBorder: '#eded',
      defaultVal: ''
    }
  },

  onBlur: function() {
    console.log('this.state.defaultVal', this.state.defaultVal)
    if(this.state.defaultVal.indexOf(' ') >= 0) {
        this.setState({
        inputBorder: 'red'
      })
    }
  },

  onChange: function(text) {
    this.setState({
        defaultVal: text
    })
    if(text.indexOf(' ') >= 0) {
        this.setState({
        inputBorder: '##FFC200'
      })
    } else {
        this.setState({
        inputBorder: 'green'
      })
    }
  },

  render: function() {
    return (
      <View style={styles.container}>
        <View style={{marginTop:100}}>
            <TextInput
            onBlur={ () => this.onBlur() }
            onChangeText={ (text) => this.onChange(text) }
            style={{ height: 70, backgroundColor: "#ededed", borderWidth: 1, borderColor: this.state.inputBorder }} />
        </View>
        <View style={{marginTop:30}}>
            <TextInput 
          style={{ height: 70, backgroundColor: "#ededed" }} />
        </View>
      </View>
    );
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,  
  }
});

AppRegistry.registerComponent('SampleApp', () => SampleApp);
Run Code Online (Sandbox Code Playgroud)