두 개의 TextInput 필드를 다음과 같이 정의했습니다.
<TextInput
style = {styles.titleInput}
returnKeyType = {"next"}
autoFocus = {true}
placeholder = "Title" />
<TextInput
style = {styles.descriptionInput}
multiline = {true}
maxLength = {200}
placeholder = "Description" />
그러나 키보드에서 “다음”버튼을 누른 후 반응 네이티브 앱이 두 번째 TextInput 필드로 이동하지 않습니다. 어떻게하면 되나요?
감사!
답변
두 번째 설정 TextInput
이전이 초점 TextInput
의 onSubmitEditing
트리거됩니다.
이 시도
-
두 번째 TextInput에 Ref 추가
ref={(input) => { this.secondTextInput = input; }}
-
첫 번째 TextInput 의 onSubmitEditing 이벤트에 포커스 기능을 바인딩 합니다.
onSubmitEditing={() => { this.secondTextInput.focus(); }}
-
키보드 깜박임을 방지하려면 blurOnSubmit을 false로 설정해야합니다.
blurOnSubmit={false}
모든 것이 끝나면 다음과 같이 보일 것입니다.
<TextInput
placeholder="FirstTextInput"
returnKeyType="next"
onSubmitEditing={() => { this.secondTextInput.focus(); }}
blurOnSubmit={false}
/>
<TextInput
ref={(input) => { this.secondTextInput = input; }}
placeholder="secondTextInput"
/>
답변
refs를 사용하지 않고도이 작업을 수행 할 수 있습니다 . 참조는 깨지기 쉬운 코드로 이어질 수 있으므로이 방법이 선호 됩니다. 는 문서의 반작용 가능한 다른 솔루션을 찾아 조언을 :
React로 여러 앱을 프로그래밍하지 않은 경우 일반적으로 첫 번째 성향은 앱에서 “일이 발생하도록”참조를 사용하는 것입니다. 이 경우 잠시 시간을내어 구성 요소 계층에서 상태를 소유해야하는 위치에 대해보다 비판적으로 생각하십시오. 종종 해당 상태를 “소유”하는 적절한 장소가 계층 구조에서 더 높은 수준에 있다는 것이 분명해집니다. 상태를 설정하면 “일을 발생시키기”위해 심판을 사용하려는 욕구가 종종 제거됩니다. 대신 데이터 흐름이 일반적으로 목표를 달성합니다.
대신 상태 변수를 사용하여 두 번째 입력 필드에 초점을 맞 춥니 다.
-
소품으로 전달할 상태 변수를 다음에 추가하십시오
DescriptionInput
.initialState() { return { focusDescriptionInput: false, }; }
-
이 상태 변수를 true로 설정하는 핸들러 메소드를 정의하십시오.
handleTitleInputSubmit() { this.setState(focusDescriptionInput: true); }
-
에 enter / next를 제출 / 타자하면을
TitleInput
호출handleTitleInputSubmit
합니다. 이것은focusDescriptionInput
true로 설정 됩니다.<TextInput style = {styles.titleInput} returnKeyType = {"next"} autoFocus = {true} placeholder = "Title" onSubmitEditing={this.handleTitleInputSubmit} />
-
DescriptionInput
의focus
prop은focusDescriptionInput
상태 변수로 설정됩니다 . 따라서focusDescriptionInput
3 단계에서 변경DescriptionInput
하면으로 다시 렌더링됩니다focus={true}
.<TextInput style = {styles.descriptionInput} multiline = {true} maxLength = {200} placeholder = "Description" focus={this.state.focusDescriptionInput} />
refs는 더 약한 코드로 이어질 수 있기 때문에 refs를 사용하지 않는 좋은 방법입니다. 🙂
편집 : @LaneRettig에 h / t를 추가하여 React Native TextInput을 추가 소품 및 메소드로 감싸서 응답해야한다고 지적했습니다 focus
.
// Props:
static propTypes = {
focus: PropTypes.bool,
}
static defaultProps = {
focus: false,
}
// Methods:
focus() {
this._component.focus();
}
componentWillReceiveProps(nextProps) {
const {focus} = nextProps;
focus && this.focus();
}
답변
React Native 0.36부터 focus()
텍스트 입력 노드에서 (다른 답변에서 제안 된) 호출 은 더 이상 지원되지 않습니다. 대신 TextInputState
React Native 에서 모듈을 사용할 수 있습니다 . 이것을 쉽게하기 위해 다음 도우미 모듈을 만들었습니다.
// TextInputManager
//
// Provides helper functions for managing the focus state of text
// inputs. This is a hack! You are supposed to be able to call
// "focus()" directly on TextInput nodes, but that doesn't seem
// to be working as of ReactNative 0.36
//
import { findNodeHandle } from 'react-native'
import TextInputState from 'react-native/lib/TextInputState'
export function focusTextInput(node) {
try {
TextInputState.focusTextInput(findNodeHandle(node))
} catch(e) {
console.log("Couldn't focus text input: ", e.message)
}
}
그런 다음의 focusTextInput
“ref” 에서 함수를 호출 할 수 있습니다 TextInput
. 예를 들면 다음과 같습니다.
...
<TextInput onSubmit={() => focusTextInput(this.refs.inputB)} />
<TextInput ref="inputB" />
...
답변
래핑 뷰를 바꾸고 TextInput을 가져 오는 것 외에 다른 코드 변경이 필요없는 작은 라이브러리를 만들었습니다.
import { Form, TextInput } from 'react-native-autofocus'
export default () => (
<Form>
<TextInput placeholder="test" />
<TextInput placeholder="test 2" />
</Form>
)
https://github.com/zackify/react-native-autofocus
https://zach.codes/autofocus-inputs-in-react-native/ 에서 자세히 설명합니다.
답변
내가 함수 구성 요소를 사용하여 내 솔루션을 공유 할 줄 알았는데 … ‘ 이 ‘필요하지 않습니다!
React 16.12.0 및 React Native 0.61.5
다음은 내 구성 요소의 예입니다.
import React, { useRef } from 'react'
...
const MyFormComponent = () => {
const ref_input2 = useRef();
const ref_input3 = useRef();
return (
<>
<TextInput
placeholder="Input1"
autoFocus={true}
returnKeyType="next"
onSubmitEditing={() => ref_input2.current.focus()}
/>
<TextInput
placeholder="Input2"
returnKeyType="next"
onSubmitEditing={() => ref_input3.current.focus()}
ref={ref_input2}
/>
<TextInput
placeholder="Input3"
ref={ref_input3}
/>
</>
)
}
나는 몰라, 이것이 누군가를 돕기를 바랍니다 =)
답변
반응 네이티브 0.45.1을 사용하여 사용자 이름 TextInput에서 return 키를 누른 후 암호 TextInput에 포커스를 설정하는 데 문제가 발생했습니다.
여기에서 최고 등급의 솔루션을 대부분 시도한 후 github에서 내 요구를 충족시키는 솔루션을 찾았습니다.
https://github.com/shoutem/ui/issues/44#issuecomment-290724642
그것을 요 약하기:
import React, { Component } from 'react';
import { TextInput as RNTextInput } from 'react-native';
export default class TextInput extends Component {
render() {
const { props } = this;
return (
<RNTextInput
{...props}
ref={(input) => props.inputRef && props.inputRef(input)}
/>
);
}
}
그리고 나는 이것을 다음과 같이 사용합니다 :
import React, {Component} from 'react';
import {
View,
} from 'react-native';
import TextInput from "../../components/TextInput";
class Login extends Component {
constructor(props) {
super(props);
this.passTextInput = null
}
render() {
return (
<View style={{flex:1}}>
<TextInput
style={{flex:1}}
placeholder="Username"
onSubmitEditing={(event) => {
this.passTextInput.focus()
}}
/>
<TextInput
style={{flex:1}}
placeholder="Password"
inputRef={(input) => {
this.passTextInput = input
}}
/>
</View>
)
}
}
답변
RN 0.50.3의 경우 다음과 같은 방법으로 가능합니다.
<TextInput
autoFocus={true}
onSubmitEditing={() => {this.PasswordInputRef._root.focus()}}
/>
<TextInput ref={input => {this.PasswordInputRef = input}} />
이 내용이 표시되어야합니다 .PasswordInputRef. _root .focus ()