将焦点自动更改为 react native 中的下一个 TextInput
Posted
技术标签:
【中文标题】将焦点自动更改为 react native 中的下一个 TextInput【英文标题】:Change the focus automatically to the next TextInput in react native 【发布时间】:2018-08-08 06:15:37 【问题描述】:我正在开发一个带有本机反应的应用程序。我有如下三个 TextInput 框:
如果用户插入数字,我需要自动更改 TextInput 框的焦点。然后,一旦他/她插入最后一个数字,就应该执行一个函数。
这是我的代码:
<View style=styles.squareContainer>
<View style=styles.square>
<TextInput
onChangeText=(oldPassword) => this.setState(oldPassword)
style=flex:1
ref="1"
keyboardType='numeric'
style=styles.inputText
maxLength = 1
underlineColorandroid='rgba(0,0,0,0)'
numberOfLines=1
secureTextEntry=true
onSubmitEditing=() => this.focusNextField('2')
/>
</View>
<View style=styles.square>
<TextInput
style=flex:1
ref="2"
onChangeText=(oldPassword) => this.setState(oldPassword)
keyboardType='numeric'
maxLength = 1
style=styles.inputText
underlineColorAndroid='rgba(0,0,0,0)'
numberOfLines=1
secureTextEntry=true
onSubmitEditing=this.maxLength?1:() => this.focusNextField('3')
/>
</View>
<View style=styles.square>
<TextInput
style=flex:1
ref="3"
onChangeText=(oldPassword) => this.setState(oldPassword)
returnKeyType='next'
keyboardType='numeric'
style=styles.inputText
underlineColorAndroid='rgba(0,0,0,0)'
numberOfLines=1
secureTextEntry=true
/>
</View>
</View>
换句话说,例如如果用户想要插入 153,他/她应该在第一个 TextInput 中插入 1,然后光标和焦点应该自动替换到下一个 TextInput,她/他可以插入 5,最后通过将焦点和光标移动到第三个TextInput,他/她可以插入3。一旦他插入3,我需要执行this.triggerFunction()
。
如您所见,我尝试使用以下技巧,但没有成功:
onSubmitEditing=this.maxLength?1:() => this.focusNextField('3')
你能帮我解决这个问题吗?提前致谢。
【问题讨论】:
【参考方案1】:您必须将光标对准您希望光标转到的TextInput
。为此,您可以将maxLength
设置为1
,并调用onChangeText
更改焦点。
您可能还想捕获value
并将其存储在状态中。
您应该使用的另一件事是使用单词或字符作为参考。这些将被称为对象和数字可能有点令人困惑。即ref='input_1'
而不是ref='1'
<TextInput
style=flex:1
ref="input_1"
keyboardType='numeric'
style=styles.inputText
maxLength = 1
value=this.state.value
underlineColorAndroid='rgba(0,0,0,0)'
numberOfLines=1
secureTextEntry=true
onChangeText=value =>
this.setState( value )
if (value) this.refs.input_2.focus(); //assumption is TextInput ref is input_2
/>
【讨论】:
完美!有效!这是一个聪明而简短的回答。我投了赞成票并将其标记为正确答案!谢谢。 :)【参考方案2】:已回答的问题肯定是有益的,但我的 es-lint
抛出一个错误,说使用字符串或者 this.refs 已被贬值
所以这就是我所做的,在构造函数中创建 refs(可能这就是 react 建议的方式)。在我的情况下,我想要 4 个文本输入框
constructor(props)
super(props)
this.keyboardHeight = new Animated.Value(0)
this.num1 = React.createRef()
this.num2 = React.createRef()
this.num3 = React.createRef()
this.num4 = React.createRef()
然后像这样渲染组件
<View style=styles.inputBoxes>
<TextInput
ref=this.num1
style=styles.textInput
onChangeText=number => this.inputNumber(number, 1)
value=this.state.num1
keyboardType="numeric"
numberOfLines=1
/>
<TextInput
ref=this.num2
style=styles.textInput
onChangeText=number => this.inputNumber(number, 2)
value=this.state.num2
keyboardType="numeric"
numberOfLines=1
/>
<TextInput
ref=this.num3
style=styles.textInput
onChangeText=number => this.inputNumber(number, 3)
value=this.state.num3
keyboardType="numeric"
numberOfLines=1
/>
<TextInput
ref=this.num4
style=styles.textInput
onChangeText=number => this.inputNumber(number, 4)
value=this.state.num4
keyboardType="numeric"
numberOfLines=1
/>
</View>
请注意 TextInput 中的 refs。在我的 onChange 中,我传递了一个标志,告诉this.inputNumber
是哪个按钮
这就是我的inputNumber
函数的样子
inputNumber(value, flag)
const completeFlag = `num$flag`
this.setState([completeFlag]: value)
flag = flag + 1
if (flag < 5 && value)
const nextFlag = `num$flag`
const textInputToFocus = this[nextFlag]
textInputToFocus.current.focus()
【讨论】:
【参考方案3】:对于原生基础,需要进行微小的更改。 它使用 getRef 而不是 ref。以下代码将在文本更改时更改为下一个输入字段,并在您删除输入时恢复为上一个字段。
<Item floatingLabel style=width:30,borderColor:"black" >
<Input
style=flex:1
getRef=input => this.input_1 = input;
keyboardType='numeric'
maxLength = 1
numberOfLines=1
onChangeText=value =>
this.setState( value )
if (value) this.input_2._root.focus(); //assumption is next TextInput ref is input_2
/>
</Item>
<Item floatingLabel style=width:30>
<Input
style=flex:1
getRef=input => this.input_2 = input;
keyboardType='numeric'
maxLength = 1
numberOfLines=1
onChangeText=value =>
this.setState( value )
if (value) this.input_3._root.focus(); else this.input_1._root.focus() ; //assumption is next TextInput ref is input_3
/>
</Item>
【讨论】:
以上是关于将焦点自动更改为 react native 中的下一个 TextInput的主要内容,如果未能解决你的问题,请参考以下文章
React-Native:将焦点设置到由数组构建的自定义组件
如何在 react-native android 应用程序中单击时将铃声模式更改为静音/响铃/振动?
自动焦点属性在 React Native 的文本输入组件中不起作用
如何在expo react native App中将api级别29更改为30
textFieldShouldReturn 无法在 swift 3 中将焦点从一个文本字段更改为另一个文本字段
当我从 main.m 更改为 appdegelegate.swift 时,React-native IOS 应用程序在启动时变为空白