在React Native

时间:2017-04-15 22:29:00

标签: android react-native focus user-input react-native-android

我正在使用React Native构建Android应用。

如何强制TextInput“unFocus”,这意味着光标在文本字段内闪烁。有isFocused()onFocus()的函数,但我如何实际获取文本字段以放弃焦点。一旦我点击进入,你会认为它会自动完成,但事实并非如此。

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

   var SHA256 = require("crypto-js/sha256");

   export default class LoginForm extends Component{


constructor(props){
    super(props);
    this.state = {
        email: '',
        password:''
    };
}

tryLogin = () => {
    if(this.state.email=="email123" && this.state.password == "password"){
        console.log("password verified");
        this.props.navigator.replace({
            title: 'Dashboard'
        });
    }

    console.log(this.state.email);
    console.log(this.state.password);
    console.log("Hash" + SHA256(this.state.password));
}

render(){
    return(
        <View style={styles.container}>
            <TextInput 
                style={styles.input}

                placeholder="Email address" 
                placeholderTextColor="white"
                onChangeText={(email) => this.setState({email})}>
            </TextInput>
            <TextInput style={styles.input} 
                placeholder="Password" 
                placeholderTextColor="white" 
                secureTextEntry
                onChangeText={(password) => this.setState({password})}>
            </TextInput>

            <TouchableOpacity style={styles.loginButtonContainer} onPress={this.tryLogin}>
                <Text style={styles.loginButtonText}>LOGIN</Text>
            </TouchableOpacity>
        </View>
  );
}
}

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

const styles =  StyleSheet.create({
container: {
    padding: 20
},
input:{
    height: 40,
    backgroundColor: '#e74c3c',
    marginBottom: 20,
    color: 'white',
    paddingHorizontal: 15,
    opacity: .9
},
loginButtonContainer:{
    justifyContent: 'center',
    backgroundColor: '#bc4c3c',
    paddingVertical:15

},
loginButtonText:{
    textAlign:'center',
    color:'white',
    fontWeight: '700',
    fontSize: 24

}

   })

对于真实用户来说,这可能无关紧要,但如果我想重新加载,我只是在模仿和讨厌。

6 个答案:

答案 0 :(得分:25)

我认为更好的方法是使用* ScrollView *, Keyboard.dismiss 。当用户点击textInput外部时使用* ScrollView *,键盘被解除。之所以这样做是因为 keyboardShouldPersistTaps ScrollView 默认属性从不。这是用户期望的行为。对于关闭键盘或它等效模糊textInput,当用户点击登录按钮时,将 Keyboard.dismissed()添加到tryLogin函数。

import React, {Component} from 'react';
import { AppRegistry, Text, View, StyleSheet, TextInput, TouchableOpacity, ScrollView, Keyboard}
  from 'react-native';
var SHA256 = require("crypto-js/sha256");

export default class LoginForm extends Component{


  constructor(props){
    super(props);
    this.state = {
      email: '',
      password:''
    };
  }

  tryLogin = () => {
    Keyboard.dismiss();
    if(this.state.email=="email123" && this.state.password == "password"){
      console.log("password verified");
      this.props.navigator.replace({
        title: 'Dashboard'
      });
    }

    console.log(this.state.email);
    console.log(this.state.password);
    console.log("Hash" + SHA256(this.state.password));
  }

  render(){
    return(
      <ScrollView style={styles.container}>
        <TextInput
          style={styles.input}

          placeholder="Email address"
          placeholderTextColor="white"
          onChangeText={(email) => this.setState({email})}>
        </TextInput>
        <TextInput style={styles.input}
                   placeholder="Password"
                   placeholderTextColor="white"
                   secureTextEntry
                   onChangeText={(password) => this.setState({password})}>
        </TextInput>

        <TouchableOpacity style={styles.loginButtonContainer} onPress={this.tryLogin}>
          <Text style={styles.loginButtonText}>LOGIN</Text>
        </TouchableOpacity>
      </ScrollView>
    );
  }
}

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

const styles =  StyleSheet.create({
  container: {
    padding: 20
  },
  input:{
    height: 40,
    backgroundColor: '#e74c3c',
    marginBottom: 20,
    color: 'white',
    paddingHorizontal: 15,
    opacity: .9
  },
  loginButtonContainer:{
    justifyContent: 'center',
    backgroundColor: '#bc4c3c',
    paddingVertical:15

  },
  loginButtonText:{
    textAlign:'center',
    color:'white',
    fontWeight: '700',
    fontSize: 24

  }

})

答案 1 :(得分:14)

您可以使用键盘 API。

import { Keyboard, TextInput } from 'react-native';

<TextInput
  onSubmitEditing={Keyboard.dismiss}
/>

请参阅react native offical document中的完整示例。

答案 2 :(得分:6)

实际上发现它。它看起来并不漂亮,我的直觉说这不是一个非常“反应”的解决方案,但如果你想要它,那就是。

<TextInput 
 style={styles.input} 
 ref="email_input"
 onSubmitEditing={() => this.refs['email_input'].blur()} 
 placeholder="Email address" 
 placeholderTextColor="white"
 onChangeText={(email) => this.setState({email})}/>

答案 3 :(得分:4)

我设法用this.ref引用来解决这个问题。 首先,您为TextInput分配ref,如下所示:

<input ref="myInput" />

然后,从函数

中将blur()方法调用到this.refs.myInput
 blurTextInput(){
    this.refs.myInput.blur()
 }

答案 4 :(得分:2)

我的用例有些不同。用户不会直接在输入字段中输入值。该字段主要用于捕获用户输入值的尝试并改为打开模式。我想在模式关闭后对字段进行模糊处理,以减少用户以后需要做的额外点击。

如果使用钩子,您可以做一些简单的事情

const inputRef = useRef(null);

<Input
  ref={inputRef}
  {...props}
/>

然后在需要的地方调用它。

inputRef.current.blur();

答案 5 :(得分:0)

Noah's answer above效果很好,但是使用字符串引用是now discouraged in React,并且可能很快就会弃用。相反,您应该使用在要引用的组件呈现时调用的回调函数。

<TextInput 
  ref={(c: any) => {
    this.textInputRef = c;
  }}
  onSubmitEditing={() => this.textInputRef.blur()} 
/>

如果您使用的是Flow,则可以通过将以下内容放置在渲染函数之外来指定引用的类型:

textInputRef: ?TextInput;