Je construis une Android app avec React Native.
Comment pouvez-vous forcer un TextInput
à "unFocus", ce qui signifie que le curseur clignote à l'intérieur du champ de texte. Il y a des fonctions pour isFocused()
et onFocus()
, mais comment puis-je obtenir que le champ de texte abandonne le focus. Vous penseriez que cela se fait automatiquement dès que je frappe, mais ce n'est pas le cas.
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
}
})
Cela n'importera probablement pas autant pour les vrais utilisateurs, mais je ne fais que l'imiter et c'est embêtant si je veux recharger.
Je pense qu'une meilleure façon est d'utiliser * ScrollView *, Keyboard.dismiss. En utilisant * ScrollView * lorsque l'utilisateur appuie en dehors de textInput, le clavier est désactivé. C'est fait parce que ScrollView la propriété par défaut de keyboardShouldPersistTaps est jamais. C'est le comportement attendu par l'utilisateur. Pour ignorer le clavier ou son équivalent, le texte est flou. Lorsque l'utilisateur appuie sur le bouton de connexion, ajoutez Keyboard.dismissed () à la fonction 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
}
})
Vous pouvez utiliser une API de clavier .
import { Keyboard, TextInput } from 'react-native';
<TextInput
onSubmitEditing={Keyboard.dismiss}
/>
S'il vous plaît voir l'exemple complet dans réagir document officiel natif .
Je ne l'ai pas aussi jolie et, selon mon intuition, ce n'est pas une solution très efficace, mais si vous le voulez ici, c'est le cas.
<TextInput
style={styles.input}
ref="email_input"
onSubmitEditing={() => this.refs['email_input'].blur()}
placeholder="Email address"
placeholderTextColor="white"
onChangeText={(email) => this.setState({email})}/>
J'ai réussi à résoudre cela avec cette référence. Tout d'abord, vous affectez à TextInput un ref
, comme ceci:
<input ref="myInput" />
Ensuite, vous appelez la méthode blur () à this.refs.myInput
d'une fonction
blurTextInput(){
this.refs.myInput.blur()
}
La réponse de Noé ci-dessus fonctionne bien, mais l'utilisation de la référence de chaîne est maintenant déconseillée dans React , et sera probablement obsolète bientôt. Au lieu de cela, vous devez utiliser une fonction de rappel appelée lorsque le composant que vous souhaitez référencer rend.
<TextInput
ref={(c: any) => {
this.textInputRef = c;
}}
onSubmitEditing={() => this.textInputRef.blur()}
/>
Si vous utilisez Flow, vous pouvez ensuite spécifier le type de votre référence en plaçant quelque chose comme ceci en dehors de votre fonction de rendu:
textInputRef: ?TextInput;