我正在使用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
}
})
对于真实用户来说,这可能无关紧要,但如果我想重新加载,我只是在模仿和讨厌。
答案 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;