反応ネイティブでアプリを開発しています。以下の3つの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を挿入し、最後にフォーカスを移動できます。 3番目のTextInputにカーソルを合わせると、3を挿入できます。3を挿入するとすぐに、this.triggerFunction()
を実行する必要があります。ご覧のとおり、次のトリックを使用しようとしましたが、うまくいきませんでした。
_onSubmitEditing={this.maxLength?1:() => this.focusNextField('3')}
_
この問題の解決を手伝ってくれませんか。前もって感謝します。
カーソルを移動するTextInput
にフォーカスする必要があります。これを行うには、maxLength
を1
に設定し、onChangeText
を呼び出してフォーカスを変更します。 value
を取得して状態に保存することもできます。
もう1つ、参照に単語または文字を使用する必要があります。これらはオブジェクトとして呼び出されるので、番号を呼び出すのは少し紛らわしいかもしれません。つまり、ref={'input_1'}
の代わりにref={'1'}
<TextInput
onChangeText={(oldPassword) => this.setState({oldPassword})}
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
}}
/>
ネイティブベースの場合、マイナーな変更が必要です。 refではなくgetRefを使用しています。次のコードは、テキストが変更されると次の入力フィールドに変わり、入力を削除すると前のフィールドに戻ります。
<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>
答えられた質問は間違いなく有益でしたが、私のes-lint
は、文字列の使用またはthis.refsが廃止されたことを示すエラーをスローしていました
これが私がしたことです、コンストラクタで参照を作成します(おそらくこれがどのように反応するかを示唆しています)。私の場合、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内のここでの参照に注意してください。私の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()
}
}