我正在尝试创建一个密码保护的屏幕。屏幕将使用4个数字输入作为密码。
我的方法是创建一个TextInput组件,并在主屏幕中调用它4次。
我遇到的问题是,当我键入上一个TextInput的值时,TextInput不会关注下一个。
我正在为所有PasscodeTextInput组件使用refs(我被告知这是一个遗留方法,但我不知道任何其他方法,唉)。
***尝试过此方法(没有创建自己的组件),也没有成功。***方法
- 索引. ios. js**
import React, { Component } from 'react';
import { AppRegistry, TextInput, View, Text } from 'react-native';
import { PasscodeTextInput } from './common';
export default class ProgressBar extends Component {
render() {
const { centerEverything, container, passcodeContainer, textInputStyle} = styles;
return (
<View style={[centerEverything, container]}>
<View style={[passcodeContainer]}>
<PasscodeTextInput
autoFocus={true}
ref="passcode1"
onSubmitEditing={(event) => { this.refs.passcode2.focus() }} />
<PasscodeTextInput
ref="passcode2"
onSubmitEditing={(event) => { this.refs.passcode3.focus() }} />
<PasscodeTextInput
ref="passcode3"
onSubmitEditing={(event) => { this.refs.passcode4.focus() }}/>
<PasscodeTextInput
ref="passcode4" />
</View>
</View>
);
}
}
const styles = {
centerEverything: {
justifyContent: 'center',
alignItems: 'center',
},
container: {
flex: 1,
backgroundColor: '#E7DDD3',
},
passcodeContainer: {
flexDirection: 'row',
},
}
AppRegistry.registerComponent('ProgressBar', () => ProgressBar);
- 密码文本输入. js**
import React from 'react';
import {
View,
Text,
TextInput,
Dimensions
} from 'react-native';
const deviceWidth = require('Dimensions').get('window').width;
const deviceHeight = require('Dimensions').get('window').height;
const PasscodeTextInput = ({ ref, autoFocus, onSubmitEditing, onChangeText, value}) => {
const { inputStyle, underlineStyle } = styles;
return(
<View>
<TextInput
ref={ref}
autoFocus={autoFocus}
onSubmitEditing={onSubmitEditing}
style={[inputStyle]}
maxLength={1}
keyboardType="numeric"
placeholderTextColor="#212121"
secureTextEntry={true}
onChangeText={onChangeText}
value={value}
/>
<View style={underlineStyle} />
</View>
);
}
const styles = {
inputStyle: {
height: 80,
width: 60,
fontSize: 50,
color: '#212121',
fontSize: 40,
padding: 18,
margin: 10,
marginBottom: 0
},
underlineStyle: {
width: 60,
height: 4,
backgroundColor: '#202020',
marginLeft: 10
}
}
export { PasscodeTextInput };
- 更新1**
- 索引. ios. js**
import React, { Component } from 'react';
import { AppRegistry, TextInput, View, Text } from 'react-native';
import { PasscodeTextInput } from './common';
export default class ProgressBar extends Component {
constructor() {
super()
this.state = {
autoFocus1: true,
autoFocus2: false,
autoFocus3: false,
autoFocus4: false,
}
}
onTextChanged(t) { //callback for immediate state change
if (t == 2) { this.setState({ autoFocus1: false, autoFocus2: true }, () => { console.log(this.state) }) }
if (t == 3) { this.setState({ autoFocus2: false, autoFocus3: true }, () => { console.log(this.state) }) }
if (t == 4) { this.setState({ autoFocus3: false, autoFocus4: true }, () => { console.log(this.state) }) }
}
render() {
const { centerEverything, container, passcodeContainer, testShit, textInputStyle } = styles;
return (
<View style={[centerEverything, container]}>
<View style={[passcodeContainer]}>
<PasscodeTextInput
autoFocus={this.state.autoFocus1}
onChangeText={() => this.onTextChanged(2)} />
<PasscodeTextInput
autoFocus={this.state.autoFocus2}
onChangeText={() => this.onTextChanged(3)} />
<PasscodeTextInput
autoFocus={this.state.autoFocus3}
onChangeText={() => this.onTextChanged(4)} />
<PasscodeTextInput
autoFocus={this.state.autoFocus4} />
</View>
</View>
);
}
}
const styles = {
centerEverything: {
justifyContent: 'center',
alignItems: 'center',
},
container: {
flex: 1,
backgroundColor: '#E7DDD3',
},
passcodeContainer: {
flexDirection: 'row',
},
}
AppRegistry.registerComponent('ProgressBar', () => ProgressBar);
8条答案
按热度按时间v9tzhpje1#
TextInput有一个defaultProp,可以在组件安装后聚焦。
自动对焦
如果为true,则将输入集中在componentDidMount上,默认值为false。有关详细信息,请阅读相关文档。
更新
在
componentDidUpdate
之后,它将不能正常工作。在这种情况下,可以使用ref
以编程方式聚焦。xoefb8l82#
因为
ref
是special props中的一个,所以不能使用这种方式将ref
转发到<TextInput>
。因此,调用this.refs.passcode2
将返回<PasscodeTextInput>
。尝试更改以下内容以从
<TextInput>
获取ref
。然后,将
<PasscodeTextInput>
中的inputRef
分配给一个变量,并使用focus()
切换焦点(从RN0.41.2
开始,它还未被弃用)。P. S:X11M11N1X防止在试图清除旧密码并输入新密码时切换焦点。
yb3bgrhw3#
我们用不同的方法处理这种类型的屏幕。
我们没有管理4个单独的TextInput并处理每个TextInput之间的焦点导航(然后在用户删除字符时返回),而是在屏幕上使用单个TextInput,但宽度不可见(即0 px x 0 px),其中包含焦点、maxLength和键盘配置等。
这个TextInput接受用户的输入,但实际上不能被看到,因为每个字符都被键入,我们将输入的文本呈现为一系列简单的视图/文本元素,样式与上面的屏幕非常相似。
这种方法对我们来说很有效,不需要管理“下一个”或“上一个”TextInput要关注的内容。
w8ntj3qf4#
您可以使用Jason所说的focus方法
onChangeText
,此外,添加maxLength={1}
可以使您立即跳转到下一个输入,而无需检查添加了什么。(刚刚注意到它的deprecated,但这仍然是我解决问题的方法,在v0.36之前应该可以正常工作,并且link解释了您应该如何更新这个deprecated函数)。请注意,我对refs的使用也被弃用了,但我只是复制了代码,因为我可以向您保证,这在当时是有效的(希望现在也能有效)。
最后,这种类型实现的主要问题是,一旦你尝试用退格键删除一个数字,你的焦点就会跳到下一个数字,导致严重的用户体验问题。然而,你可以监听退格键输入,然后执行一些不同的操作,而不是关注下一个输入。所以如果你选择使用这种类型的实现,我会在这里留下一个link供你进一步研究。
以前描述的问题的破解方案:如果你在做任何事情之前检查
onChangeText
prop中输入的内容,如果值是number,你可以跳到下一个输入,否则(这是一个退格键),跳回去。(我刚刚想到这个主意,还没有尝试过。)wgeznvg75#
我认为问题是
onSubmitEditing
是当你按下普通键盘上的“回车”或“回车”键时...键盘上没有这样的按钮。假设希望每个输入只有一个字符,可以查看
onChangeText
,然后检查text的长度是否为1,如果长度确实为1,则调用focus。3gtaxfhh6#
m3eecexj7#
我用这个代码来解决:常量验证代码:ReactFC =({通过,完成时})=〉{
我在所有输入中放置了一个ref,当onKeyPress触发时,函数验证是否必须返回或转到下一个输入
k2arahey8#
通过删除autoFocus={true}并设置超时解决了这个问题。我有一个弹出窗口作为功能组件,并使用“current.focus()”,引用如下: