네이티브 반응 :“다음”키보드 버튼을 누른 후 다음 TextInput을 선택하는 방법?


202

두 개의 TextInput 필드를 다음과 같이 정의했습니다.

<TextInput 
   style = {styles.titleInput}
   returnKeyType = {"next"}
   autoFocus = {true}
   placeholder = "Title" />
<TextInput
   style = {styles.descriptionInput}          
   multiline = {true}
   maxLength = {200}
   placeholder = "Description" />

그러나 키보드에서 "다음"버튼을 누른 후 반응 네이티브 앱이 두 번째 TextInput 필드로 이동하지 않습니다. 어떻게하면 되나요?

감사!


Mitch의 답변 (현재 세 번째 답변)은 v0.42에서 작동합니다.
로렌스

React v16.8.0이상인 사람들 에게는 @Eli Johnson이 맨 아래에 제공 한 답변을 추천합니다. React는 ref아래 솔루션에서 제공되는 많은 용도를 사용하지 않습니다 .
thedeg123

답변:


333

두 번째 설정 TextInput이전이 초점 TextInputonSubmitEditing트리거됩니다.

이 시도

  1. 두 번째 TextInput에 Ref 추가
    ref={(input) => { this.secondTextInput = input; }}

  2. 첫 번째 TextInput 의 onSubmitEditing 이벤트에 포커스 기능을 바인딩 합니다.
    onSubmitEditing={() => { this.secondTextInput.focus(); }}

  3. 키보드 깜박임을 방지하려면 blurOnSubmit을 false로 설정해야합니다.
    blurOnSubmit={false}

모든 것이 끝나면 다음과 같이 보일 것입니다.

<TextInput
    placeholder="FirstTextInput"
    returnKeyType="next"
    onSubmitEditing={() => { this.secondTextInput.focus(); }}
    blurOnSubmit={false}
/>

<TextInput
    ref={(input) => { this.secondTextInput = input; }}
    placeholder="secondTextInput"
/>

53
언급 할 가치가있는 것은 그 onSubmitEditing콜백은 blur이벤트 후에 호출 된다는 것 입니다. 따라서 다음 요소에 즉시 집중하면 키보드가 미쳐 버릴 수 있습니다. 따라서 blurOnSubmit={false}모든 요소를 ​​양식 으로 설정 하고 true마지막 요소를 그대로두면 완료 버튼이 마지막 입력을 흐리게 할 수 있습니다.
e1dar

9
v0.36부터는 더 이상 작동하지 않습니다. 컴포넌트에는 "포커스"방법이 없습니다. 지금 어떻게해야합니까?
Mitch

4
@Mitch는 0.40.0에서 잘 작동합니다. 실행중인 버전의 버그 일 수 있습니다.
vikki

3
RN 0.49를 사용하면 blurOnSubmit={false}키보드 깜박임을 방지하기 위해 추가 하면 작동이 중지됩니다.
nabil london

13
하게 관리 할 수있는 누군가를 위해 focus일을, 당신이 래퍼 사용하지 않는 수 있도록 TextInput구성 요소를. CustomTextInput랩 구성 요소 가있는 경우 예상대로 작동하도록 해당 구성 요소에 흐림 및 초점 방법 TextInput을 구현해야합니다 TextInput.
Cihad Turhan

65

refs를 사용하지 않고도이 작업을 수행 할 수 있습니다 . 참조는 깨지기 쉬운 코드로 이어질 수 있으므로이 방법이 선호 됩니다. 는 문서의 반작용 가능한 다른 솔루션을 찾아 조언을 :

React로 여러 앱을 프로그래밍하지 않은 경우 일반적으로 첫 번째 성향은 앱에서 "일이 발생하도록"참조를 사용하는 것입니다. 이 경우 잠시 시간을내어 구성 요소 계층에서 상태를 소유해야하는 위치에 대해보다 비판적으로 생각하십시오. 종종 해당 상태를 "소유"하는 적절한 장소가 계층 구조에서 더 높은 수준에 있다는 것이 분명해집니다. 상태를 설정하면 "일을 발생시키기"위해 심판을 사용하려는 욕구가 종종 제거됩니다. 대신 데이터 흐름이 일반적으로 목표를 달성합니다.

대신 상태 변수를 사용하여 두 번째 입력 필드에 초점을 맞 춥니 다.

  1. 소품으로 전달할 상태 변수를 다음에 추가하십시오 DescriptionInput.

    initialState() {
      return {
        focusDescriptionInput: false,
      };
    }
  2. 이 상태 변수를 true로 설정하는 핸들러 메소드를 정의하십시오.

    handleTitleInputSubmit() {
      this.setState(focusDescriptionInput: true);
    }
  3. 에 enter / next를 제출 / 타자하면을 TitleInput호출 handleTitleInputSubmit합니다. 이것은 focusDescriptionInputtrue로 설정 됩니다.

    <TextInput 
       style = {styles.titleInput}
       returnKeyType = {"next"}
       autoFocus = {true}
       placeholder = "Title" 
       onSubmitEditing={this.handleTitleInputSubmit}
    />
  4. DescriptionInputfocusprop은 focusDescriptionInput상태 변수로 설정됩니다 . 따라서 focusDescriptionInput3 단계에서 변경 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(); 
    }

2
@LaneRettig 당신이 완전히 옳습니다. 지적 해 주셔서 감사합니다. 우리는 RN TextInput을 추가 된 소품과 메소드로 포장합니다. 추가 된 부분의 답변 하단을보고 추가 문제가 있으면 알려주세요!
Stedman Blake

4
멋있는. 이것을 RN에 PR로 제출해야합니다. 이것이 이미 지원되지 않는 것에 놀랐습니다.
Lane Rettig

8
키보드에서 다음을 클릭 한 다음 첫 번째 입력을 직접 클릭하면 어떻게됩니까? 초점은 해당 솔루션 나쁜 경험이다 둘째로 돌아갑니다
표트르

3
나는이 솔루션을 좋아하지 않습니다. 특히 5-6 요소의 약간 더 긴 형태에는 잘 맞지 않기 때문에 각 요소의 상태에서 포커스 부울이 필요하고 그에 따라 모두 관리해야합니다.
davidgoli

9
흥미롭게도 문서에는 다음과 같은 설명이 있습니다. "참조에 대한 몇 가지 유용한 사용 사례가 있습니다 : 초점, 텍스트 선택 또는 미디어 재생 관리 ..."따라서 텍스트 입력에 초점을 맞추기 위해 참조를 사용하면 도구를 올바르게 사용할 수 있습니다. .
노아 앨런

26

React Native 0.36부터 focus()텍스트 입력 노드에서 (다른 답변에서 제안 된) 호출 은 더 이상 지원되지 않습니다. 대신 TextInputStateReact 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" />
...

1
훌륭하게 작동하지만 누구나 redux 형식을 사용하면 이와 같은 작업을 수행해야합니다. <Field ... onSubmitEditing={() => focusTextInput(this._password)} />그리고 심판은 이렇게해야합니다<Field ... withRef refName={e => this._password = e}/>
tarkanlar

1
이 작업을 수행하기 위해 'onSubmitEditing'을 사용해야했지만 훌륭한 해결책은 아닙니다.
Adam Jakiela

3
0.42에서 잘 작동합니다.
로렌스

1
@tarkanlar 솔루션에 대한 코드 스 니펫을 공유 할 수 있습니까?
Redux

2
calling focus() on a text input node isn't supported any more=> 대담한 주장, 출처? 호출 focus()v0.49.5와 좋은 작품을 + TextInputState동안 문서화되어 있지 않습니다 focus()blur()언급 : facebook.github.io/react-native/releases/next/docs/...
tanguy_k

21

래핑 뷰를 바꾸고 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/ 에서 자세히 설명합니다.


이 결과를 달성하기위한 탁월한 패턴. 사용 편의성 관점에서 최고의 답변이어야합니다. 사용자 정의 FormInput (TextInput 확장명)을 쉽게 편집하여 양식 입력에 계속 작동하는 것처럼 보입니다. 추가 예를 들어 귀하의 답변에 포함시켜 주시겠습니까?
Jack Robson

확실한! 알아요 ... 나는 이것에 관한 다른 인기있는 게시물에 이것을 게시했지만 중복 문제가 발생했습니다. 이 문제가 얼마나 성가 신지 알기 때문에 도와 주려고 노력하고 있습니다 !!
zackify

이것은 서로 많은 TextInputs가있는 경우 훌륭하지만 그 사이에 스타일을 추가하려면 세분화됩니다. 기여해 주셔서 감사합니다.
GenericJam

코드를 자유롭게 조정하십시오. 텍스트 입력이 아닌 요소를 건너 뛸 수있는 방법을 만들 수 있다고 확신합니다. 너무 힘들어서는 안됩니다.
zackify

1
이것은 프로덕션 RN@0.47.2를 위해 구축되지 않습니다
Phil Andrews

18

내가 함수 구성 요소를 사용하여 내 솔루션을 공유 할 줄 알았는데 ... ' '필요하지 않습니다!

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}
      />
    </>
  )
}

나는 몰라, 이것이 누군가를 돕기를 바랍니다 =)


1
작동하지 않는. undefined는 _this2.ref_input2.current를 평가하는 객체가 아닙니다. 도와주세요
DEEP ADHIYA

보다 완전한 코드 예제를 제공 할 수 있습니까?
Eli Johnson

2
createRef보다 기능 컴포넌트에서 useRef를 사용하는 것이 더 좋습니다.
hyuk lee

@ hyuklee 당신은 실제로 올바른 선생님입니다, 나는 업데이트했습니다 ... 헤드 업 주셔서 감사합니다! 건배!
Eli Johnson

최신 반응 업데이트를 유지하려는 사람들에게는 이것이 답변입니다.
Yokhen

13

반응 네이티브 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>
        )
    }
}

) : 당신은 내 생명을 구할
tokinonagare

1
당신은 단지 이름 ref을 바꿨 습니다 inputRef. 당신은 전체 커스텀 컴포넌트를 떨어 뜨릴 수 있고 두번째 코드 블록은 그대로 사용하는 것으로 되돌아갑니다.ref
Jason Tolliver

9

RN 0.50.3의 경우 다음과 같은 방법으로 가능합니다.

<TextInput 
  autoFocus={true} 
  onSubmitEditing={() => {this.PasswordInputRef._root.focus()}} 
/>

<TextInput ref={input => {this.PasswordInputRef = input}} />

이 내용이 표시되어야합니다 .PasswordInputRef. _root .focus ()


1
이는 '기본베이스'특정
Developia

8

tcomb-form-native내가 있는 그대로 사용 하면이 작업도 수행 할 수 있습니다. 요령은 다음과 같습니다. TextInput직접 소품을 설정하는 대신을 통해 수행합니다 options. 양식의 필드를 다음과 같이 참조 할 수 있습니다.

this.refs.form.getComponent('password').refs.input.focus()

따라서 최종 제품은 다음과 같습니다.

var t = require('tcomb-form-native');
var Form = t.form.Form;

var MyForm = t.struct({
  field1:     t.String,
  field2:     t.String,
});

var MyComponent = React.createClass({

  _getFormOptions () {
    return {
      fields: {
        field1: {
          returnKeyType: 'next',
          onSubmitEditing: () => {this.refs.form.getComponent('field2').refs.input.focus()},
        },
      },
    };
  },

  render () {

    var formOptions = this._getFormOptions();

    return (
      <View style={styles.container}>
        <Form ref="form" type={MyForm} options={formOptions}/>
      </View>
    );
  },
});

( https://github.com/gcanti/tcomb-form-native/issues/96 )에 아이디어를 게시 한 사람은 remcoanker입니다.


onSubmitEditing 함수를 어떻게 호출합니까? 예를 들어 : 사용자가 마지막 textinput의 returnkeytype 'done'을 누를 때 login () 함수를 호출하고 싶습니다.
chetan

7

이것이 내가 달성 한 방법입니다. 그리고 아래 예제는 React 16.3에서 소개 된 React.createRef () API를 사용했습니다.

class Test extends React.Component {
  constructor(props) {
    super(props);
    this.secondTextInputRef = React.createRef();
  }

  render() {
    return(
        <View>
            <TextInput
                placeholder = "FirstTextInput"
                returnKeyType="next"
                onSubmitEditing={() => { this.secondTextInputRef.current.focus(); }}
            />
            <TextInput
                ref={this.secondTextInputRef}
                placeholder = "secondTextInput"
            />
        </View>
    );
  }
}

나는 이것이 당신을 도울 것이라고 생각합니다.


.current의 목적은 무엇입니까?
Adam Katz

5

내 시나리오는 <CustomBoladonesTextInput /> RN <TextInput /> 줄 바꿈입니다. 입니다.

이 문제를 다음과 같이 해결했습니다.

내 양식은 다음과 같습니다

  <CustomBoladonesTextInput 
      onSubmitEditing={() => this.customInput2.refs.innerTextInput2.focus()}
      returnKeyType="next"
      ... />

  <CustomBoladonesTextInput 
       ref={ref => this.customInput2 = ref}
       refInner="innerTextInput2"
       ... />

CustomBoladonesTextInput의 컴포넌트 정의에서 refField를 다음과 같이 내부 참조 소품에 전달합니다.

   export default class CustomBoladonesTextInput extends React.Component {
      render() {        
         return (< TextInput ref={this.props.refInner} ... />);     
      } 
   }

그리고 짜잔. 모든 것이 다시 작동합니다. 도움이 되었기를 바랍니다


4

React Native의 GitHub 문제에서이 솔루션을 사용해보십시오.

https://github.com/facebook/react-native/pull/2149#issuecomment-129262565

TextInput 구성 요소에 ref 소품을 사용해야합니다.
그런 다음 onSubmitEditing prop에서 호출되어 두 번째 TextInput 참조로 초점을 이동시키는 함수를 작성해야합니다.

var InputScreen = React.createClass({
    _focusNextField(nextField) {
        this.refs[nextField].focus()
    },

    render: function() {
        return (
            <View style={styles.container}>
                <TextInput
                    ref='1'
                    style={styles.input}
                    placeholder='Normal'
                    returnKeyType='next'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('2')}
                />
                <TextInput
                    ref='2'
                    style={styles.input}
                    keyboardType='email-address'
                    placeholder='Email Address'
                    returnKeyType='next'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('3')}
                />
                <TextInput
                    ref='3'
                    style={styles.input}
                    keyboardType='url'
                    placeholder='URL'
                    returnKeyType='next'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('4')}
                />
                <TextInput
                    ref='4'
                    style={styles.input}
                    keyboardType='numeric'
                    placeholder='Numeric'
                    blurOnSubmit={false}
                    onSubmitEditing={() => this._focusNextField('5')}
                />
                <TextInput
                    ref='5'
                    style={styles.input}
                    keyboardType='numbers-and-punctuation'
                    placeholder='Numbers & Punctuation'
                    returnKeyType='done'
                />
            </View>
        );
    }
});

답변에 링크의 관련 정보를 포함하십시오.
Wes Foster

문자열 참조는 더 이상 사용되지 않을 수 있으므로이 솔루션은 나중에 작동하지 않을 수 있습니다. "... 문자열 참조는 더 이상 사용되지 않지만 레거시로 간주되며 향후 어느 시점에서 더 이상 사용되지 않을 것입니다. 선호합니다. " - facebook.github.io/react/docs/more-about-refs.html
유라

1
v0.36부터는 더 이상 작동하지 않습니다. 컴포넌트에는 "포커스"방법이 없습니다. 지금 어떻게해야합니까? 답변을 업데이트 할 수 있습니까?
Mitch

@Mitch 이것이 0.39.2로 돌아 왔는지 확실하지 않지만 지금은 잘 작동합니다.
Eldelshell

4

레거시 문자열 참조 대신 콜백 참조 사용 :

<TextInput
    style = {styles.titleInput}
    returnKeyType = {"next"}
    autoFocus = {true}
    placeholder = "Title"
    onSubmitEditing={() => {this.nextInput.focus()}}
/>
<TextInput
    style = {styles.descriptionInput}  
    multiline = {true}
    maxLength = {200}
    placeholder = "Description"
    ref={nextInput => this.nextInput = nextInput}
/>

1
포커스 방법이 TextInput에서 제거되었으므로 작동하지 않습니다.
Jacob Lauritzen

3
<TextInput 
    keyboardType="email-address"
    placeholder="Email"
    returnKeyType="next"
    ref="email"
    onSubmitEditing={() => this.focusTextInput(this.refs.password)}
    blurOnSubmit={false}
 />
<TextInput
    ref="password"
    placeholder="Password" 
    secureTextEntry={true} />

그리고 onSubmitEditing={() => this.focusTextInput(this.refs.password)}아래와 같이 메소드를 추가하십시오 :

private focusTextInput(node: any) {
    node.focus();
}

2

TextInput다른 구성 요소 내에있는 경우 허용 된 솔루션이 작동 하려면 참조를 ref상위 컨테이너 로 "팝핑"해야합니다 .

// MyComponent
render() {
    <View>
        <TextInput ref={(r) => this.props.onRef(r)} { ...this.props }/>
    </View>
}

// MyView
render() {
    <MyComponent onSubmitEditing={(evt) => this.myField2.focus()}/>
    <MyComponent onRef={(r) => this.myField2 = r}/>
}

1
안녕하세요 @Eldelshell, 같은 것을 달성하고 싶지만 샘플을 정렬 할 수 없습니다. 힌트를 주시겠습니까?
실 리앙

나는 이것이 정답이어야한다고 생각합니다. 나는 이것을 따르고 작동합니다.
David Cheung

둘 다 같은 파일에 있습니까?
MoralCode

2

귀하의 구성 요소에서 :

constructor(props) {
        super(props);
        this.focusNextField = this
            .focusNextField
            .bind(this);
        // to store our input refs
        this.inputs = {};
    }
    focusNextField(id) {
        console.log("focus next input: " + id);
        this
            .inputs[id]
            ._root
            .focus();
    }

참고 : NativeBase 'Library'Input의._root TextInput에 대한 참조이므로 사용 했습니다.

이 같은 텍스트 입력에서

<TextInput
         onSubmitEditing={() => {
                          this.focusNextField('two');
                          }}
         returnKeyType="next"
         blurOnSubmit={false}/>


<TextInput      
         ref={input => {
              this.inputs['two'] = input;
                        }}/>

2
<TextInput placeholder="Nombre"
    ref="1"
    editable={true}
    returnKeyType="next"
    underlineColorAndroid={'#4DB6AC'}
    blurOnSubmit={false}
    value={this.state.First_Name}
    onChangeText={First_Name => this.setState({ First_Name })}
    onSubmitEditing={() => this.focusNextField('2')}
    placeholderTextColor="#797a7a" style={{ marginBottom: 10, color: '#808080', fontSize: 15, width: '100%', }} />

<TextInput placeholder="Apellido"
    ref="2"
    editable={true}
    returnKeyType="next"
    underlineColorAndroid={'#4DB6AC'}
    blurOnSubmit={false}
    value={this.state.Last_Name}
    onChangeText={Last_Name => this.setState({ Last_Name })}
    onSubmitEditing={() => this.focusNextField('3')}
    placeholderTextColor="#797a7a" style={{ marginBottom: 10, color: '#808080', fontSize: 15, width: '100%', }} />

메소드 추가

focusNextField(nextField) {
    this.refs[nextField].focus();
}

매우 깔끔한 접근 방식.
Siraj Alam

1
이전 답변이지만 누구나 기능적 (상태 비 저장) 구성 요소 에서이 답변과 같은 모든 참조에 액세스 할 수 있는지 알고 있습니까?
더글러스 슈미트

1

을 캡처하는 방법이 있습니다에서TextInput . 해 키지 만 아무것도 아닌 것보다 낫습니다 .

onChangeText새 입력 값을 이전 값과 비교하여 a를 확인 하는 핸들러를 정의하십시오 \t. 발견 된 경우 @boredgames에 표시된대로 필드를 진행하십시오.

변수 username에 사용자 이름 값이 포함되어 있고 setUsername상점 (구성 요소 상태, redux 상점 등)에서 변경하기위한 조치를 전달 한다고 가정하면 다음과 같이하십시오.

function tabGuard (newValue, oldValue, callback, nextCallback) {
  if (newValue.indexOf('\t') >= 0 && oldValue.indexOf('\t') === -1) {
    callback(oldValue)
    nextCallback()
  } else {
    callback(newValue)
  }
}

class LoginScene {
  focusNextField = (nextField) => {
    this.refs[nextField].focus()
  }

  focusOnPassword = () => {
    this.focusNextField('password')
  }

  handleUsernameChange = (newValue) => {
    const { username } = this.props            // or from wherever
    const { setUsername } = this.props.actions // or from wherever

    tabGuard(newValue, username, setUsername, this.focusOnPassword)
  }

  render () {
    const { username } = this.props

    return (
      <TextInput ref='username'
                 placeholder='Username'
                 autoCapitalize='none'
                 autoCorrect={false}
                 autoFocus
                 keyboardType='email-address'
                 onChangeText={handleUsernameChange}
                 blurOnSubmit={false}
                 onSubmitEditing={focusOnPassword}
                 value={username} />
    )
  }
}

실제 키보드를 사용하면 작동하지 않았습니다. onChangeText 이벤트는 탭에서 실행되지 않습니다.
Bufke

0

여기에 : focus 속성을 가진 입력 구성 요소에 대한 시약 솔루션이 있습니다.

이 prop이 true로 설정되어 있으면 필드에 포커스가 설정되고 false가 아니면 포커스가 없습니다.

불행히도이 구성 요소에는 : ref가 정의되어 있어야하며 .focus ()를 호출하는 다른 방법을 찾을 수 없습니다. 나는 제안에 행복하다.

(defn focusable-input [init-attrs]
  (r/create-class
    {:display-name "focusable-input"
     :component-will-receive-props
       (fn [this new-argv]
         (let [ref-c (aget this "refs" (:ref init-attrs))
               focus (:focus (ru/extract-props new-argv))
               is-focused (.isFocused ref-c)]
           (if focus
             (when-not is-focused (.focus ref-c))
             (when is-focused (.blur ref-c)))))
     :reagent-render
       (fn [attrs]
         (let [init-focus (:focus init-attrs)
               auto-focus (or (:auto-focus attrs) init-focus)
               attrs (assoc attrs :auto-focus auto-focus)]
           [input attrs]))}))

https://gist.github.com/Knotschi/6f97efe89681ac149113ddec4c396cc5


@Bap-Clojurescript입니다. 시약은 반응에 대한 바인딩입니다. 궁금한 점이 있다면 상태 저장 업데이트가 일반적으로 유형 swap!에 대한 명시 적 호출과 같은 것만으로 가능하기 때문에 liact에 관심이 있다면 React와 매우 일치 atom합니다. 문서에 따라 React에 바인딩하는 데 사용됩니다. "아톰을 사용하는 모든 구성 요소는 값이 변경되면 자동으로 다시 렌더링됩니다." reagent-project.github.io

0

NativeBase를 UI 구성 요소로 사용하는 경우이 샘플을 사용할 수 있습니다

<Item floatingLabel>
    <Label>Title</Label>
    <Input
        returnKeyType = {"next"}
        autoFocus = {true}
        onSubmitEditing={(event) => {
            this._inputDesc._root.focus(); 
        }} />
</Item>
<Item floatingLabel>
    <Label>Description</Label>
    <Input
        getRef={(c) => this._inputDesc = c}
        multiline={true} style={{height: 100}} />
        onSubmitEditing={(event) => { this._inputLink._root.focus(); }} />
</Item>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.